14
14
#include <u8g2.h>
15
15
16
16
#define TAG "nrf24batch"
17
- #define VERSION "1.3 "
17
+ #define VERSION "1.4 "
18
18
19
19
#define SCAN_APP_PATH_FOLDER "/ext/nrf24batch"
20
20
#define LOG_FILEEXT ".txt"
@@ -84,15 +84,16 @@ uint8_t NRF_CRC; // 1 - No, 1 - CRC 1byte, 2 - CRC 2byte
84
84
uint8_t NRF_RETR = ((0b0011 <<4 ) | 0b1111 ); // Automatic Retransmission, ARD, ARC
85
85
uint8_t NRF_Payload ;// Payload len in bytes, 0..32
86
86
bool NRF_ERROR = 0 ;
87
- bool NRF_INITED = false;
87
+ uint8_t NRF_INITED = 0 ; // 0 - not, 1 - rw, rwt_listen - listen
88
+ bool NRF_BOARD_POWER_5V = false;
88
89
uint8_t NRF_last_packet_send_st = 0 ;
89
90
uint8_t NRF_resend = 1 ; // number of transaction attempts
90
91
uint8_t NRF_repeat = 0 ; // count number of repeated requests (until < NRF_resend)
91
92
uint32_t NRF_time ;
92
93
uint32_t delay_between_pkt = 10 ;// ms
93
94
94
95
uint8_t addr [5 ]; // nRF24 address, MSB first
95
- uint8_t addr_len ; // 2..5
96
+ uint8_t addr_len = 0 ; // 2..5
96
97
uint8_t payload [32 ];
97
98
uint8_t payload_receive [32 ];
98
99
uint8_t payload_struct [32 ]; // sizeof(1..4) in bytes of each field, example: 2,1,1
@@ -112,7 +113,8 @@ FuriString *ReadDefault = NULL;
112
113
FuriString * WriteDefault = NULL ;
113
114
FuriString * WriteStart = NULL ;
114
115
FuriString * Constants = NULL ; // text of STR=x
115
- char * ListenAddr = NULL ;
116
+ uint8_t listen_addr [5 ];
117
+ uint8_t listen_addr_len = 0 ;
116
118
char * ListenFields = NULL ; // ptr to string: field1,field2,... max 5 field now
117
119
bool ListenNew ;
118
120
FuriHalRtcDateTime ListenLastTime = { 0 };
@@ -152,7 +154,7 @@ static bool ask_fill_screen_buf(void)
152
154
//#define MIN(a, b) ((a<b)?a:b)
153
155
154
156
static uint8_t GetHexVal (char hex ) {
155
- return ( uint8_t )hex - ((uint8_t )hex < 58 ? 48 : ((uint8_t )hex < 97 ? 55 : 87 ));
157
+ return hex == 0 ? 0 : (( uint8_t )hex - ((uint8_t )hex < 58 ? 48 : ((uint8_t )hex < 97 ? 55 : 87 ) ));
156
158
}
157
159
158
160
static bool is_digit (char * ptr , bool hex )
@@ -245,10 +247,6 @@ void free_store(void)
245
247
furi_string_free (WriteStart );
246
248
WriteDefault = NULL ;
247
249
}
248
- if (ListenAddr ) {
249
- free (ListenAddr );
250
- ListenAddr = NULL ;
251
- }
252
250
if (ListenFields ) {
253
251
free (ListenFields );
254
252
ListenFields = NULL ;
@@ -307,7 +305,30 @@ static bool select_settings_file() {
307
305
308
306
static void prepare_nrf24 (void )
309
307
{
310
- if (!NRF_INITED ) {
308
+ if (!NRF_INITED || !((rw_type == rwt_listen ) == (NRF_INITED == rwt_listen ))) {
309
+ uint8_t adrlen , * adr ;
310
+ if (rw_type == rwt_listen ) {
311
+ adrlen = listen_addr_len ;
312
+ adr = listen_addr ;
313
+ NRF_INITED = rwt_listen ;
314
+ } else {
315
+ adrlen = addr_len ;
316
+ adr = addr ;
317
+ NRF_INITED = 1 ;
318
+ }
319
+ nrf24_set_mac (REG_RX_ADDR_P0 , adr , adrlen );
320
+ uint8_t tmp [5 ] = { 0 };
321
+ nrf24_read_reg (nrf24_HANDLE , REG_RX_ADDR_P0 , tmp , adrlen );
322
+ for (uint8_t i = 0 ; i < adrlen / 2 ; i ++ ) {
323
+ uint8_t tb = tmp [i ];
324
+ tmp [i ] = tmp [adrlen - i - 1 ];
325
+ tmp [adrlen - i - 1 ] = tb ;
326
+ }
327
+ NRF_ERROR = memcmp (adr , tmp , adrlen ) != 0 ;
328
+ if (NRF_ERROR ) {
329
+ NRF_INITED = 0 ;
330
+ return ;
331
+ }
311
332
nrf24_write_reg (nrf24_HANDLE , REG_RF_CH , NRF_channel );
312
333
nrf24_write_reg (nrf24_HANDLE , REG_RF_SETUP , (NRF_rate == 0 ? 0b00100000 : NRF_rate == 1 ? 0 : 0b00001000 ) | 0b111 ); // +TX high power
313
334
nrf24_write_reg (nrf24_HANDLE , REG_CONFIG , 0x70 | ((NRF_CRC == 1 ? 0b1000 : NRF_CRC == 2 ? 0b1100 : 0 ))); // Mask all interrupts
@@ -316,17 +337,8 @@ static void prepare_nrf24(void)
316
337
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
317
338
nrf24_write_reg (nrf24_HANDLE , REG_DYNPD , NRF_DPL ? 0x3F : 0 ); // Enable dynamic payload reg
318
339
nrf24_write_reg (nrf24_HANDLE , RX_PW_P0 , payload_size );
319
- nrf24_set_maclen (nrf24_HANDLE , addr_len );
320
- nrf24_set_mac (REG_RX_ADDR_P0 , addr , addr_len );
321
- uint8_t tmp [5 ] = { 0 };
322
- nrf24_read_reg (nrf24_HANDLE , REG_RX_ADDR_P0 , tmp , addr_len );
323
- for (uint8_t i = 0 ; i < addr_len / 2 ; i ++ ) {
324
- uint8_t tb = tmp [i ];
325
- tmp [i ] = tmp [addr_len - i - 1 ];
326
- tmp [addr_len - i - 1 ] = tb ;
327
- }
328
- NRF_ERROR = memcmp (addr , tmp , addr_len ) != 0 ;
329
- nrf24_set_mac (REG_TX_ADDR , addr , addr_len );
340
+ nrf24_set_maclen (nrf24_HANDLE , adrlen );
341
+ nrf24_set_mac (REG_TX_ADDR , adr , adrlen );
330
342
nrf24_write_reg (nrf24_HANDLE , REG_EN_RXADDR , 1 );
331
343
//nrf24_set_idle(nrf24_HANDLE);
332
344
NRF_INITED = true;
@@ -818,16 +830,11 @@ static uint8_t load_settings_file() {
818
830
p += sizeof (SettingsFld_Listen );
819
831
char * p2 = strchr (p , '=' );
820
832
if (p2 ) {
821
- uint8_t len = p2 - p ;
822
- ListenAddr = malloc (len + 1 );
823
- if (ListenAddr ) {
824
- memcpy (ListenAddr , p , len );
825
- ListenAddr [len ] = '\0' ;
826
- p2 ++ ;
827
- len = strlen (p2 );
828
- ListenFields = malloc (len + 1 );
829
- if (ListenFields ) memcpy (ListenFields , p2 , len );
830
- }
833
+ listen_addr_len = ConvertHexToArray (p , listen_addr , (p2 - p ) / 2 );
834
+ p2 ++ ;
835
+ uint8_t len = strlen (p2 );
836
+ ListenFields = malloc (len + 1 );
837
+ if (ListenFields ) memcpy (ListenFields , p2 , len );
831
838
}
832
839
}
833
840
}
@@ -981,7 +988,12 @@ static void render_callback(Canvas* const canvas, void* ctx) {
981
988
canvas_set_font (canvas , FontSecondary ); // 8x10 font, 6 lines
982
989
canvas_draw_str (canvas , 0 , 10 , "Listen mode" );
983
990
canvas_draw_str (canvas , 0 , 25 , "Address:" );
984
- if (Edit ) display_edit_ttf_font (canvas , 40 , 25 ); else if (ListenAddr ) canvas_draw_str (canvas , 40 , 25 , ListenAddr );
991
+ if (Edit ) display_edit_ttf_font (canvas , 40 , 25 );
992
+ else if (listen_addr_len ) {
993
+ screen_buf [0 ] = '\0' ;
994
+ add_to_str_hex_bytes (screen_buf , listen_addr , listen_addr_len );
995
+ canvas_draw_str (canvas , 40 , 25 , screen_buf );
996
+ }
985
997
} else {
986
998
canvas_set_font (canvas , FontBatteryPercent ); // 5x7 font, 9 lines, 25 cols
987
999
if (rw_type == rwt_read_batch ) {
@@ -1031,7 +1043,8 @@ static void render_callback(Canvas* const canvas, void* ctx) {
1031
1043
for (uint8_t i = 0 ; i < 5 && * p ; i ++ ) {
1032
1044
hex = false;
1033
1045
p2 = strchr (p , ',' );
1034
- if (p2 == NULL ) p2 = p + strlen (p ); else if (* (p2 - 1 ) == '#' ) hex = true;
1046
+ if (p2 == NULL ) p2 = p + strlen (p );
1047
+ if (* (p2 - 1 ) == '#' ) hex = true;
1035
1048
memcpy (screen_buf , p , len = p2 - p );
1036
1049
strcpy (screen_buf + len , ": " );
1037
1050
if (ListenNew ) {
@@ -1178,7 +1191,6 @@ int32_t nrf24batch_app(void* p) {
1178
1191
free (APP -> plugin_state );
1179
1192
return 255 ;
1180
1193
}
1181
- nrf24_init ();
1182
1194
1183
1195
// Set system callbacks
1184
1196
APP -> view_port = view_port_alloc ();
@@ -1194,6 +1206,12 @@ int32_t nrf24batch_app(void* p) {
1194
1206
file_stream = file_stream_alloc (APP -> storage );
1195
1207
FuriTimer * work_timer = furi_timer_alloc (work_timer_callback , FuriTimerTypePeriodic , NULL );
1196
1208
furi_timer_start (work_timer , WORK_PERIOD );
1209
+ if (!furi_hal_power_is_otg_enabled ()) {
1210
+ furi_hal_power_enable_otg ();
1211
+ NRF_BOARD_POWER_5V = true;
1212
+ furi_delay_ms (100 );
1213
+ }
1214
+ nrf24_init ();
1197
1215
1198
1216
PluginEvent event ;
1199
1217
for (bool processing = true; processing ;) {
@@ -1337,8 +1355,8 @@ int32_t nrf24batch_app(void* p) {
1337
1355
}
1338
1356
ask_question = 0 ;
1339
1357
} else if (Edit ) { // insert digit
1340
- if (what_doing == 0 ) {
1341
- if (strlen (Edit_start ) < (setup_cursor == 1 ? 5 * 2 : 3 )) {
1358
+ if (what_doing <= 1 ) {
1359
+ if (strlen (Edit_start ) < (what_doing == 0 && setup_cursor == 2 ? 3 : 5 * 2 )) {
1342
1360
memmove (Edit_pos + 1 , Edit_pos , strlen (Edit_pos ) + 1 );
1343
1361
* Edit_pos = '0' ;
1344
1362
}
@@ -1448,7 +1466,7 @@ int32_t nrf24batch_app(void* p) {
1448
1466
}
1449
1467
} else if (event .input .type == InputTypeLong ) {
1450
1468
if (Edit ) { // delete
1451
- if (what_doing == 0 ) {
1469
+ if (what_doing <= 1 ) {
1452
1470
if (strlen (Edit_start ) > 1 ) {
1453
1471
memmove (Edit_pos , Edit_pos + 1 , strlen (Edit_pos ) + 1 );
1454
1472
if (* Edit_pos == '\0' ) Edit_pos -- ;
@@ -1462,11 +1480,14 @@ int32_t nrf24batch_app(void* p) {
1462
1480
}
1463
1481
} else if (what_doing == 1 ) {
1464
1482
if (rw_type == rwt_listen ) {
1465
- NRF_INITED = false ;
1466
- Edit_start = ListenAddr ;
1467
- Edit_pos = ListenAddr + strlen ( ListenAddr ) - 1 ;
1483
+ char * ebuf = ( char * ) payload ;
1484
+ ebuf [ 0 ] = '\0' ;
1485
+ add_to_str_hex_bytes ( ebuf , listen_addr , listen_addr_len ) ;
1468
1486
Edit_hex = true;
1487
+ Edit_pos = ebuf + strlen (ebuf ) - 1 ;
1488
+ Edit_start = ebuf ;
1469
1489
Edit = 1 ;
1490
+ NRF_INITED = false;
1470
1491
}
1471
1492
} else if (what_doing == 2 && Log_Total ) {
1472
1493
if (rw_type == rwt_write_batch ) {
@@ -1495,6 +1516,8 @@ int32_t nrf24batch_app(void* p) {
1495
1516
NRF_channel = str_to_int ((char * )payload );
1496
1517
if (NRF_channel > MAX_CHANNEL ) NRF_channel = MAX_CHANNEL ;
1497
1518
}
1519
+ } else if (what_doing == 1 && rw_type == rwt_listen ) {
1520
+ listen_addr_len = ConvertHexToArray ((char * )payload , listen_addr , 5 );
1498
1521
}
1499
1522
Edit = 0 ;
1500
1523
} else {
@@ -1522,6 +1545,7 @@ int32_t nrf24batch_app(void* p) {
1522
1545
}
1523
1546
nrf24_set_idle (nrf24_HANDLE );
1524
1547
nrf24_deinit ();
1548
+ if (NRF_BOARD_POWER_5V ) furi_hal_power_disable_otg ();
1525
1549
1526
1550
view_port_enabled_set (APP -> view_port , false);
1527
1551
gui_remove_view_port (APP -> gui , APP -> view_port );
0 commit comments