14
14
#include <u8g2.h>
15
15
16
16
#define TAG "nrf24batch"
17
- #define VERSION "1.2 "
17
+ #define VERSION "1.3 "
18
18
19
19
#define SCAN_APP_PATH_FOLDER "/ext/nrf24batch"
20
20
#define LOG_FILEEXT ".txt"
@@ -41,17 +41,19 @@ const char SettingsFld_Write[] = "W:"; // Write cmd
41
41
const char SettingsFld_Set [] = "S:" ; // Set cmd (like Write but without "Write start" packet)
42
42
const char SettingsFld_ReadBatch [] = "RBatch:" ;
43
43
const char SettingsFld_WriteBatch [] = "WBatch:" ;
44
+ const char SettingsFld_Listen [] = "Listen:" ;
44
45
const char AskQuestion_Save [] = "SAVE BATCH?" ;
45
46
#define Settings_i 'i'
46
47
#define Settings_n 'n'
47
48
#define VAR_EMPTY ((int32_t)0x80000000)
48
49
49
50
nRF24Batch * APP ;
50
- uint8_t what_doing = 0 ; // 0 - setup, 1 - cmd list, 2 - view send cmd
51
+ uint8_t what_doing = 0 ; // 0 - setup, 1 - cmd list, 2 - read/write/listen cmd
51
52
enum {
52
53
rwt_read_batch = 0 ,
53
54
rwt_read_cmd ,
54
- rwt_write_batch
55
+ rwt_write_batch ,
56
+ rwt_listen
55
57
};
56
58
uint8_t rw_type = rwt_read_batch ; // What to do: rwt_*
57
59
enum {
@@ -110,6 +112,10 @@ FuriString *ReadDefault = NULL;
110
112
FuriString * WriteDefault = NULL ;
111
113
FuriString * WriteStart = NULL ;
112
114
FuriString * Constants = NULL ; // text of STR=x
115
+ char * ListenAddr = NULL ;
116
+ char * ListenFields = NULL ; // ptr to string: field1,field2,... max 5 field now
117
+ bool ListenNew ;
118
+ FuriHalRtcDateTime ListenLastTime = { 0 };
113
119
FuriString * * Read_cmd = NULL ; // Names of read cmd
114
120
uint16_t Read_cmd_Total = 0 ;
115
121
FuriString * * Log = NULL ; // Strings: var=n
@@ -201,6 +207,14 @@ static void add_to_str_hex_bytes(char *out, uint8_t *arr, int bytes)
201
207
} while (-- bytes );
202
208
}
203
209
210
+ int32_t get_payload_receive_field (uint8_t size )
211
+ {
212
+ if (size <= 1 ) return * payload_receive ;
213
+ else if (size == 2 ) return * (int16_t * )payload_receive ;
214
+ else if (size == 3 ) return (* (uint32_t * )payload_receive ) & 0xFFFFFF ;
215
+ else return * (int32_t * )payload_receive ;
216
+ }
217
+
204
218
void free_Log ()
205
219
{
206
220
if (Log_Total ) {
@@ -231,6 +245,14 @@ void free_store(void)
231
245
furi_string_free (WriteStart );
232
246
WriteDefault = NULL ;
233
247
}
248
+ if (ListenAddr ) {
249
+ free (ListenAddr );
250
+ ListenAddr = NULL ;
251
+ }
252
+ if (ListenFields ) {
253
+ free (ListenFields );
254
+ ListenFields = NULL ;
255
+ }
234
256
if (Read_cmd_Total ) {
235
257
for (uint16_t i = 0 ; i < Read_cmd_Total ; i ++ ) furi_string_free (Read_cmd [i ]);
236
258
Read_cmd_Total = 0 ;
@@ -370,11 +392,7 @@ bool nrf24_read_newpacket() {
370
392
if (size > 4 ) size = 0 ;
371
393
}
372
394
}
373
- int32_t var ;
374
- if (size <= 1 ) var = * payload_receive ;
375
- else if (size == 2 ) var = * (int16_t * )payload_receive ;
376
- else if (size == 3 ) var = (* (uint32_t * )payload_receive ) & 0xFFFFFF ;
377
- else var = * (int32_t * )payload_receive ;
395
+ int32_t var = get_payload_receive_field (size );
378
396
//FURI_LOG_D(TAG, "VAR(%d): %ld", size, var);
379
397
if (size == 0 ) furi_string_cat_printf (str , "%c" , (char )var );
380
398
else {
@@ -710,7 +728,7 @@ static uint8_t load_settings_file() {
710
728
char * p = (char * )furi_string_get_cstr (str );
711
729
if (* p <= ' ' ) continue ;
712
730
//char* delim_eq = strchr(p, '=');
713
- char * delim_col = strchr (p , ':' );
731
+ char * delim_col = strchr (p , ':' );
714
732
if (delim_col == NULL ) { // Constant found - no ':'
715
733
if (Constants == NULL ) {
716
734
Constants = furi_string_alloc_set (str );
@@ -796,6 +814,21 @@ static uint8_t load_settings_file() {
796
814
break ;
797
815
}
798
816
WriteBatch_cmd [WriteBatch_cmd_Total ++ ] = furi_string_alloc_set_str (p );
817
+ } else if (strncmp (p , SettingsFld_Listen , sizeof (SettingsFld_Listen )- 1 ) == 0 ) {
818
+ p += sizeof (SettingsFld_Listen );
819
+ char * p2 = strchr (p , '=' );
820
+ 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
+ }
831
+ }
799
832
}
800
833
}
801
834
}
@@ -893,6 +926,22 @@ void display_remove_asterisk(char *fsp, uint8_t vx)
893
926
}
894
927
}
895
928
929
+ void display_edit_ttf_font (Canvas * const canvas , uint8_t start_x , uint8_t start_y )
930
+ {
931
+ screen_buf [0 ] = * Edit_pos ; screen_buf [1 ] = '\0' ;
932
+ int n = canvas_string_width (canvas , screen_buf );
933
+ int len = Edit_pos - Edit_start ;
934
+ memcpy (screen_buf , Edit_start , len );
935
+ screen_buf [len ] = '\0' ;
936
+ int x = start_x + canvas_string_width (canvas , screen_buf );
937
+ int len2 = strlen (Edit_pos );
938
+ memcpy (screen_buf + len , Edit_pos , len2 );
939
+ screen_buf [len + len2 ] = '\0' ;
940
+ canvas_draw_str (canvas , start_x , start_y , screen_buf );
941
+ start_y += 1 ;
942
+ canvas_draw_line (canvas , x + (len ? 1 : 0 ), start_y , x + n + (* Edit_pos == '1' && len ? 1 : 0 ), start_y );
943
+ }
944
+
896
945
static void render_callback (Canvas * const canvas , void * ctx ) {
897
946
const PluginState * plugin_state = acquire_mutex ((ValueMutex * )ctx , 25 );
898
947
if (plugin_state == NULL ) return ;
@@ -903,20 +952,8 @@ static void render_callback(Canvas* const canvas, void* ctx) {
903
952
canvas_draw_str (canvas , 8 , 10 , screen_buf );
904
953
if (addr_len ) {
905
954
if (Edit ) {
906
- screen_buf [0 ] = * Edit_pos ; screen_buf [1 ] = '\0' ;
907
- int n = canvas_string_width (canvas , screen_buf );
908
- int len = Edit_pos - Edit_start ;
909
- memcpy (screen_buf , Edit_start , len );
910
- screen_buf [len ] = '\0' ;
911
- int x = setup_cursor == 1 ? 45 : 55 ;
912
- x += canvas_string_width (canvas , screen_buf );
913
- int len2 = strlen (Edit_pos );
914
- memcpy (screen_buf + len , Edit_pos , len2 );
915
- screen_buf [len + len2 ] = '\0' ;
916
- int y = 10 + setup_cursor * 10 ;
917
- if (setup_cursor == 1 ) canvas_draw_str (canvas , 45 , 20 , screen_buf );
918
- else if (setup_cursor == 2 ) canvas_draw_str (canvas , 55 , 30 , screen_buf );
919
- canvas_draw_line (canvas , x + (len ? 1 : 0 ), y + 1 , x + n + (* Edit_pos == '1' && len ? 1 : 0 ), y + 1 );
955
+ if (setup_cursor == 1 ) display_edit_ttf_font (canvas , 45 , 20 );
956
+ else if (setup_cursor == 2 ) display_edit_ttf_font (canvas , 55 , 30 );
920
957
}
921
958
if (!Edit || setup_cursor != 1 ) {
922
959
screen_buf [0 ] = '\0' ;
@@ -940,19 +977,25 @@ static void render_callback(Canvas* const canvas, void* ctx) {
940
977
canvas_draw_str (canvas , 0 , 10 , ">" );
941
978
}
942
979
} else if (what_doing == 1 ){
943
- canvas_set_font (canvas , FontBatteryPercent ); // 5x7 font, 9 lines, 25 cols
944
- if (rw_type == rwt_read_batch ) {
945
- canvas_draw_str (canvas , 0 , 7 , "Read Batch:" );
946
- render_display_list (canvas , & ReadBatch_cmd , ':' , view_cmd [rw_type ], ReadBatch_cmd_Total );
947
- } else if (rw_type == rwt_read_cmd ) {
948
- canvas_draw_str (canvas , 0 , 7 , "Read Command:" );
949
- render_display_list (canvas , & Read_cmd , '=' , view_cmd [rw_type ], Read_cmd_Total );
950
- } else { // rwt_write_batch
951
- if (!ask_fill_screen_buf ()) strcpy (screen_buf , "Write Batch:" );
952
- canvas_draw_str (canvas , 0 , 7 , screen_buf );
953
- render_display_list (canvas , & WriteBatch_cmd , ':' , view_cmd [rw_type ], WriteBatch_cmd_Total );
980
+ if (rw_type == rwt_listen ) {
981
+ canvas_set_font (canvas , FontSecondary ); // 8x10 font, 6 lines
982
+ canvas_draw_str (canvas , 0 , 10 , "Listen mode" );
983
+ 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 );
985
+ } else {
986
+ canvas_set_font (canvas , FontBatteryPercent ); // 5x7 font, 9 lines, 25 cols
987
+ if (rw_type == rwt_read_batch ) {
988
+ canvas_draw_str (canvas , 0 , 7 , "Read Batch:" );
989
+ render_display_list (canvas , & ReadBatch_cmd , ':' , view_cmd [rw_type ], ReadBatch_cmd_Total );
990
+ } else if (rw_type == rwt_read_cmd ) {
991
+ canvas_draw_str (canvas , 0 , 7 , "Read Command:" );
992
+ render_display_list (canvas , & Read_cmd , '=' , view_cmd [rw_type ], Read_cmd_Total );
993
+ } else if (rw_type == rwt_write_batch ) {
994
+ if (!ask_fill_screen_buf ()) strcpy (screen_buf , "Write Batch:" );
995
+ canvas_draw_str (canvas , 0 , 7 , screen_buf );
996
+ render_display_list (canvas , & WriteBatch_cmd , ':' , view_cmd [rw_type ], WriteBatch_cmd_Total );
997
+ }
954
998
}
955
- if (NRF_ERROR ) canvas_draw_str (canvas , 70 , 7 , "nRF24 ERROR!" );
956
999
} else { // what_doing == 2
957
1000
if (rw_type == rwt_read_cmd ) { // Read command
958
1001
canvas_set_font (canvas , FontSecondary ); // 8x10 font, 6 lines
@@ -975,6 +1018,35 @@ static void render_callback(Canvas* const canvas, void* ctx) {
975
1018
canvas_draw_str (canvas , 0 , 15 + 10 , screen_buf );
976
1019
}
977
1020
1021
+ } else if (rw_type == rwt_listen ) {
1022
+ canvas_set_font (canvas , FontSecondary ); // 8x10 font, 6 lines
1023
+ strcpy (screen_buf , "Listen: " );
1024
+ if (NRF_ERROR ) strcat (screen_buf , "nRF24 ERROR!" );
1025
+ else if (ListenNew ) snprintf (screen_buf + strlen (screen_buf ), 16 , "%02d:%02d:%02d" , ListenLastTime .hour , ListenLastTime .minute , ListenLastTime .second );
1026
+ else strcat (screen_buf , "receiving" );
1027
+ canvas_draw_str (canvas , 0 , 10 , screen_buf );
1028
+ if (ListenFields ) {
1029
+ char * p2 , * p = ListenFields ;
1030
+ uint8_t hex , len , * pld = payload_receive ;
1031
+ for (uint8_t i = 0 ; i < 5 && * p ; i ++ ) {
1032
+ hex = false;
1033
+ p2 = strchr (p , ',' );
1034
+ if (p2 == NULL ) p2 = p + strlen (p ); else if (* (p2 - 1 ) == '#' ) hex = true;
1035
+ memcpy (screen_buf , p , len = p2 - p );
1036
+ strcpy (screen_buf + len , ": " );
1037
+ if (ListenNew ) {
1038
+ len = payload_struct [i ];
1039
+ if (hex ) strcat (screen_buf , "0x" );
1040
+ else snprintf (screen_buf , strlen (screen_buf ), "%ld (" , get_payload_receive_field (len ));
1041
+ add_to_str_hex_bytes (screen_buf , pld , len );
1042
+ if (!hex ) strcat (screen_buf , ")" );
1043
+ pld += len ;
1044
+ }
1045
+ canvas_draw_str (canvas , 0 , 20 + i * 10 , screen_buf );
1046
+ if (* p2 == '\0' ) break ;
1047
+ p = p2 + 1 ;
1048
+ }
1049
+ }
978
1050
} else { // if(rw_type == rwt_read_batch || rw_type == rwt_write_batch)
979
1051
canvas_set_font (canvas , FontBatteryPercent ); // 5x7 font, 9 lines, 25 cols
980
1052
if (!ask_fill_screen_buf ()) {
@@ -1069,8 +1141,11 @@ void work_timer_callback(void* ctx)
1069
1141
for (uint8_t i = 0 ; i < 3 ; i ++ ) {
1070
1142
bool new = nrf24_read_newpacket ();
1071
1143
if (new ) {
1072
- if (send_status != sst_receiving ) break ;
1073
- } else if (furi_get_tick () - NRF_time > NRF_READ_TIMEOUT ) {
1144
+ if (rw_type == rwt_listen ) {
1145
+ furi_hal_rtc_get_datetime (& ListenLastTime );
1146
+ ListenNew = true;
1147
+ } else if (send_status != sst_receiving ) break ;
1148
+ } else if (rw_type != rwt_listen && furi_get_tick () - NRF_time > NRF_READ_TIMEOUT ) {
1074
1149
if (NRF_repeat ++ < NRF_resend ) {
1075
1150
send_status = sst_sending ;
1076
1151
nrf24_resend_read_packet ();
@@ -1192,11 +1267,11 @@ int32_t nrf24batch_app(void* p) {
1192
1267
else if (* (Edit_pos - 1 ) == ',' ) Edit_pos -= 2 ;
1193
1268
}
1194
1269
} else if (what_doing == 0 ) {
1195
- rw_type = rwt_write_batch ;
1270
+ rw_type = rwt_listen ;
1196
1271
what_doing = 1 ;
1197
1272
} else if (what_doing == 1 ) {
1198
1273
if (event .input .type == InputTypeShort ) {
1199
- if (-- rw_type > rwt_write_batch ) rw_type = rwt_write_batch ;
1274
+ if (-- rw_type > rwt_listen ) rw_type = rwt_listen ;
1200
1275
} else if (view_x ) view_x -- ;
1201
1276
} else if (what_doing == 2 ) {
1202
1277
if (view_x ) view_x -- ;
@@ -1224,7 +1299,7 @@ int32_t nrf24batch_app(void* p) {
1224
1299
what_doing = 1 ;
1225
1300
} else if (what_doing == 1 ) {
1226
1301
if (event .input .type == InputTypeShort ) {
1227
- if (++ rw_type > rwt_write_batch ) rw_type = rwt_read_batch ;
1302
+ if (++ rw_type > rwt_listen ) rw_type = rwt_read_batch ;
1228
1303
} else view_x ++ ;
1229
1304
} else if (what_doing == 2 ) {
1230
1305
view_x ++ ;
@@ -1331,6 +1406,15 @@ int32_t nrf24batch_app(void* p) {
1331
1406
view_Batch = 0 ;
1332
1407
what_doing = 2 ;
1333
1408
}
1409
+ } else if (rw_type == rwt_listen ) {
1410
+ free_Log ();
1411
+ prepare_nrf24 ();
1412
+ if (!NRF_ERROR ) {
1413
+ nrf24_set_rx_mode (nrf24_HANDLE );
1414
+ ListenNew = false;
1415
+ send_status = sst_receiving ; // receiving
1416
+ }
1417
+ what_doing = 2 ;
1334
1418
}
1335
1419
} else if (what_doing == 2 ) {
1336
1420
if (Log_Total ) {
@@ -1339,8 +1423,7 @@ int32_t nrf24batch_app(void* p) {
1339
1423
ask_question_answer = 0 ;
1340
1424
} else if (rw_type == rwt_write_batch ) {
1341
1425
if (!Edit ) {
1342
- Edit = 1 ;
1343
- Edited = true;
1426
+ Edit = 0 ;
1344
1427
Edit_hex = 0 ;
1345
1428
char * s = (char * )furi_string_get_cstr (Log [view_Batch ]);
1346
1429
char * p = strchr (s , '=' );
@@ -1351,8 +1434,14 @@ int32_t nrf24batch_app(void* p) {
1351
1434
p += 2 ;
1352
1435
Edit_hex = 1 ; // hex
1353
1436
}
1354
- Edit_start = Edit_pos = p ;
1355
- } else Edit = 0 ;
1437
+ if (is_digit (p , Edit_hex )) {
1438
+ Edit_start = p ;
1439
+ while (is_digit (p , Edit_hex )) p ++ ;
1440
+ Edit_pos = p - 1 ;
1441
+ Edited = true;
1442
+ Edit = 1 ;
1443
+ }
1444
+ }
1356
1445
}
1357
1446
}
1358
1447
}
@@ -1371,6 +1460,14 @@ int32_t nrf24batch_app(void* p) {
1371
1460
furi_string_left (fs , furi_string_size (fs ) - 1 );
1372
1461
}
1373
1462
}
1463
+ } else if (what_doing == 1 ) {
1464
+ if (rw_type == rwt_listen ) {
1465
+ NRF_INITED = false;
1466
+ Edit_start = ListenAddr ;
1467
+ Edit_pos = ListenAddr + strlen (ListenAddr ) - 1 ;
1468
+ Edit_hex = true;
1469
+ Edit = 1 ;
1470
+ }
1374
1471
} else if (what_doing == 2 && Log_Total ) {
1375
1472
if (rw_type == rwt_write_batch ) {
1376
1473
ask_question = ask_write_batch ;
0 commit comments