Skip to content

Commit 8438749

Browse files
committed
listen mode
1 parent 0dbf1a1 commit 8438749

File tree

2 files changed

+143
-44
lines changed

2 files changed

+143
-44
lines changed

Distr/nrf24batch/CO2_mini.txt

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ R default: ,EEPROM,0xC1
1515
W default: n,,0x81
1616
Write start: 0,0,0x8F
1717

18+
Listen: C8C8C1=CO2,Alarm,-
19+
1820
R: ID*=,ID
1921
R: OSCCAL=0x51,RAM
2022
R: OSCCAL_EMEM=0

nrf24batch.c

+141-44
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include <u8g2.h>
1515

1616
#define TAG "nrf24batch"
17-
#define VERSION "1.2"
17+
#define VERSION "1.3"
1818

1919
#define SCAN_APP_PATH_FOLDER "/ext/nrf24batch"
2020
#define LOG_FILEEXT ".txt"
@@ -41,17 +41,19 @@ const char SettingsFld_Write[] = "W:"; // Write cmd
4141
const char SettingsFld_Set[] = "S:"; // Set cmd (like Write but without "Write start" packet)
4242
const char SettingsFld_ReadBatch[] = "RBatch:";
4343
const char SettingsFld_WriteBatch[] = "WBatch:";
44+
const char SettingsFld_Listen[] = "Listen:";
4445
const char AskQuestion_Save[] = "SAVE BATCH?";
4546
#define Settings_i 'i'
4647
#define Settings_n 'n'
4748
#define VAR_EMPTY ((int32_t)0x80000000)
4849

