@@ -133,6 +133,10 @@ char *ReadBatch_cmd_curr = NULL; // =0xFFFFFFFF - finish
133
133
FuriString * * WriteBatch_cmd = NULL ; // Names of write batch cmd
134
134
uint16_t WriteBatch_cmd_Total = 0 ;
135
135
uint16_t WriteBatch_cmd_curr = 0 ; // == _Total - finish
136
+ #define POWER_READ_PERIOD 10 // ms
137
+ uint16_t pwr_read_timer = 0 ;
138
+ int Current = 0 ;
139
+ int CurrentStart = 0 ;
136
140
137
141
enum {
138
142
ask_write_batch = 1 ,
@@ -283,6 +287,25 @@ void free_store(void)
283
287
free_Log ();
284
288
}
285
289
290
+ void update_power (void )
291
+ {
292
+ Current = furi_hal_power_get_battery_current (FuriHalPowerICFuelGauge ) * 1000 ;
293
+ }
294
+
295
+ void check_en_power_5V (void )
296
+ {
297
+ if (!furi_hal_power_is_otg_enabled ()) {
298
+ FURI_LOG_D ("PWR" , "NO 5V, TURN ON" );
299
+ furi_delay_ms (11 );
300
+ update_power ();
301
+ CurrentStart = Current ;
302
+ furi_hal_power_enable_otg ();
303
+ NRF_BOARD_POWER_5V = true;
304
+ furi_delay_ms (100 );
305
+ NRF_INITED = 0 ;
306
+ }
307
+ }
308
+
286
309
static bool select_settings_file () {
287
310
DialogsApp * dialogs = furi_record_open ("dialogs" );
288
311
bool result = false;
@@ -310,7 +333,9 @@ static bool select_settings_file() {
310
333
311
334
static void prepare_nrf24 (void )
312
335
{
313
- if (!NRF_INITED || !((rw_type == rwt_listen ) == (NRF_INITED == rwt_listen ))) {
336
+ check_en_power_5V ();
337
+ if (!NRF_INITED || rw_type == rwt_listen || NRF_INITED == rwt_listen ) {
338
+ FURI_LOG_D ("NRF" , "Prepare" );
314
339
uint8_t adrlen , * adr ;
315
340
if (rw_type == rwt_listen ) {
316
341
adrlen = listen_addr_len ;
@@ -321,6 +346,7 @@ static void prepare_nrf24(void)
321
346
adr = addr ;
322
347
NRF_INITED = 1 ;
323
348
}
349
+ furi_hal_gpio_write (nrf24_CE_PIN , false);
324
350
nrf24_set_mac (REG_RX_ADDR_P0 , adr , adrlen );
325
351
uint8_t tmp [5 ] = { 0 };
326
352
nrf24_read_reg (nrf24_HANDLE , REG_RX_ADDR_P0 , tmp , adrlen );
@@ -334,24 +360,23 @@ static void prepare_nrf24(void)
334
360
NRF_INITED = 0 ;
335
361
return ;
336
362
}
363
+ // EN_DYN_ACK(0x01) option for W_TX_PAYLOAD_NOACK cmd broke AA on some fake nRF24l01+ modules
364
+ nrf24_write_reg (nrf24_HANDLE , REG_FEATURE , (NRF_DPL ? 4 : 0 )); // Dynamic Payload, Payload with ACK, W_TX_PAYLOAD_NOACK command
337
365
nrf24_write_reg (nrf24_HANDLE , REG_RF_CH , NRF_channel );
338
366
nrf24_write_reg (nrf24_HANDLE , REG_RF_SETUP , (NRF_rate == 0 ? 0b00100000 : NRF_rate == 1 ? 0 : 0b00001000 ) | 0b111 ); // +TX high power
339
367
nrf24_write_reg (nrf24_HANDLE , REG_CONFIG , 0x70 | ((NRF_CRC == 1 ? 0b1000 : NRF_CRC == 2 ? 0b1100 : 0 ))); // Mask all interrupts
340
368
nrf24_write_reg (nrf24_HANDLE , REG_SETUP_RETR , NRF_RETR ); // Automatic Retransmission, ARD<<4 + ARC
341
369
nrf24_write_reg (nrf24_HANDLE , REG_EN_AA , 0x01 ); // Auto acknowledgement
342
- nrf24_write_reg (nrf24_HANDLE , REG_FEATURE , NRF24_EN_DYN_ACK | (NRF_DPL ? 4 : 0 )); // Enables the W_TX_PAYLOAD_NOACK command, Disable Payload with ACK, set Dynamic Payload
343
370
nrf24_write_reg (nrf24_HANDLE , REG_DYNPD , NRF_DPL ? 0x3F : 0 ); // Enable dynamic payload reg
344
371
nrf24_write_reg (nrf24_HANDLE , RX_PW_P0 , payload_size );
345
372
nrf24_set_maclen (nrf24_HANDLE , adrlen );
346
373
nrf24_set_mac (REG_TX_ADDR , adr , adrlen );
347
374
nrf24_write_reg (nrf24_HANDLE , REG_EN_RXADDR , 1 );
348
375
//nrf24_set_idle(nrf24_HANDLE);
349
- NRF_INITED = true;
350
376
}
351
377
nrf24_flush_tx (nrf24_HANDLE );
352
378
nrf24_flush_rx (nrf24_HANDLE );
353
379
nrf24_write_reg (nrf24_HANDLE , REG_STATUS , MAX_RT | RX_DR | TX_DS );
354
- furi_hal_gpio_write (nrf24_CE_PIN , false);
355
380
}
356
381
357
382
// true - ok
@@ -957,8 +982,10 @@ void display_edit_ttf_font(Canvas* const canvas, uint8_t start_x, uint8_t start_
957
982
}
958
983
959
984
static void render_callback (Canvas * const canvas , void * ctx ) {
960
- const PluginState * plugin_state = acquire_mutex ((ValueMutex * )ctx , 25 );
961
- if (plugin_state == NULL ) return ;
985
+ if (ctx == NULL ) return ;
986
+ const PluginState * plugin_state = ctx ;
987
+ if (furi_mutex_acquire (plugin_state -> mutex , 25 ) != FuriStatusOk ) return ;
988
+
962
989
//canvas_draw_frame(canvas, 0, 0, 128, 64); // border around the edge of the screen
963
990
if (what_doing == 0 ) {
964
991
canvas_set_font (canvas , FontSecondary ); // 8x10 font, 6 lines
@@ -1001,6 +1028,8 @@ static void render_callback(Canvas* const canvas, void* ctx) {
1001
1028
add_to_str_hex_bytes (screen_buf , listen_addr , listen_addr_len );
1002
1029
canvas_draw_str (canvas , 40 , 25 , screen_buf );
1003
1030
}
1031
+ snprintf (screen_buf , sizeof (screen_buf ), "I: %d +(%d) mA" , Current - CurrentStart , CurrentStart );
1032
+ canvas_draw_str (canvas , 0 , 60 , screen_buf );
1004
1033
} else {
1005
1034
canvas_set_font (canvas , FontBatteryPercent ); // 5x7 font, 9 lines, 25 cols
1006
1035
if (rw_type == rwt_read_batch ) {
@@ -1048,6 +1077,7 @@ static void render_callback(Canvas* const canvas, void* ctx) {
1048
1077
snprintf (screen_buf + strlen (screen_buf ), 16 , "%02d:%02d:%02d" , ListenLastTime .hour , ListenLastTime .minute , ListenLastTime .second );
1049
1078
if (ListenPrev ) snprintf (screen_buf + strlen (screen_buf ), 16 , " (%lu)" , ListenLast - ListenPrev );
1050
1079
} else strcat (screen_buf , "receiving" );
1080
+ snprintf (screen_buf + strlen (screen_buf ), 16 , " %dmA" , Current - CurrentStart );
1051
1081
canvas_draw_str (canvas , 0 , 10 , screen_buf );
1052
1082
if (ListenFields ) {
1053
1083
char * p2 , * p = ListenFields ;
@@ -1142,13 +1172,19 @@ static void render_callback(Canvas* const canvas, void* ctx) {
1142
1172
}
1143
1173
}
1144
1174
}
1145
- release_mutex (( ValueMutex * ) ctx , plugin_state );
1175
+ furi_mutex_release ( plugin_state -> mutex );
1146
1176
}
1147
1177
1148
1178
void work_timer_callback (void * ctx )
1149
1179
{
1150
- UNUSED (ctx );
1180
+ if (ctx == NULL ) return ;
1181
+ if ((pwr_read_timer += WORK_PERIOD ) >= POWER_READ_PERIOD ) {
1182
+ pwr_read_timer = 0 ;
1183
+ update_power ();
1184
+ }
1151
1185
if (what_doing == 2 ) {
1186
+ const PluginState * plugin_state = ctx ;
1187
+ if (furi_mutex_acquire (plugin_state -> mutex , 0 ) != FuriStatusOk ) return ;
1152
1188
if (rw_type == rwt_write_batch ) {
1153
1189
if (send_status == sst_ok ) {
1154
1190
if (ERR == 0 && WriteBatch_cmd_curr < Log_Total && furi_get_tick () - NRF_time >= delay_between_pkt ) {
@@ -1197,47 +1233,43 @@ void work_timer_callback(void* ctx)
1197
1233
}
1198
1234
}
1199
1235
}
1236
+ furi_mutex_release (plugin_state -> mutex );
1200
1237
}
1201
1238
}
1202
1239
1203
1240
int32_t nrf24batch_app (void * p ) {
1204
1241
UNUSED (p );
1205
1242
APP = malloc (sizeof (nRF24Batch ));
1206
- APP -> event_queue = furi_message_queue_alloc (8 , sizeof (PluginEvent ));
1243
+ FuriMessageQueue * event_queue = furi_message_queue_alloc (8 , sizeof (PluginEvent ));
1207
1244
APP -> plugin_state = malloc (sizeof (PluginState ));
1208
- ValueMutex state_mutex ;
1209
- if (!init_mutex ( & state_mutex , APP -> plugin_state , sizeof ( PluginState )) ) {
1210
- furi_message_queue_free (APP -> event_queue );
1245
+ APP -> plugin_state -> mutex = furi_mutex_alloc ( FuriMutexTypeNormal ) ;
1246
+ if (!APP -> plugin_state -> mutex ) {
1247
+ furi_message_queue_free (event_queue );
1211
1248
FURI_LOG_E (TAG , "cannot create mutex" );
1212
1249
free (APP -> plugin_state );
1213
1250
return 255 ;
1214
1251
}
1215
-
1216
1252
// Set system callbacks
1217
- APP -> view_port = view_port_alloc ();
1218
- view_port_draw_callback_set (APP -> view_port , render_callback , & state_mutex );
1219
- view_port_input_callback_set (APP -> view_port , input_callback , APP -> event_queue );
1253
+ ViewPort * view_port = view_port_alloc ();
1254
+ view_port_draw_callback_set (view_port , render_callback , APP -> plugin_state );
1255
+ view_port_input_callback_set (view_port , input_callback , event_queue );
1220
1256
1221
1257
// Open GUI and register view_port
1222
1258
APP -> gui = furi_record_open (RECORD_GUI );
1223
- gui_add_view_port (APP -> gui , APP -> view_port , GuiLayerFullscreen );
1259
+ gui_add_view_port (APP -> gui , view_port , GuiLayerFullscreen );
1224
1260
APP -> notification = furi_record_open (RECORD_NOTIFICATION );
1225
1261
APP -> storage = furi_record_open (RECORD_STORAGE );
1226
1262
storage_common_mkdir (APP -> storage , SCAN_APP_PATH_FOLDER );
1227
1263
file_stream = file_stream_alloc (APP -> storage );
1228
- FuriTimer * work_timer = furi_timer_alloc (work_timer_callback , FuriTimerTypePeriodic , NULL );
1264
+ FuriTimer * work_timer = furi_timer_alloc (work_timer_callback , FuriTimerTypePeriodic , APP -> plugin_state );
1229
1265
furi_timer_start (work_timer , WORK_PERIOD );
1230
- if (!furi_hal_power_is_otg_enabled ()) {
1231
- furi_hal_power_enable_otg ();
1232
- NRF_BOARD_POWER_5V = true;
1233
- furi_delay_ms (100 );
1234
- }
1235
1266
nrf24_init ();
1267
+ check_en_power_5V ();
1236
1268
1237
1269
PluginEvent event ;
1238
1270
for (bool processing = true; processing ;) {
1239
- FuriStatus event_status = furi_message_queue_get (APP -> event_queue , & event , 200 );
1240
- PluginState * plugin_state = ( PluginState * ) acquire_mutex_block ( & state_mutex );
1271
+ FuriStatus event_status = furi_message_queue_get (event_queue , & event , 100 );
1272
+ furi_mutex_acquire ( APP -> plugin_state -> mutex , FuriWaitForever );
1241
1273
1242
1274
static FuriLogLevel FuriLogLevel = FuriLogLevelDefault ;
1243
1275
if (furi_log_get_level () != FuriLogLevel ) {
@@ -1415,15 +1447,15 @@ int32_t nrf24batch_app(void* p) {
1415
1447
Edit_pos = ebuf + strlen (ebuf ) - 1 ;
1416
1448
Edit_start = ebuf ;
1417
1449
Edit = 1 ;
1418
- NRF_INITED = false ;
1450
+ NRF_INITED = 0 ;
1419
1451
} else if (setup_cursor == 2 ) { // change channel
1420
1452
char * ebuf = (char * )payload ;
1421
1453
snprintf (ebuf , sizeof (payload ), "%d" , NRF_channel );
1422
1454
Edit_hex = false;
1423
1455
Edit_pos = ebuf + strlen (ebuf ) - 1 ;
1424
1456
Edit_start = ebuf ;
1425
1457
Edit = 1 ;
1426
- NRF_INITED = false ;
1458
+ NRF_INITED = 0 ;
1427
1459
}
1428
1460
} else if (what_doing == 1 ) {
1429
1461
if (rw_type == rwt_read_batch ) {
@@ -1471,27 +1503,8 @@ int32_t nrf24batch_app(void* p) {
1471
1503
ask_question = ask_save_batch ;
1472
1504
ask_question_answer = 0 ;
1473
1505
} else if (rw_type == rwt_write_batch ) {
1474
- if (!Edit ) {
1475
- Edit = 0 ;
1476
- Edit_hex = 0 ;
1477
- char * s = (char * )furi_string_get_cstr (Log [view_Batch ]);
1478
- char * p = strchr (s , '=' );
1479
- if (p ) {
1480
- p ++ ;
1481
- if (* p == '{' ) p ++ ; // array
1482
- if (* (p + 1 ) == 'x' ) {
1483
- p += 2 ;
1484
- Edit_hex = 1 ; // hex
1485
- }
1486
- if (is_digit (p , Edit_hex )) {
1487
- Edit_start = p ;
1488
- while (is_digit (p , Edit_hex )) p ++ ;
1489
- Edit_pos = p - 1 ;
1490
- Edited = true;
1491
- Edit = 1 ;
1492
- }
1493
- }
1494
- }
1506
+ ask_question = ask_write_batch ;
1507
+ ask_question_answer = 0 ;
1495
1508
}
1496
1509
}
1497
1510
}
@@ -1518,15 +1531,34 @@ int32_t nrf24batch_app(void* p) {
1518
1531
Edit_pos = ebuf + strlen (ebuf ) - 1 ;
1519
1532
Edit_start = ebuf ;
1520
1533
Edit = 1 ;
1521
- NRF_INITED = false ;
1534
+ NRF_INITED = 0 ;
1522
1535
}
1523
1536
} else if (what_doing == 2 ) {
1524
1537
if (rw_type == rwt_read_cmd ) {
1525
1538
ReadRepeat = !ReadRepeat ;
1526
1539
} else if (Log_Total ) {
1527
1540
if (rw_type == rwt_write_batch ) {
1528
- ask_question = ask_write_batch ;
1529
- ask_question_answer = 0 ;
1541
+ if (!Edit ) {
1542
+ Edit = 0 ;
1543
+ Edit_hex = 0 ;
1544
+ char * s = (char * )furi_string_get_cstr (Log [view_Batch ]);
1545
+ char * p = strchr (s , '=' );
1546
+ if (p ) {
1547
+ p ++ ;
1548
+ if (* p == '{' ) p ++ ; // array
1549
+ if (* (p + 1 ) == 'x' ) {
1550
+ p += 2 ;
1551
+ Edit_hex = 1 ; // hex
1552
+ }
1553
+ if (is_digit (p , Edit_hex )) {
1554
+ Edit_start = p ;
1555
+ while (is_digit (p , Edit_hex )) p ++ ;
1556
+ Edit_pos = p - 1 ;
1557
+ Edited = true;
1558
+ Edit = 1 ;
1559
+ }
1560
+ }
1561
+ }
1530
1562
} else if (rw_type == rwt_read_batch ) {
1531
1563
ask_question = ask_save_batch ;
1532
1564
ask_question_answer = 0 ;
@@ -1575,27 +1607,28 @@ int32_t nrf24batch_app(void* p) {
1575
1607
}
1576
1608
}
1577
1609
1578
- view_port_update (APP -> view_port );
1579
- release_mutex ( & state_mutex , plugin_state );
1610
+ view_port_update (view_port );
1611
+ furi_mutex_release ( APP -> plugin_state -> mutex );
1580
1612
}
1581
1613
nrf24_set_idle (nrf24_HANDLE );
1582
1614
nrf24_deinit ();
1583
1615
if (NRF_BOARD_POWER_5V ) furi_hal_power_disable_otg ();
1584
1616
1585
- view_port_enabled_set (APP -> view_port , false);
1586
- gui_remove_view_port (APP -> gui , APP -> view_port );
1617
+ view_port_enabled_set (view_port , false);
1618
+ gui_remove_view_port (APP -> gui , view_port );
1587
1619
furi_record_close (RECORD_GUI );
1588
1620
furi_record_close (RECORD_NOTIFICATION );
1589
1621
furi_record_close (RECORD_STORAGE );
1590
1622
if (file_stream ) {
1591
1623
file_stream_close (file_stream );
1592
1624
stream_free (file_stream );
1593
1625
}
1594
- view_port_free (APP -> view_port );
1595
- furi_message_queue_free (APP -> event_queue );
1626
+ view_port_free (view_port );
1627
+ furi_message_queue_free (event_queue );
1596
1628
free_store ();
1597
1629
furi_timer_stop (work_timer );
1598
1630
furi_timer_free (work_timer );
1631
+ furi_mutex_free (APP -> plugin_state -> mutex );
1599
1632
free (APP -> plugin_state );
1600
1633
free (APP );
1601
1634
return 0 ;
0 commit comments