Sfoglia il codice sorgente

Starting SeosNativePeripheral

Eric Betts 10 mesi fa
parent
commit
9870538b04

+ 12 - 2
scenes/seos_scene_ble_peripheral.c

@@ -12,8 +12,13 @@ void seos_scene_ble_peripheral_on_enter(void* context) {
     popup_set_header(popup, "Starting", 68, 20, AlignLeft, AlignTop);
     // popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61);
 
-    seos->seos_characteristic = seos_characteristic_alloc(seos);
-    seos_characteristic_start(seos->seos_characteristic, seos->flow_mode);
+    if(seos->has_external_ble) {
+        seos->seos_characteristic = seos_characteristic_alloc(seos);
+        seos_characteristic_start(seos->seos_characteristic, seos->flow_mode);
+    } else {
+        seos->native_peripheral = seos_native_peripheral_alloc(seos);
+        seos_native_peripheral_start(seos->native_peripheral, seos->flow_mode);
+    }
 
     seos_blink_start(seos);
 
@@ -70,6 +75,11 @@ void seos_scene_ble_peripheral_on_exit(void* context) {
         seos_characteristic_free(seos->seos_characteristic);
         seos->seos_characteristic = NULL;
     }
+    if(seos->native_peripheral) {
+        seos_native_peripheral_stop(seos->native_peripheral);
+        seos_native_peripheral_free(seos->native_peripheral);
+        seos->native_peripheral = NULL;
+    }
 
     // Clear view
     popup_reset(seos->popup);

+ 7 - 7
scenes/seos_scene_main_menu.c

@@ -26,13 +26,13 @@ void seos_scene_main_menu_on_enter(void* context) {
         submenu, "Saved", SubmenuIndexSaved, seos_scene_main_menu_submenu_callback, seos);
     submenu_add_item(
         submenu, "Read NFC", SubmenuIndexRead, seos_scene_main_menu_submenu_callback, seos);
-    if(seos->has_ble) {
-        submenu_add_item(
-            submenu,
-            "MainMenu BLE Reader",
-            SubmenuIndexBLEReader,
-            seos_scene_main_menu_submenu_callback,
-            seos);
+    submenu_add_item(
+        submenu,
+        "Start BLE Reader",
+        SubmenuIndexBLEReader,
+        seos_scene_main_menu_submenu_callback,
+        seos);
+    if(seos->has_external_ble) {
         submenu_add_item(
             submenu,
             "Scanners >",

+ 1 - 1
scenes/seos_scene_saved_menu.c

@@ -21,7 +21,7 @@ void seos_scene_saved_menu_on_enter(void* context) {
     submenu_add_item(
         submenu, "NFC Emulate", SubmenuIndexEmulate, seos_scene_saved_menu_submenu_callback, seos);
 
-    if(seos->has_ble) {
+    if(seos->has_external_ble) {
         submenu_add_item(
             submenu,
             "BLE Emulate Central",

+ 1 - 48
seos.c

@@ -4,30 +4,6 @@
 
 #define SEOS_KEYS_FILENAME "keys"
 
-static void seos_ble_connection_status_callback(BtStatus status, void* context) {
-    furi_assert(context);
-    Seos* seos = context;
-    FURI_LOG_D(TAG, "seos_ble_connection_status_callback %d", (status == BtStatusConnected));
-    if(status == BtStatusConnected) {
-        view_dispatcher_send_custom_event(seos->view_dispatcher, SeosCustomEventConnected);
-    }
-
-    /*
-    ble_hid->is_connected = (status == BtStatusConnected);
-    if(ble_hid->state_callback) {
-        ble_hid->state_callback(ble_hid->is_connected, ble_hid->callback_context);
-    }
-    */
-}
-
-static uint16_t seos_svc_callback(SeosServiceEvent event, void* context) {
-    FURI_LOG_D(TAG, "seos_svc_callback");
-    Seos* seos = context;
-    UNUSED(seos);
-    UNUSED(event);
-    return 0;
-}
-
 bool seos_load_keys(Seos* seos) {
     const char* file_header = "Seos keys";
     const uint32_t file_version = 1;
@@ -95,7 +71,7 @@ void seos_tick_event_callback(void* context) {
 Seos* seos_alloc() {
     Seos* seos = malloc(sizeof(Seos));
 
-    seos->has_ble = false;
+    seos->has_external_ble = false;
     furi_hal_power_enable_otg();
 
     seos->view_dispatcher = view_dispatcher_alloc();
@@ -154,18 +130,6 @@ Seos* seos_alloc() {
 
     seos->keys_loaded = seos_load_keys(seos);
 
-    seos->bt = furi_record_open(RECORD_BT);
-    bt_disconnect(seos->bt);
-
-    // Wait 2nd core to update nvm storage
-    furi_delay_ms(200);
-    seos->ble_profile = bt_profile_start(seos->bt, ble_profile_seos, NULL);
-    furi_check(seos->ble_profile);
-    bt_set_status_changed_callback(seos->bt, seos_ble_connection_status_callback, seos);
-    ble_profile_seos_set_event_callback(seos->ble_profile, 32, seos_svc_callback, seos);
-    UNUSED(seos_svc_callback);
-    furi_hal_bt_start_advertising();
-
     return seos;
 }
 
@@ -227,17 +191,6 @@ void seos_free(Seos* seos) {
         seos->seos_emulator = NULL;
     }
 
-    furi_hal_bt_stop_advertising();
-    bt_set_status_changed_callback(seos->bt, NULL, NULL);
-    bt_disconnect(seos->bt);
-
-    // Wait 2nd core to update nvm storage
-    furi_delay_ms(200);
-    bt_keys_storage_set_default_path(seos->bt);
-
-    furi_check(bt_profile_restore_default(seos->bt));
-    furi_record_close(RECORD_BT);
-
     free(seos);
 }
 

+ 3 - 4
seos_i.h

@@ -29,6 +29,7 @@
 #include "keys.h"
 #include "seos_hci.h"
 #include "seos_characteristic.h"
+#include "seos_native_peripheral.h"
 #include "seos_central.h"
 #include "seos_common.h"
 #include "seos_reader.h"
@@ -37,9 +38,6 @@
 #include "des_cmac.h"
 #include "aes_cmac.h"
 
-#include <bt/bt_service/bt.h>
-#include "seos_profile.h"
-
 #define SEOS_TEXT_STORE_SIZE 128
 
 enum SeosCustomEvent {
@@ -96,7 +94,7 @@ struct Seos {
     SeosReader* seos_reader;
 
     // BLE
-    bool has_ble;
+    bool has_external_ble;
     SeosCharacteristic* seos_characteristic;
     SeosCentral* seos_central;
     FlowMode flow_mode;
@@ -108,6 +106,7 @@ struct Seos {
     bool keys_loaded;
     Bt* bt;
     FuriHalBleProfileBase* ble_profile;
+    SeosNativePeripheral* native_peripheral;
 };
 
 typedef enum {

+ 72 - 0
seos_native_peripheral.c

@@ -0,0 +1,72 @@
+#include "seos_native_peripheral_i.h"
+
+#define TAG "SeosNativePeripheral"
+
+static void seos_ble_connection_status_callback(BtStatus status, void* context) {
+    furi_assert(context);
+    SeosNativePeripheral* seos_native_peripheral = context;
+    FURI_LOG_D(TAG, "seos_ble_connection_status_callback %d", (status == BtStatusConnected));
+    if(status == BtStatusConnected) {
+        view_dispatcher_send_custom_event(
+            seos_native_peripheral->seos->view_dispatcher, SeosCustomEventConnected);
+    } else if (status == BtStatusAdvertising) {
+        view_dispatcher_send_custom_event(
+            seos_native_peripheral->seos->view_dispatcher, SeosCustomEventAdvertising);
+    }
+}
+
+static uint16_t seos_svc_callback(SeosServiceEvent event, void* context) {
+    FURI_LOG_D(TAG, "seos_svc_callback");
+    SeosNativePeripheral* seos_native_peripheral = context;
+    UNUSED(seos_native_peripheral);
+    UNUSED(event);
+    return 0;
+}
+
+SeosNativePeripheral* seos_native_peripheral_alloc(Seos* seos) {
+    SeosNativePeripheral* seos_native_peripheral = malloc(sizeof(SeosNativePeripheral));
+    memset(seos_native_peripheral, 0, sizeof(SeosNativePeripheral));
+
+    seos_native_peripheral->seos = seos;
+    seos_native_peripheral->bt = furi_record_open(RECORD_BT);
+
+    return seos_native_peripheral;
+}
+
+void seos_native_peripheral_free(SeosNativePeripheral* seos_native_peripheral) {
+    furi_assert(seos_native_peripheral);
+
+    furi_record_close(RECORD_BT);
+
+    free(seos_native_peripheral);
+}
+
+void seos_native_peripheral_start(SeosNativePeripheral* seos_native_peripheral, FlowMode mode) {
+    UNUSED(mode);
+    bt_disconnect(seos_native_peripheral->bt);
+
+    // Wait 2nd core to update nvm storage
+    furi_delay_ms(200);
+    seos_native_peripheral->ble_profile =
+        bt_profile_start(seos_native_peripheral->bt, ble_profile_seos, NULL);
+    furi_check(seos_native_peripheral->ble_profile);
+    bt_set_status_changed_callback(
+        seos_native_peripheral->bt, seos_ble_connection_status_callback, seos_native_peripheral);
+    ble_profile_seos_set_event_callback(
+        seos_native_peripheral->ble_profile, 32, seos_svc_callback, seos_native_peripheral);
+    furi_hal_bt_start_advertising();
+    view_dispatcher_send_custom_event(
+        seos_native_peripheral->seos->view_dispatcher, SeosCustomEventAdvertising);
+}
+
+void seos_native_peripheral_stop(SeosNativePeripheral* seos_native_peripheral) {
+    furi_hal_bt_stop_advertising();
+    bt_set_status_changed_callback(seos_native_peripheral->bt, NULL, NULL);
+    bt_disconnect(seos_native_peripheral->bt);
+
+    // Wait 2nd core to update nvm storage
+    furi_delay_ms(200);
+    bt_keys_storage_set_default_path(seos_native_peripheral->bt);
+
+    furi_check(bt_profile_restore_default(seos_native_peripheral->bt));
+}

+ 18 - 0
seos_native_peripheral.h

@@ -0,0 +1,18 @@
+#pragma once
+
+#include <bt/bt_service/bt.h>
+#include "seos_profile.h"
+
+typedef struct {
+    Seos* seos;
+
+    Bt* bt;
+    FuriHalBleProfileBase* ble_profile;
+} SeosNativePeripheral;
+
+SeosNativePeripheral* seos_native_peripheral_alloc(Seos* seos);
+
+void seos_native_peripheral_free(SeosNativePeripheral* seos_native_peripheral);
+
+void seos_native_peripheral_start(SeosNativePeripheral* seos_native_peripheral, FlowMode mode);
+void seos_native_peripheral_stop(SeosNativePeripheral* seos_native_peripheral);

+ 4 - 0
seos_native_peripheral_i.h

@@ -0,0 +1,4 @@
+#pragma once
+
+#include "seos_i.h"
+#include "seos_native_peripheral.h"