|
|
@@ -1,6 +1,6 @@
|
|
|
//
|
|
|
// Written by vad7, 20.11.2022.
|
|
|
-// ver. 1.1
|
|
|
+// ver. 1.2
|
|
|
//
|
|
|
#include "nrf24scan.h"
|
|
|
|
|
|
@@ -50,6 +50,7 @@ char SettingsFld_Addr = 'P';
|
|
|
Nrf24Scan* APP;
|
|
|
uint8_t what_doing = 0; // 0 - setup, 1 - view log, 2 - view addresses
|
|
|
uint8_t what_to_do = 1; // 0 - view, 1 - view & scan
|
|
|
+uint32_t key_press_seq_ok = 0;
|
|
|
char screen_buf[64];
|
|
|
char addr_file_name[32];
|
|
|
uint8_t NRF_rate = 1; // 0 - 250Kbps, 1 - 1Mbps, 2 - 2Mbps
|
|
|
@@ -91,7 +92,7 @@ enum {
|
|
|
Menu_ok
|
|
|
};
|
|
|
|
|
|
-#define MIN(a, b) ((a<b)?a:b)
|
|
|
+//#define MIN(a, b) ((a<b)?a:b)
|
|
|
|
|
|
static uint8_t GetHexVal(char hex) {
|
|
|
return (uint8_t)hex - ((uint8_t)hex < 58 ? 48 : ((uint8_t)hex < 97 ? 55 : 87));
|
|
|
@@ -100,13 +101,14 @@ static uint8_t GetHexVal(char hex) {
|
|
|
// Return num bytes in array
|
|
|
static uint8_t ConvertHexToArray(char * hex, uint8_t * array, uint8_t maxlen) {
|
|
|
uint8_t len = 0;
|
|
|
- do {
|
|
|
+ while(maxlen) {
|
|
|
uint8_t ch = *hex++;
|
|
|
if(ch == 0) break;
|
|
|
if(ch < '0') continue;
|
|
|
*array++ = (GetHexVal(ch) << 4) + GetHexVal(*hex++);
|
|
|
len++;
|
|
|
- } while(--maxlen);
|
|
|
+ maxlen--;
|
|
|
+ }
|
|
|
return len;
|
|
|
}
|
|
|
|
|
|
@@ -198,7 +200,7 @@ void write_to_log_file(Storage* storage)
|
|
|
int i = 0;
|
|
|
for(; i < log_arr_idx; i++) {
|
|
|
furi_string_reset(str);
|
|
|
- add_to_furi_str_hex_bytes(str, (char*)APP->log_arr + i * LOG_REC_SIZE, LOG_REC_SIZE);
|
|
|
+ add_to_furi_str_hex_bytes(str, (char*)APP->log_arr + i * LOG_REC_SIZE, MIN(NRF_Payload + 1, LOG_REC_SIZE));
|
|
|
furi_string_cat(str, "\n");
|
|
|
if(stream_write_string(file_stream, str) != furi_string_size(str)) {
|
|
|
FURI_LOG_E(TAG, "Failed to write to log!");
|
|
|
@@ -252,24 +254,25 @@ static bool select_settings_file(Stream* stream) {
|
|
|
static uint8_t load_settings_file(Stream* file_stream) {
|
|
|
size_t file_size = 0;
|
|
|
char* file_buf;
|
|
|
- bool loaded = false;
|
|
|
+ uint8_t err = 5;
|
|
|
file_size = stream_size(file_stream);
|
|
|
if(file_size == (size_t)0) {
|
|
|
FURI_LOG_D(TAG, "load failed. file_size: %d", file_size);
|
|
|
return 1;
|
|
|
}
|
|
|
- file_buf = malloc(MIN(file_size + 1, LOG_REC_SIZE * MAX_LOG_RECORDS * 2 + 100));
|
|
|
+ file_size = MIN(file_size, LOG_REC_SIZE * MAX_LOG_RECORDS * 2 + 100);
|
|
|
+ file_buf = malloc(file_size + 1);
|
|
|
if(file_buf == NULL) {
|
|
|
FURI_LOG_D(TAG, "Memory low, need: %d", file_size);
|
|
|
return 2;
|
|
|
}
|
|
|
- memset(file_buf, 0, file_size);
|
|
|
+ memset(file_buf, 0, file_size + 1);
|
|
|
if(stream_read(file_stream, (uint8_t*)file_buf, file_size) == file_size) {
|
|
|
FURI_LOG_D(TAG, "Loading settings file");
|
|
|
char* line_ptr = file_buf;
|
|
|
int16_t line_num = 0;
|
|
|
memset((uint8_t*)&addrs, 0, sizeof(addrs));
|
|
|
- bool log_loaded = 3;
|
|
|
+ bool log_loaded = false;
|
|
|
while(line_ptr && line_ptr - file_buf < file_size) {
|
|
|
char* end_ptr = strstr((char*)line_ptr, "\n");
|
|
|
if(end_ptr == NULL) end_ptr = file_buf + file_size; else *end_ptr = '\0';
|
|
|
@@ -303,7 +306,7 @@ static uint8_t load_settings_file(Stream* file_stream) {
|
|
|
case '0':
|
|
|
addrs.addr_len = ConvertHexToArray(line_ptr, addrs.addr_P0, 5);
|
|
|
FURI_LOG_D(TAG, " +Addr(%d): %02X%02X%02X...", addrs.addr_len, addrs.addr_P0[0], addrs.addr_P0[1], addrs.addr_P0[2]);
|
|
|
- loaded = true;
|
|
|
+ if(addrs.addr_len >= 2) err = 0;
|
|
|
break;
|
|
|
case '1':
|
|
|
ConvertHexToArray(line_ptr, addrs.addr_P1, 5);
|
|
|
@@ -326,14 +329,14 @@ static uint8_t load_settings_file(Stream* file_stream) {
|
|
|
break;
|
|
|
}
|
|
|
if(a) addrs.addr_count = a - '0' + 1;
|
|
|
- } else if(line_len >= LOG_REC_SIZE * 2) { // data
|
|
|
+ } else if(line_len >= (NRF_Payload + 1) * 2) { // data
|
|
|
if(!log_loaded) {
|
|
|
clear_log();
|
|
|
what_to_do = 0;
|
|
|
- log_loaded = 0;
|
|
|
+ log_loaded = true;
|
|
|
}
|
|
|
if(log_arr_idx < MAX_LOG_RECORDS - 1) {
|
|
|
- ConvertHexToArray(line_ptr, APP->log_arr + log_arr_idx * LOG_REC_SIZE, LOG_REC_SIZE);
|
|
|
+ ConvertHexToArray(line_ptr, APP->log_arr + log_arr_idx * LOG_REC_SIZE, MIN(NRF_Payload, 32));
|
|
|
log_arr_idx++;
|
|
|
}
|
|
|
}
|
|
|
@@ -342,10 +345,10 @@ static uint8_t load_settings_file(Stream* file_stream) {
|
|
|
}
|
|
|
} else {
|
|
|
FURI_LOG_D(TAG, "load failed. file size: %d", file_size);
|
|
|
- loaded = 4;
|
|
|
+ err = 4;
|
|
|
}
|
|
|
free(file_buf);
|
|
|
- return loaded;
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) {
|
|
|
@@ -368,7 +371,7 @@ static void prepare_nrf24()
|
|
|
for(int i = 0; i < addrs.addr_len; i++) addr[i] = addrs.addr_P0[addrs.addr_len - i - 1];
|
|
|
nrf24_write_buf_reg(nrf24_HANDLE, REG_RX_ADDR_P0, &addr[0], addrs.addr_len);
|
|
|
nrf24_write_reg(nrf24_HANDLE, RX_PW_P0, NRF_Payload);
|
|
|
- if(addrs.addr_count == 1) nrf24_write_reg(nrf24_HANDLE, REG_DYNPD, NRF_DPL ? (1<<0) : 0); // Enable dynamic payload reg
|
|
|
+ if(addrs.addr_count > 0) nrf24_write_reg(nrf24_HANDLE, REG_DYNPD, NRF_DPL ? (1<<0) : 0); // Enable dynamic payload reg
|
|
|
if(addrs.addr_count > 1) {
|
|
|
for(int i = 0; i < addrs.addr_len; i++) addr[i] = addrs.addr_P1[addrs.addr_len - i - 1];
|
|
|
nrf24_write_buf_reg(nrf24_HANDLE, REG_RX_ADDR_P1, &addr[0], addrs.addr_len);
|
|
|
@@ -486,7 +489,7 @@ static void render_callback(Canvas* const canvas, void* ctx) {
|
|
|
snprintf(screen_buf, sizeof(screen_buf), "%s (pipes: %d)", what_to_do ? "Start scan" : "View log", addrs.addr_count); // menu_selected = 5
|
|
|
canvas_draw_str(canvas, 10, 60, screen_buf);
|
|
|
canvas_draw_str(canvas, 0, menu_selected * 10 + 10, ">");
|
|
|
- } else {
|
|
|
+ } else if(what_doing == 1){
|
|
|
canvas_set_font(canvas, FontBatteryPercent); // 5x7 font, 9 lines
|
|
|
bool ch2 = false;
|
|
|
screen_buf[0] = '\0';
|
|
|
@@ -502,7 +505,10 @@ static void render_callback(Canvas* const canvas, void* ctx) {
|
|
|
if(view_log_arr_idx >= log_arr_idx) view_log_arr_idx = log_arr_idx - 1;
|
|
|
uint16_t page = view_log_arr_idx & ~7;
|
|
|
for(uint8_t i = 0; i < 8 && page + i < log_arr_idx; i++) {
|
|
|
- snprintf(screen_buf, sizeof(screen_buf), "%d:%c", page + i + 1, (view_log_arr_idx & 7) != i ? ' ' : last_packet_send != view_log_arr_idx ? '>' : last_packet_send_st ? '+' : '!');
|
|
|
+ snprintf(screen_buf, sizeof(screen_buf), "%d:", page + i + 1);
|
|
|
+ canvas_draw_str(canvas, 0, 14 + i * 7, screen_buf);
|
|
|
+ screen_buf[0] = (view_log_arr_idx & 7) != i ? ' ' : last_packet_send != view_log_arr_idx ? '>' : last_packet_send_st ? '*' : '!';
|
|
|
+ screen_buf[1] = '\0';
|
|
|
char *ptr = (char*)APP->log_arr + (page + i) * LOG_REC_SIZE;
|
|
|
uint8_t dpl = *ptr++;
|
|
|
uint8_t pipe = dpl & 7;
|
|
|
@@ -519,9 +525,41 @@ static void render_callback(Canvas* const canvas, void* ctx) {
|
|
|
add_to_str_hex_bytes(screen_buf, ptr, count);
|
|
|
}
|
|
|
}
|
|
|
- canvas_draw_str(canvas, 0, 14 + i * 7, screen_buf);
|
|
|
+ canvas_draw_str(canvas, 3 * 5, 14 + i * 7, screen_buf);
|
|
|
}
|
|
|
}
|
|
|
+ } else {
|
|
|
+ canvas_set_font(canvas, FontBatteryPercent); // 5x7 font
|
|
|
+ if(addrs.addr_count > 0) {
|
|
|
+ snprintf(screen_buf, sizeof(screen_buf), "P0: ");
|
|
|
+ add_to_str_hex_bytes(screen_buf, (char*)addrs.addr_P0, addrs.addr_len);
|
|
|
+ canvas_draw_str(canvas, 0, 10, screen_buf);
|
|
|
+ }
|
|
|
+ if(addrs.addr_count > 1) {
|
|
|
+ snprintf(screen_buf, sizeof(screen_buf), "P1: ");
|
|
|
+ add_to_str_hex_bytes(screen_buf, (char*)addrs.addr_P1, addrs.addr_len);
|
|
|
+ canvas_draw_str(canvas, 0, 20, screen_buf);
|
|
|
+ }
|
|
|
+ if(addrs.addr_count > 2) {
|
|
|
+ canvas_draw_str(canvas, 0, 30, "P2: ");
|
|
|
+ snprintf(screen_buf, sizeof(screen_buf), "%02X", addrs.addr_P2);
|
|
|
+ canvas_draw_str(canvas, (4 + (addrs.addr_len - 1) * 2) * 5, 30, screen_buf);
|
|
|
+ }
|
|
|
+ if(addrs.addr_count > 3) {
|
|
|
+ canvas_draw_str(canvas, 0, 40, "P3: ");
|
|
|
+ snprintf(screen_buf, sizeof(screen_buf), "%02X", addrs.addr_P3);
|
|
|
+ canvas_draw_str(canvas, (4 + (addrs.addr_len - 1) * 2) * 5, 40, screen_buf);
|
|
|
+ }
|
|
|
+ if(addrs.addr_count > 4) {
|
|
|
+ canvas_draw_str(canvas, 0, 50, "P4: ");
|
|
|
+ snprintf(screen_buf, sizeof(screen_buf), "%02X", addrs.addr_P4);
|
|
|
+ canvas_draw_str(canvas, (4 + (addrs.addr_len - 1) * 2) * 5, 50, screen_buf);
|
|
|
+ }
|
|
|
+ if(addrs.addr_count > 5) {
|
|
|
+ canvas_draw_str(canvas, 0, 60, "P5: ");
|
|
|
+ snprintf(screen_buf, sizeof(screen_buf), "%02X", addrs.addr_P5);
|
|
|
+ canvas_draw_str(canvas, (4 + (addrs.addr_len - 1) * 2) * 5, 60, screen_buf);
|
|
|
+ }
|
|
|
}
|
|
|
release_mutex((ValueMutex*)ctx, plugin_state);
|
|
|
}
|
|
|
@@ -576,12 +614,13 @@ int32_t nrf24scan_app(void* p) {
|
|
|
if(event_status == FuriStatusOk) {
|
|
|
// press events
|
|
|
if(event.type == EventTypeKey) {
|
|
|
+ //FURI_LOG_D(TAG, "Key: %d Type: %d Sec: %u", event.input.key, event.input.type, event.input.sequence);
|
|
|
switch(event.input.key) {
|
|
|
case InputKeyUp:
|
|
|
if(event.input.type == InputTypePress || event.input.type == InputTypeRepeat) {
|
|
|
if(what_doing == 0) {
|
|
|
if(menu_selected > 0) menu_selected--; else menu_selected = menu_selected_max;
|
|
|
- } else {
|
|
|
+ } else if(what_doing == 1) {
|
|
|
view_log_arr_idx -= event.input.type == InputTypeRepeat ? 10 : 1;
|
|
|
if(view_log_arr_idx >= log_arr_idx) view_log_arr_idx = 0;
|
|
|
}
|
|
|
@@ -591,7 +630,7 @@ int32_t nrf24scan_app(void* p) {
|
|
|
if(event.input.type == InputTypePress || event.input.type == InputTypeRepeat) {
|
|
|
if(what_doing == 0) {
|
|
|
if(menu_selected < menu_selected_max) menu_selected++; else menu_selected = 0;
|
|
|
- } else {
|
|
|
+ } else if(what_doing == 1) {
|
|
|
view_log_arr_idx += event.input.type == InputTypeRepeat ? 10 : 1;
|
|
|
if(view_log_arr_idx >= log_arr_idx) view_log_arr_idx = log_arr_idx - 1;
|
|
|
}
|
|
|
@@ -619,7 +658,7 @@ int32_t nrf24scan_app(void* p) {
|
|
|
what_to_do = !what_to_do;
|
|
|
break;
|
|
|
}
|
|
|
- } else {
|
|
|
+ } else if(what_doing == 1) {
|
|
|
if(view_log_arr_x < VIEW_LOG_MAX_X) view_log_arr_x++;
|
|
|
}
|
|
|
}
|
|
|
@@ -647,7 +686,7 @@ int32_t nrf24scan_app(void* p) {
|
|
|
what_to_do = !what_to_do;
|
|
|
break;
|
|
|
}
|
|
|
- } else {
|
|
|
+ } else if(what_doing == 1) {
|
|
|
if(view_log_arr_x > 0) view_log_arr_x--;
|
|
|
}
|
|
|
}
|
|
|
@@ -674,23 +713,19 @@ int32_t nrf24scan_app(void* p) {
|
|
|
if(++NRF_CRC > 2) NRF_CRC = 0;
|
|
|
break;
|
|
|
case Menu_ok:
|
|
|
- what_doing = !what_doing;
|
|
|
- if(what_doing) {
|
|
|
- if(what_to_do) {
|
|
|
- if(addrs.addr_count == 0) what_doing = 0;
|
|
|
- else {
|
|
|
- if(log_to_file == -1) {
|
|
|
- clear_log();
|
|
|
- save_to_new_log = true;
|
|
|
- } else if(log_to_file == 1) save_to_new_log = true;
|
|
|
- start_scanning();
|
|
|
- }
|
|
|
+ if(what_to_do) {
|
|
|
+ if(addrs.addr_count) {
|
|
|
+ what_doing = 1;
|
|
|
+ if(log_to_file == -1) {
|
|
|
+ clear_log();
|
|
|
+ save_to_new_log = true;
|
|
|
+ } else if(log_to_file == 1) save_to_new_log = true;
|
|
|
+ start_scanning();
|
|
|
}
|
|
|
- } else nrf24_set_idle(nrf24_HANDLE);
|
|
|
+ } else what_doing = 1;
|
|
|
+ key_press_seq_ok = event.input.sequence;
|
|
|
break;
|
|
|
}
|
|
|
- } else { // Send
|
|
|
- nrf24_send_packet();
|
|
|
}
|
|
|
} else if(event.input.type == InputTypeLong) {
|
|
|
if(what_doing == 0) {
|
|
|
@@ -702,13 +737,20 @@ int32_t nrf24scan_app(void* p) {
|
|
|
}
|
|
|
nrf24_set_idle(nrf24_HANDLE);
|
|
|
} else if(what_doing == 1) {
|
|
|
-
|
|
|
+ what_doing = 2;
|
|
|
+ }
|
|
|
+ } else if(event.input.type == InputTypeRelease) {
|
|
|
+ if(what_doing == 1 && key_press_seq_ok != event.input.sequence) { // Send
|
|
|
+ nrf24_send_packet();
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case InputKeyBack:
|
|
|
- if(event.input.type == InputTypeLong) processing = false; else what_doing = 0;
|
|
|
- nrf24_set_idle(nrf24_HANDLE);
|
|
|
+ if(event.input.type == InputTypeLong) processing = false;
|
|
|
+ else if(event.input.type == InputTypeRelease) {
|
|
|
+ if(what_doing) what_doing--;
|
|
|
+ if(what_doing == 0) nrf24_set_idle(nrf24_HANDLE);;
|
|
|
+ }
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
@@ -726,6 +768,7 @@ int32_t nrf24scan_app(void* p) {
|
|
|
view_port_update(APP->view_port);
|
|
|
release_mutex(&state_mutex, plugin_state);
|
|
|
}
|
|
|
+ nrf24_set_idle(nrf24_HANDLE);
|
|
|
if(log_arr_idx && (log_to_file == 1 || log_to_file == 2)) {
|
|
|
write_to_log_file(APP->storage);
|
|
|
}
|