Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgornekich <n.gorbadey@gmail.com>2021-10-21 19:27:58 +0300
committerGitHub <noreply@github.com>2021-10-21 19:27:58 +0300
commitc2535f426974bc19a291151929968ced9b0808df (patch)
treefef5ae558dd9616bae15160b44e847242c3a2e16 /applications/bt
parent827d99dde3a73474d39aa4d51190a83f705ecc31 (diff)
[FL-1937] Bluetooth new assets (#774)
* assets: add new ble assets * bt: update pairing screen with new icon * bt: add bt status and update status bar * bt: update statusbar width from thread * Icons: new BT icon Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
Diffstat (limited to 'applications/bt')
-rwxr-xr-xapplications/bt/bt_service/bt.c54
-rw-r--r--applications/bt/bt_service/bt_i.h7
2 files changed, 49 insertions, 12 deletions
diff --git a/applications/bt/bt_service/bt.c b/applications/bt/bt_service/bt.c
index 4fae0cf6..b85139fd 100755
--- a/applications/bt/bt_service/bt.c
+++ b/applications/bt/bt_service/bt.c
@@ -4,13 +4,20 @@
#define BT_SERVICE_TAG "BT"
static void bt_draw_statusbar_callback(Canvas* canvas, void* context) {
- canvas_draw_icon(canvas, 0, 0, &I_Bluetooth_5x8);
+ furi_assert(context);
+
+ Bt* bt = context;
+ if(bt->status == BtStatusAdvertising) {
+ canvas_draw_icon(canvas, 0, 0, &I_Bluetooth_5x8);
+ } else if(bt->status == BtStatusConnected) {
+ canvas_draw_icon(canvas, 0, 0, &I_BT_Pair_9x8);
+ }
}
-static ViewPort* bt_statusbar_view_port_alloc() {
+static ViewPort* bt_statusbar_view_port_alloc(Bt* bt) {
ViewPort* statusbar_view_port = view_port_alloc();
view_port_set_width(statusbar_view_port, 5);
- view_port_draw_callback_set(statusbar_view_port, bt_draw_statusbar_callback, NULL);
+ view_port_draw_callback_set(statusbar_view_port, bt_draw_statusbar_callback, bt);
view_port_enabled_set(statusbar_view_port, false);
return statusbar_view_port;
}
@@ -18,10 +25,11 @@ static ViewPort* bt_statusbar_view_port_alloc() {
static void bt_pin_code_show_event_handler(Bt* bt, uint32_t pin) {
furi_assert(bt);
string_t pin_str;
- string_init_printf(pin_str, "%06d", pin);
+ dialog_message_set_icon(bt->dialog_message, &I_BLE_Pairing_128x64, 0, 0);
+ string_init_printf(pin_str, "Pairing code\n%06d", pin);
dialog_message_set_text(
- bt->dialog_message, string_get_cstr(pin_str), 64, 32, AlignCenter, AlignCenter);
- dialog_message_set_buttons(bt->dialog_message, "Back", NULL, NULL);
+ bt->dialog_message, string_get_cstr(pin_str), 64, 4, AlignCenter, AlignTop);
+ dialog_message_set_buttons(bt->dialog_message, "Quit", NULL, NULL);
dialog_message_show(bt->dialogs, bt->dialog_message);
string_clear(pin_str);
}
@@ -50,7 +58,7 @@ Bt* bt_alloc() {
bt->message_queue = osMessageQueueNew(8, sizeof(BtMessage), NULL);
// Setup statusbar view port
- bt->statusbar_view_port = bt_statusbar_view_port_alloc();
+ bt->statusbar_view_port = bt_statusbar_view_port_alloc(bt);
// Gui
bt->gui = furi_record_open("gui");
gui_add_view_port(bt->gui, bt->statusbar_view_port, GuiLayerStatusBarLeft);
@@ -115,6 +123,11 @@ static void bt_on_gap_event_callback(BleEvent event, void* context) {
Bt* bt = context;
if(event.type == BleEventTypeConnected) {
+ // Update status bar
+ bt->status = BtStatusConnected;
+ BtMessage message = {.type = BtMessageTypeUpdateStatusbar};
+ furi_check(osMessageQueuePut(bt->message_queue, &message, 0, osWaitForever) == osOK);
+ // Open RPC session
FURI_LOG_I(BT_SERVICE_TAG, "Open RPC connection");
bt->rpc_session = rpc_open_session(bt->rpc);
rpc_set_send_bytes_callback(bt->rpc_session, bt_rpc_send_bytes_callback, bt);
@@ -123,8 +136,8 @@ static void bt_on_gap_event_callback(BleEvent event, void* context) {
// Update battery level
PowerInfo info;
power_get_info(bt->power, &info);
- BtMessage message = {
- .type = BtMessageTypeUpdateBatteryLevel, .data.battery_level = info.charge};
+ message.type = BtMessageTypeUpdateBatteryLevel;
+ message.data.battery_level = info.charge;
furi_check(osMessageQueuePut(bt->message_queue, &message, 0, osWaitForever) == osOK);
} else if(event.type == BleEventTypeDisconnected) {
FURI_LOG_I(BT_SERVICE_TAG, "Close RPC connection");
@@ -132,7 +145,12 @@ static void bt_on_gap_event_callback(BleEvent event, void* context) {
rpc_close_session(bt->rpc_session);
bt->rpc_session = NULL;
}
- } else if(event.type == BleEventTypeStartAdvertising || event.type == BleEventTypeStopAdvertising) {
+ } else if(event.type == BleEventTypeStartAdvertising) {
+ bt->status = BtStatusAdvertising;
+ BtMessage message = {.type = BtMessageTypeUpdateStatusbar};
+ furi_check(osMessageQueuePut(bt->message_queue, &message, 0, osWaitForever) == osOK);
+ } else if(event.type == BleEventTypeStopAdvertising) {
+ bt->status = BtStatusOff;
BtMessage message = {.type = BtMessageTypeUpdateStatusbar};
furi_check(osMessageQueuePut(bt->message_queue, &message, 0, osWaitForever) == osOK);
} else if(event.type == BleEventTypePinCodeShow) {
@@ -142,6 +160,18 @@ static void bt_on_gap_event_callback(BleEvent event, void* context) {
}
}
+static void bt_statusbar_update(Bt* bt) {
+ if(bt->status == BtStatusAdvertising) {
+ view_port_set_width(bt->statusbar_view_port, icon_get_width(&I_Bluetooth_5x8));
+ view_port_enabled_set(bt->statusbar_view_port, true);
+ } else if(bt->status == BtStatusConnected) {
+ view_port_set_width(bt->statusbar_view_port, icon_get_width(&I_BT_Pair_9x8));
+ view_port_enabled_set(bt->statusbar_view_port, true);
+ } else {
+ view_port_enabled_set(bt->statusbar_view_port, false);
+ }
+}
+
int32_t bt_srv() {
Bt* bt = bt_alloc();
furi_record_create("bt", bt);
@@ -160,14 +190,14 @@ int32_t bt_srv() {
}
}
// Update statusbar
- view_port_enabled_set(bt->statusbar_view_port, furi_hal_bt_is_active());
+ bt_statusbar_update(bt);
BtMessage message;
while(1) {
furi_check(osMessageQueueGet(bt->message_queue, &message, NULL, osWaitForever) == osOK);
if(message.type == BtMessageTypeUpdateStatusbar) {
// Update statusbar
- view_port_enabled_set(bt->statusbar_view_port, furi_hal_bt_is_active());
+ bt_statusbar_update(bt);
} else if(message.type == BtMessageTypeUpdateBatteryLevel) {
// Update battery level
if(furi_hal_bt_is_active()) {
diff --git a/applications/bt/bt_service/bt_i.h b/applications/bt/bt_service/bt_i.h
index 882061ee..0588378e 100644
--- a/applications/bt/bt_service/bt_i.h
+++ b/applications/bt/bt_service/bt_i.h
@@ -16,6 +16,12 @@
#include "../bt_settings.h"
typedef enum {
+ BtStatusOff,
+ BtStatusAdvertising,
+ BtStatusConnected,
+} BtStatus;
+
+typedef enum {
BtMessageTypeUpdateStatusbar,
BtMessageTypeUpdateBatteryLevel,
BtMessageTypePinCodeShow,
@@ -33,6 +39,7 @@ typedef struct {
struct Bt {
BtSettings bt_settings;
+ BtStatus status;
osMessageQueueId_t message_queue;
Gui* gui;
ViewPort* statusbar_view_port;