4950
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
5152
enum {
5253
rwt_read_batch = 0,
5354
rwt_read_cmd,
54-
rwt_write_batch
55+
rwt_write_batch,
56+
rwt_listen
5557
};
5658
uint8_t rw_type = rwt_read_batch; // What to do: rwt_*
5759
enum {
@@ -110,6 +112,10 @@ FuriString *ReadDefault = NULL;
110112
FuriString *WriteDefault = NULL;
111113
FuriString *WriteStart = NULL;
112114
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 };
113119
FuriString **Read_cmd = NULL; // Names of read cmd
114120
uint16_t Read_cmd_Total = 0;
115121
FuriString **Log = NULL; // Strings: var=n
@@ -201,6 +207,14 @@ static void add_to_str_hex_bytes(char *out, uint8_t *arr, int bytes)
201207
} while(--bytes);
202208
}
203209

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+
204218
void free_Log()
205219
{
206220
if(Log_Total) {
@@ -231,6 +245,14 @@ void free_store(void)
231245
furi_string_free(WriteStart);
232246
WriteDefault = NULL;
233247
}
248+
if(ListenAddr) {
249+
free(ListenAddr);
250+
ListenAddr = NULL;
251+
}
252+
if(ListenFields) {
253+
free(ListenFields);
254+
ListenFields = NULL;
255+
}
234256
if(Read_cmd_Total) {
235257
for(uint16_t i = 0; i < Read_cmd_Total; i++) furi_string_free(Read_cmd[i]);
236258
Read_cmd_Total = 0;
@@ -370,11 +392,7 @@ bool nrf24_read_newpacket() {
370392
if(size > 4) size = 0;
371393
}
372394
}
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);
378396
//FURI_LOG_D(TAG, "VAR(%d): %ld", size, var);
379397
if(size == 0) furi_string_cat_printf(str, "%c", (char)var);
380398
else {
@@ -710,7 +728,7 @@ static uint8_t load_settings_file() {
710728
char *p = (char*)furi_string_get_cstr(str);
711729
if(*p <= ' ') continue;
712730
//char* delim_eq = strchr(p, '=');
713-
char* delim_col = strchr(p, ':');
731+
char *delim_col = strchr(p, ':');
714732
if(delim_col == NULL) { // Constant found - no ':'
715733
if(Constants == NULL) {
716734
Constants = furi_string_alloc_set(str);
@@ -796,6 +814,21 @@ static uint8_t load_settings_file() {
796814
break;
797815
}
798816
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+
}
799832
}
800833
}
801834
}
@@ -893,6 +926,22 @@ void display_remove_asterisk(char *fsp, uint8_t vx)
893926
}
894927
}
895928

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+
896945
static void render_callback(Canvas* const canvas, void* ctx) {
897946
const PluginState* plugin_state = acquire_mutex((ValueMutex*)ctx, 25);
898947
if(plugin_state == NULL) return;
@@ -903,20 +952,8 @@ static void render_callback(Canvas* const canvas, void* ctx) {
903952
canvas_draw_str(canvas, 8, 10, screen_buf);
904953
if(addr_len) {
905954
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);
920957
}
921958
if(!Edit || setup_cursor != 1) {
922959
screen_buf[0] = '\0';
@@ -940,19 +977,25 @@ static void render_callback(Canvas* const canvas, void* ctx) {
940977
canvas_draw_str(canvas, 0, 10, ">");
941978
}
942979
} 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+
}
954998
}
955-
if(NRF_ERROR) canvas_draw_str(canvas, 70, 7, "nRF24 ERROR!");
956999
} else { // what_doing == 2
9571000
if(rw_type == rwt_read_cmd) { // Read command
9581001
canvas_set_font(canvas, FontSecondary); // 8x10 font, 6 lines
@@ -975,6 +1018,35 @@ static void render_callback(Canvas* const canvas, void* ctx) {
9751018
canvas_draw_str(canvas, 0, 15 + 10, screen_buf);
9761019
}
9771020

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+
}
9781050
} else { // if(rw_type == rwt_read_batch || rw_type == rwt_write_batch)
9791051
canvas_set_font(canvas, FontBatteryPercent); // 5x7 font, 9 lines, 25 cols
9801052
if(!ask_fill_screen_buf()) {
@@ -1069,8 +1141,11 @@ void work_timer_callback(void* ctx)
10691141
for(uint8_t i = 0; i < 3; i++) {
10701142
bool new = nrf24_read_newpacket();
10711143
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) {
10741149
if(NRF_repeat++ < NRF_resend) {
10751150
send_status = sst_sending;
10761151
nrf24_resend_read_packet();
@@ -1192,11 +1267,11 @@ int32_t nrf24batch_app(void* p) {
11921267
else if(*(Edit_pos - 1) == ',') Edit_pos -= 2;
11931268
}
11941269
} else if(what_doing == 0) {
1195-
rw_type = rwt_write_batch;
1270+
rw_type = rwt_listen;
11961271
what_doing = 1;
11971272
} else if(what_doing == 1) {
11981273
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;
12001275
} else if(view_x) view_x--;
12011276
} else if(what_doing == 2) {
12021277
if(view_x) view_x--;
@@ -1224,7 +1299,7 @@ int32_t nrf24batch_app(void* p) {
12241299
what_doing = 1;
12251300
} else if(what_doing == 1) {
12261301
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;
12281303
} else view_x++;
12291304
} else if(what_doing == 2) {
12301305
view_x++;
@@ -1331,6 +1406,15 @@ int32_t nrf24batch_app(void* p) {
13311406
view_Batch = 0;
13321407
what_doing = 2;
13331408
}
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;
13341418
}
13351419
} else if(what_doing == 2) {
13361420
if(Log_Total) {
@@ -1339,8 +1423,7 @@ int32_t nrf24batch_app(void* p) {
13391423
ask_question_answer = 0;
13401424
} else if(rw_type == rwt_write_batch) {
13411425
if(!Edit) {
1342-
Edit = 1;
1343-
Edited = true;
1426+
Edit = 0;
13441427
Edit_hex = 0;
13451428
char *s = (char*)furi_string_get_cstr(Log[view_Batch]);
13461429
char *p = strchr(s, '=');
@@ -1351,8 +1434,14 @@ int32_t nrf24batch_app(void* p) {
13511434
p += 2;
13521435
Edit_hex = 1; // hex
13531436
}
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+
}
13561445
}
13571446
}
13581447
}
@@ -1371,6 +1460,14 @@ int32_t nrf24batch_app(void* p) {
13711460
furi_string_left(fs, furi_string_size(fs) - 1);
13721461
}
13731462
}
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+
}
13741471
} else if(what_doing == 2 && Log_Total) {
13751472
if(rw_type == rwt_write_batch) {
13761473
ask_question = ask_write_batch;

0 commit comments

Comments
 (0)