Compare commits

..
13 Commits
Author SHA1 Message Date
rizky_denianto d0843a9518 Merge pull request 'Menghapus if dari penerbitan' (#13) from pengembangan into main
Penerbitan Plugin / persiapan (push) Has been skipped
Penerbitan Plugin / penerbitan (push) Has been skipped
Reviewed-on: #13
2026-07-16 21:41:01 +07:00
rizky_denianto f40b309886 Merge pull request 'Menambah langkah penerbitan paket' (#12) from pengembangan into main
Penerbitan Plugin / persiapan (push) Has been skipped
Penerbitan Plugin / penerbitan (push) Has been skipped
Reviewed-on: #12
2026-07-16 21:25:25 +07:00
rizky_denianto 830a2e908a Merge pull request 'Pembaruan paket' (#11) from pengembangan into main
Reviewed-on: #11
2026-07-16 20:11:11 +07:00
rizky_denianto e77cb835eb Merge pull request 'Mengubah izin default' (#10) from pengembangan into main
Reviewed-on: #10
2026-07-16 19:50:46 +07:00
rizky_denianto bb116775c4 Merge pull request 'Menyesuaikan guest-js' (#9) from pengembangan into main
Reviewed-on: #9
2026-07-16 19:38:36 +07:00
rizky_denianto 424c0f7049 Merge pull request 'Menambah izin per perintah atau per fungsi' (#8) from pengembangan into main
Reviewed-on: #8
2026-07-16 00:32:32 +07:00
rizky_denianto 8bdb1fcd27 Merge pull request 'Menambah fungsi cek dan minta izin' (#7) from pengembangan into main
Reviewed-on: #7
2026-07-15 23:46:50 +07:00
rizky_denianto 6e1eb9b9a5 Merge pull request 'Pembaruan peti' (#6) from pengembangan into main
Reviewed-on: #6
2026-05-18 19:00:41 +07:00
rizky_denianto bc3ac09f0c Merge pull request 'Memperbaiki program kirim data' (#5) from pengembangan into main
Reviewed-on: #5
2026-04-15 01:39:24 +07:00
rizky_denianto df87a5e811 Merge pull request 'Memperbaiki penamaan struktur' (#4) from pengembangan into main
Reviewed-on: #4
2026-04-14 23:37:59 +07:00
rizky_denianto 62e1a286a7 Merge pull request 'Mengubah daftar respon dari map ke jsarray' (#3) from pengembangan into main
Reviewed-on: #3
2026-04-14 23:26:00 +07:00
rizky_denianto 43ad1645b2 Merge pull request 'Menyesuaikan nama kelas dengan plugin' (#2) from pengembangan into main
Reviewed-on: #2
2026-04-14 19:36:01 +07:00
rizky_denianto da50a0f466 Merge pull request 'Membuat program android untuk menghubungkan tauri dengan perangkat bluetooth classic' (#1) from pengembangan into main
Reviewed-on: #1
2026-04-14 19:05:15 +07:00
23 changed files with 167 additions and 205 deletions

No files matched your search

-5
View File
@@ -1,5 +0,0 @@
[registry]
default = "gitea"
[registries.gitea]
index = "sparse+https://git.segubi.com/api/packages/segubi/cargo/"
@@ -1,12 +1,15 @@
name: Penerbitan Plugin name: Penerbitan Plugin
on: on:
push:
branches: ["main"]
pull_request: pull_request:
branches: ["main"] branches: ["main"]
types: ["opened", "synchronize"] types: ["opened", "synchronize"]
jobs: jobs:
persiapan: persiapan:
if: "!contains(gitea.event.head_commit.message, 'Merge pull request')"
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs: outputs:
organisasi: ${{ steps.var.outputs.organisasi }} organisasi: ${{ steps.var.outputs.organisasi }}
@@ -21,47 +24,19 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: persiapan needs: persiapan
steps: steps:
- name: Unduh paket untuk membangun citra
run: |
apt update -y
sudo apt install -y libwebkit2gtk-4.1-dev \
build-essential \
curl \
wget \
file \
libxdo-dev \
libssl-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libudev-dev
apt clean -y
- name: Unduh program - name: Unduh program
uses: actions/checkout@v7 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Unduh Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
rustflags: "-A warnings"
- name: Penerbitan peti Cargo
run: |
cargo publish
env:
CARGO_REGISTRIES_GITEA_TOKEN: Bearer ${{ secrets.KUNCI_PENERBITAN }}
- name: Unduh pnpm - name: Unduh pnpm
uses: pnpm/setup@v2 uses: pnpm/action-setup@v6
with: with:
version: 11 version: 10
- name: Penerbitan paket NPM - name: Unggah program
run: | run: |
pnpm i pnpm i
npm config set @${{ needs.persiapan.outputs.organisasi }}:registry=https://${{ vars.ALAMAT_GITEA }}/api/packages/${{ needs.persiapan.outputs.organisasi }}/npm/ npm config set @${{ needs.persiapan.outputs.organisasi }}:registry=https://${{ vars.ALAMAT_GITEA }}/api/packages/${{ needs.persiapan.outputs.organisasi }}/npm/
npm config set -- '//${{ vars.ALAMAT_GITEA }}/api/packages/${{ needs.persiapan.outputs.organisasi }}/npm/:_authToken' "${{ secrets.KUNCI_PENERBITAN }}" npm config set -- '//${{ vars.ALAMAT_GITEA }}/api/packages/${{ needs.persiapan.outputs.organisasi }}/npm/:_authToken' "${{ secrets.KUNCI_PENERBITAN }}"
npm publish npm publish
rm -rf pnpm-lock.yaml .pnpm-store/
+3 -11
View File
@@ -1,10 +1,10 @@
[package] [package]
name = "tauri-plugin-bluclas" name = "tauri-plugin-bluclas"
version = "0.1.23" version = "0.1.0"
authors = [ "Rizky Denianto" ] authors = [ "Rizky Denianto" ]
description = "Program sederhana untuk interaksi dengan bluetooth classic" description = ""
edition = "2024" edition = "2024"
rust-version = "1.98.0" rust-version = "1.94.1"
exclude = ["/examples", "/dist-js", "/guest-js", "/node_modules"] exclude = ["/examples", "/dist-js", "/guest-js", "/node_modules"]
links = "tauri-plugin-bluclas" links = "tauri-plugin-bluclas"
@@ -17,18 +17,10 @@ incremental = false
strip = "symbols" strip = "symbols"
debug = false debug = false
[package.metadata.platforms.support]
windows = { level = "full" }
linux = { level = "full" }
macos = { level = "none" }
android = { level = "full" }
ios = { level = "none" }
[dependencies] [dependencies]
tauri = { version = "2.11.5" } tauri = { version = "2.11.5" }
serde = "1.0" serde = "1.0"
thiserror = "2" thiserror = "2"
serialport = "4.10.1"
[build-dependencies] [build-dependencies]
tauri-plugin = { version = "2.6.3", features = ["build"] } tauri-plugin = { version = "2.6.3", features = ["build"] }
-2
View File
@@ -1,3 +1 @@
# Tauri Plugin bluclas # Tauri Plugin bluclas
Program sederhana untuk interaksi dengan bluetooth classic
-2
View File
@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
+18 -23
View File
@@ -37,11 +37,11 @@ class KirimArgs {
] ]
) )
class BluclasPlugin(private val activity: Activity) : Plugin(activity) { class BluclasPlugin(private val activity: Activity) : Plugin(activity) {
private val uuid: UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB") private val uuidSpp: UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")
private val bluetoothAdapter: BluetoothAdapter? = this.activity.getSystemService(BluetoothManager::class.java).getAdapter() private val adapter: BluetoothAdapter? = this.activity.getSystemService(BluetoothManager::class.java).getAdapter()
private var bluetoothSocket: BluetoothSocket? = null private var soket: BluetoothSocket? = null
private var outputStream: OutputStream? = null private var keluaran: OutputStream? = null
@Command @Command
override fun checkPermissions(invoke: Invoke) { override fun checkPermissions(invoke: Invoke) {
@@ -55,13 +55,13 @@ class BluclasPlugin(private val activity: Activity) : Plugin(activity) {
@Command @Command
fun daftarPerangkat(invoke: Invoke) { fun daftarPerangkat(invoke: Invoke) {
if (bluetoothAdapter == null) { if (adapter == null) {
invoke.reject("Bluetooth tidak didukung") invoke.reject("Bluetooth tidak didukung")
return return
} }
val daftarRes = JSArray() val daftarRes = JSArray()
bluetoothAdapter.bondedDevices.map { i -> adapter.bondedDevices.map { i ->
val res = JSObject() val res = JSObject()
res.put("nama", i.name ?: "Unknown") res.put("nama", i.name ?: "Unknown")
res.put("alamat", i.address) res.put("alamat", i.address)
@@ -74,37 +74,32 @@ class BluclasPlugin(private val activity: Activity) : Plugin(activity) {
} }
fun menghubungkanKoneksi(alamat: String) { fun menghubungkanKoneksi(alamat: String) {
val bluetoothDevice: BluetoothDevice = bluetoothAdapter!!.getRemoteDevice(alamat) val perangkat: BluetoothDevice = adapter!!.getRemoteDevice(alamat)
bluetoothSocket = bluetoothDevice.createInsecureRfcommSocketToServiceRecord(uuid) soket = perangkat.createInsecureRfcommSocketToServiceRecord(uuidSpp)
bluetoothSocket!!.connect() soket!!.connect()
outputStream = bluetoothSocket!!.outputStream keluaran = soket!!.outputStream
} }
fun memutusKoneksi() { fun memutusKoneksi() {
outputStream?.close() keluaran?.close()
outputStream = null keluaran = null
bluetoothSocket?.close() soket?.close()
bluetoothSocket = null soket = null
} }
@Command @Command
fun kirim(invoke: Invoke) { fun kirim(invoke: Invoke) {
val args = invoke.parseArgs(KirimArgs::class.java) val args = invoke.parseArgs(KirimArgs::class.java)
val alamat = args.alamat
if (alamat.isNullOrEmpty()) {
invoke.resolve()
return
}
try { try {
menghubungkanKoneksi(alamat) menghubungkanKoneksi(args.alamat ?: "")
if (outputStream == null) { if (keluaran == null) {
throw Exception("Tidak ada perangkat yang terhubung") throw Exception("Tidak ada perangkat yang terhubung")
} }
outputStream!!.write(args.data) keluaran!!.write(args.data)
outputStream!!.flush() keluaran!!.flush()
} catch (e: Exception) { } catch (e: Exception) {
memutusKoneksi() memutusKoneksi()
+1 -6
View File
@@ -1,9 +1,4 @@
const COMMANDS: &[&str] = &[ const COMMANDS: &[&str] = &["cek_izin", "minta_izin", "daftar_perangkat", "kirim"];
"check_permissions",
"request_permissions",
"daftar_perangkat",
"kirim",
];
fn main() { fn main() {
tauri_plugin::Builder::new(COMMANDS) tauri_plugin::Builder::new(COMMANDS)
+17 -33
View File
@@ -1,42 +1,26 @@
import { import { invoke } from "@tauri-apps/api/core";
checkPermissions as checkPermissions_, import { SBlueclasMuatanKirim, SBlueclasResponDaftarPerangkat } from "./models";
invoke,
PermissionState,
requestPermissions as requestPermissions_,
} from "@tauri-apps/api/core";
export async function checkPermissions(): Promise<PermissionState> { export async function cekIzin(): Promise<string> {
return await checkPermissions_<{ bluetooth: PermissionState }>( return await invoke<string>("plugin:bluclas|cek_izin").then((res: string) => res);
"bluclas",
).then((e) => e.bluetooth);
} }
export async function requestPermissions(): Promise<PermissionState> { export async function mintaIzin(): Promise<null> {
return await requestPermissions_<{ bluetooth: PermissionState }>( return await invoke<null>("plugin:bluclas|minta_izin");
"bluclas",
).then((e) => e.bluetooth);
} }
export type SDaftarPerangkatBlueclasResponDaftarPerangkat = { export async function daftarPerangkat(): Promise<
nama: string; SBlueclasResponDaftarPerangkat[]
alamat: string; > {
}; return await invoke<SBlueclasResponDaftarPerangkat[]>(
export type SBlueclasResponDaftarPerangkat = {
data: SDaftarPerangkatBlueclasResponDaftarPerangkat[];
};
export async function daftarPerangkat(): Promise<SBlueclasResponDaftarPerangkat> {
return await invoke<SBlueclasResponDaftarPerangkat>(
"plugin:bluclas|daftar_perangkat", "plugin:bluclas|daftar_perangkat",
).then((res: SBlueclasResponDaftarPerangkat) => res); ).then((res: SBlueclasResponDaftarPerangkat[]) => res);
} }
export type SBlueclasMuatanKirim = { export async function kirim(value: SBlueclasMuatanKirim): Promise<null> {
alamat: string; return await invoke<null>("plugin:bluclas|kirim", {
data: number[]; payload: {
}; value,
},
export async function kirim(muatan: SBlueclasMuatanKirim): Promise<null> { });
return await invoke<null>("plugin:bluclas|kirim", { muatan: muatan });
} }
+13
View File
@@ -0,0 +1,13 @@
type SDaftarPerangkatBlueclasResponDaftarPerangkat = {
nama: string,
alamat: string
}
export type SBlueclasResponDaftarPerangkat = {
data: SDaftarPerangkatBlueclasResponDaftarPerangkat[]
}
export type SBlueclasMuatanKirim = {
alamat: string,
data: number[],
};
+4 -4
View File
@@ -1,8 +1,8 @@
{ {
"name": "@segubi/tauri-plugin-bluclas-api", "name": "@segubi/tauri-plugin-bluclas-api",
"version": "0.1.23", "version": "0.1.1",
"author": "Rizky Denianto", "author": "Rizky Denianto",
"description": "Program sederhana untuk interaksi dengan bluetooth classic", "description": "",
"type": "module", "type": "module",
"types": "./dist-js/index.d.ts", "types": "./dist-js/index.d.ts",
"main": "./dist-js/index.cjs", "main": "./dist-js/index.cjs",
@@ -26,8 +26,8 @@
}, },
"devDependencies": { "devDependencies": {
"@rollup/plugin-typescript": "^12.3.0", "@rollup/plugin-typescript": "^12.3.0",
"rollup": "^4.63.2", "rollup": "^4.62.2",
"typescript": "^6.0.3", "typescript": "^5.9.3",
"tslib": "^2.8.1" "tslib": "^2.8.1"
} }
} }
@@ -0,0 +1,13 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-cek-izin"
description = "Enables the cek_izin command without any pre-configured scope."
commands.allow = ["cek_izin"]
[[permission]]
identifier = "deny-cek-izin"
description = "Denies the cek_izin command without any pre-configured scope."
commands.deny = ["cek_izin"]
@@ -1,13 +0,0 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-check-permissions"
description = "Enables the check_permissions command without any pre-configured scope."
commands.allow = ["check_permissions"]
[[permission]]
identifier = "deny-check-permissions"
description = "Denies the check_permissions command without any pre-configured scope."
commands.deny = ["check_permissions"]
@@ -0,0 +1,13 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-minta-izin"
description = "Enables the minta_izin command without any pre-configured scope."
commands.allow = ["minta_izin"]
[[permission]]
identifier = "deny-minta-izin"
description = "Denies the minta_izin command without any pre-configured scope."
commands.deny = ["minta_izin"]
@@ -1,13 +0,0 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-request-permissions"
description = "Enables the request_permissions command without any pre-configured scope."
commands.allow = ["request_permissions"]
[[permission]]
identifier = "deny-request-permissions"
description = "Denies the request_permissions command without any pre-configured scope."
commands.deny = ["request_permissions"]
+10 -10
View File
@@ -4,8 +4,8 @@ Default permissions for the plugin
#### This default permission set includes the following: #### This default permission set includes the following:
- `allow-check-permissions` - `allow-cek-izin`
- `allow-request-permissions` - `allow-minta-izin`
- `allow-daftar-perangkat` - `allow-daftar-perangkat`
- `allow-kirim` - `allow-kirim`
@@ -21,12 +21,12 @@ Default permissions for the plugin
<tr> <tr>
<td> <td>
`bluclas:allow-check-permissions` `bluclas:allow-cek-izin`
</td> </td>
<td> <td>
Enables the check_permissions command without any pre-configured scope. Enables the cek_izin command without any pre-configured scope.
</td> </td>
</tr> </tr>
@@ -34,12 +34,12 @@ Enables the check_permissions command without any pre-configured scope.
<tr> <tr>
<td> <td>
`bluclas:deny-check-permissions` `bluclas:deny-cek-izin`
</td> </td>
<td> <td>
Denies the check_permissions command without any pre-configured scope. Denies the cek_izin command without any pre-configured scope.
</td> </td>
</tr> </tr>
@@ -99,12 +99,12 @@ Denies the kirim command without any pre-configured scope.
<tr> <tr>
<td> <td>
`bluclas:allow-request-permissions` `bluclas:allow-minta-izin`
</td> </td>
<td> <td>
Enables the request_permissions command without any pre-configured scope. Enables the minta_izin command without any pre-configured scope.
</td> </td>
</tr> </tr>
@@ -112,12 +112,12 @@ Enables the request_permissions command without any pre-configured scope.
<tr> <tr>
<td> <td>
`bluclas:deny-request-permissions` `bluclas:deny-minta-izin`
</td> </td>
<td> <td>
Denies the request_permissions command without any pre-configured scope. Denies the minta_izin command without any pre-configured scope.
</td> </td>
</tr> </tr>
+2 -2
View File
@@ -1,8 +1,8 @@
[default] [default]
description = "Default permissions for the plugin" description = "Default permissions for the plugin"
permissions = [ permissions = [
"allow-check-permissions", "allow-cek-izin",
"allow-request-permissions", "allow-minta-izin",
"allow-daftar-perangkat", "allow-daftar-perangkat",
"allow-kirim" "allow-kirim"
] ]
+14 -14
View File
@@ -295,16 +295,16 @@
"type": "string", "type": "string",
"oneOf": [ "oneOf": [
{ {
"description": "Enables the check_permissions command without any pre-configured scope.", "description": "Enables the cek_izin command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "allow-check-permissions", "const": "allow-cek-izin",
"markdownDescription": "Enables the check_permissions command without any pre-configured scope." "markdownDescription": "Enables the cek_izin command without any pre-configured scope."
}, },
{ {
"description": "Denies the check_permissions command without any pre-configured scope.", "description": "Denies the cek_izin command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "deny-check-permissions", "const": "deny-cek-izin",
"markdownDescription": "Denies the check_permissions command without any pre-configured scope." "markdownDescription": "Denies the cek_izin command without any pre-configured scope."
}, },
{ {
"description": "Enables the daftar_perangkat command without any pre-configured scope.", "description": "Enables the daftar_perangkat command without any pre-configured scope.",
@@ -331,22 +331,22 @@
"markdownDescription": "Denies the kirim command without any pre-configured scope." "markdownDescription": "Denies the kirim command without any pre-configured scope."
}, },
{ {
"description": "Enables the request_permissions command without any pre-configured scope.", "description": "Enables the minta_izin command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "allow-request-permissions", "const": "allow-minta-izin",
"markdownDescription": "Enables the request_permissions command without any pre-configured scope." "markdownDescription": "Enables the minta_izin command without any pre-configured scope."
}, },
{ {
"description": "Denies the request_permissions command without any pre-configured scope.", "description": "Denies the minta_izin command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "deny-request-permissions", "const": "deny-minta-izin",
"markdownDescription": "Denies the request_permissions command without any pre-configured scope." "markdownDescription": "Denies the minta_izin command without any pre-configured scope."
}, },
{ {
"description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-check-permissions`\n- `allow-request-permissions`\n- `allow-daftar-perangkat`\n- `allow-kirim`", "description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-cek-izin`\n- `allow-minta-izin`\n- `allow-daftar-perangkat`\n- `allow-kirim`",
"type": "string", "type": "string",
"const": "default", "const": "default",
"markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-check-permissions`\n- `allow-request-permissions`\n- `allow-daftar-perangkat`\n- `allow-kirim`" "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-cek-izin`\n- `allow-minta-izin`\n- `allow-daftar-perangkat`\n- `allow-kirim`"
} }
] ]
} }
+1 -2
View File
@@ -20,8 +20,7 @@ export default {
plugins: [ plugins: [
typescript({ typescript({
declaration: true, declaration: true,
declarationDir: dirname(pkg.exports.import), declarationDir: dirname(pkg.exports.import)
rootDir: 'guest-js'
}) })
], ],
external: [ external: [
+12 -2
View File
@@ -4,6 +4,16 @@ use crate::BluclasExt;
use crate::Result; use crate::Result;
use crate::models::*; use crate::models::*;
#[command]
pub(crate) async fn cek_izin<R: Runtime>(app: AppHandle<R>) -> Result<String> {
return app.bluclas().cek_izin();
}
#[command]
pub(crate) async fn minta_izin<R: Runtime>(app: AppHandle<R>) -> Result<()> {
return app.bluclas().minta_izin();
}
#[command] #[command]
pub(crate) async fn daftar_perangkat<R: Runtime>( pub(crate) async fn daftar_perangkat<R: Runtime>(
app: AppHandle<R>, app: AppHandle<R>,
@@ -14,7 +24,7 @@ pub(crate) async fn daftar_perangkat<R: Runtime>(
#[command] #[command]
pub(crate) async fn kirim<R: Runtime>( pub(crate) async fn kirim<R: Runtime>(
app: AppHandle<R>, app: AppHandle<R>,
muatan: SBlueclasMuatanKirim, payload: SBlueclasMuatanKirim,
) -> Result<()> { ) -> Result<()> {
return app.bluclas().kirim(muatan); return app.bluclas().kirim(payload);
} }
+11 -23
View File
@@ -1,5 +1,3 @@
use std::{mem, time::Duration};
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
use tauri::{AppHandle, Runtime, plugin::PluginApi}; use tauri::{AppHandle, Runtime, plugin::PluginApi};
@@ -16,29 +14,19 @@ pub fn init<R: Runtime, C: DeserializeOwned>(
pub struct Bluclas<R: Runtime>(AppHandle<R>); pub struct Bluclas<R: Runtime>(AppHandle<R>);
impl<R: Runtime> Bluclas<R> { impl<R: Runtime> Bluclas<R> {
pub fn daftar_perangkat(&self) -> crate::Result<SBlueclasResponDaftarPerangkat> { pub fn cek_izin(&self) -> crate::Result<String> {
let port = serialport::available_ports().unwrap_or(Vec::new()); return Ok(String::new());
let mut daftar_res: Vec<SDaftarPerangkatBlueclasResponDaftarPerangkat> = Vec::new();
for i in port {
let res = SDaftarPerangkatBlueclasResponDaftarPerangkat {
nama: i.port_name.clone(),
alamat: i.port_name,
};
daftar_res.push(res);
}
return Ok(SBlueclasResponDaftarPerangkat { data: daftar_res });
} }
pub fn kirim(&self, muatan: SBlueclasMuatanKirim) -> crate::Result<()> { pub fn minta_izin(&self) -> crate::Result<()> {
let mut pencetak = match serialport::new(&muatan.alamat, 9600) return Ok(());
.timeout(Duration::from_secs(4)) }
.open()
{ pub fn daftar_perangkat(&self) -> crate::Result<SBlueclasResponDaftarPerangkat> {
Ok(it) => it, return Ok(SBlueclasResponDaftarPerangkat { data: vec![] });
Err(_) => return Ok(()), }
};
pencetak.write(&muatan.data).unwrap(); pub fn kirim(&self, _: SBlueclasMuatanKirim) -> crate::Result<()> {
mem::drop(pencetak);
return Ok(()); return Ok(());
} }
} }
+9 -3
View File
@@ -1,8 +1,11 @@
use crate::commands::{cek_izin, daftar_perangkat, kirim, minta_izin};
use tauri::{ use tauri::{
Manager, Runtime, Manager, Runtime,
plugin::{Builder, TauriPlugin}, plugin::{Builder, TauriPlugin},
}; };
pub use models::*;
#[cfg(desktop)] #[cfg(desktop)]
mod desktop; mod desktop;
#[cfg(mobile)] #[cfg(mobile)]
@@ -19,8 +22,6 @@ use desktop::Bluclas;
#[cfg(mobile)] #[cfg(mobile)]
use mobile::Bluclas; use mobile::Bluclas;
use crate::commands::{daftar_perangkat, kirim};
/// Extensions to [`tauri::App`], [`tauri::AppHandle`] and [`tauri::Window`] to access the bluclas APIs. /// Extensions to [`tauri::App`], [`tauri::AppHandle`] and [`tauri::Window`] to access the bluclas APIs.
pub trait BluclasExt<R: Runtime> { pub trait BluclasExt<R: Runtime> {
fn bluclas(&self) -> &Bluclas<R>; fn bluclas(&self) -> &Bluclas<R>;
@@ -35,7 +36,12 @@ impl<R: Runtime, T: Manager<R>> crate::BluclasExt<R> for T {
/// Initializes the plugin. /// Initializes the plugin.
pub fn init<R: Runtime>() -> TauriPlugin<R> { pub fn init<R: Runtime>() -> TauriPlugin<R> {
Builder::new("bluclas") Builder::new("bluclas")
.invoke_handler(tauri::generate_handler![daftar_perangkat, kirim]) .invoke_handler(tauri::generate_handler![
cek_izin,
minta_izin,
daftar_perangkat,
kirim
])
.setup(|app, api| { .setup(|app, api| {
#[cfg(mobile)] #[cfg(mobile)]
let bluclas = mobile::init(app, api)?; let bluclas = mobile::init(app, api)?;
+16 -2
View File
@@ -25,6 +25,20 @@ pub fn init<R: Runtime, C: DeserializeOwned>(
pub struct Bluclas<R: Runtime>(PluginHandle<R>); pub struct Bluclas<R: Runtime>(PluginHandle<R>);
impl<R: Runtime> Bluclas<R> { impl<R: Runtime> Bluclas<R> {
pub fn cek_izin(&self) -> crate::Result<String> {
return self
.0
.run_mobile_plugin("checkPermissions", ())
.map_err(Into::into);
}
pub fn minta_izin(&self) -> crate::Result<()> {
return self
.0
.run_mobile_plugin("requestPermissions", ())
.map_err(Into::into);
}
pub fn daftar_perangkat(&self) -> crate::Result<SBlueclasResponDaftarPerangkat> { pub fn daftar_perangkat(&self) -> crate::Result<SBlueclasResponDaftarPerangkat> {
return self return self
.0 .0
@@ -32,10 +46,10 @@ impl<R: Runtime> Bluclas<R> {
.map_err(Into::into); .map_err(Into::into);
} }
pub fn kirim(&self, muatan: SBlueclasMuatanKirim) -> crate::Result<()> { pub fn kirim(&self, payload: SBlueclasMuatanKirim) -> crate::Result<()> {
return self return self
.0 .0
.run_mobile_plugin("kirim", muatan) .run_mobile_plugin("kirim", payload)
.map_err(Into::into); .map_err(Into::into);
} }
} }
+3 -3
View File
@@ -1,19 +1,19 @@
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)] #[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct SDaftarPerangkatBlueclasResponDaftarPerangkat { pub struct SDaftarPerangkatBlueclasResponDaftarPerangkat {
pub nama: String, pub nama: String,
pub alamat: String, pub alamat: String,
} }
#[derive(Deserialize, Serialize)] #[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct SBlueclasResponDaftarPerangkat { pub struct SBlueclasResponDaftarPerangkat {
pub data: Vec<SDaftarPerangkatBlueclasResponDaftarPerangkat>, pub data: Vec<SDaftarPerangkatBlueclasResponDaftarPerangkat>,
} }
#[derive(Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct SBlueclasMuatanKirim { pub struct SBlueclasMuatanKirim {
pub alamat: String, pub alamat: String,