Просмотр исходного кода

view addresses on long press OK in the packets list

vad7 3 лет назад
Родитель
Сommit
ca6757a5d8
2 измененных файлов с 91 добавлено и 42 удалено
  1. 8 2
      README.md
  2. 83 40
      nrf24scan.c

+ 8 - 2
README.md

@@ -16,8 +16,14 @@ P2: address pipe #2, LSB in hex (1 byte)   <br>
 P3: address pipe #3, LSB in hex (1 byte)   <br>
 P4: address pipe #4, LSB in hex (1 byte)   <br>
 P5: address pipe #5, LSB in hex (1 byte)   <br>
-captured data in raw format, first byte = address # 0..5, Payload len if DPL   
-... up to MAX_LOG_RECORDS-1                                                    
+captured data in raw format, first byte = address # 0..5, Payload len if DPL<br>
+... up to MAX_LOG_RECORDS-1<br>
+<br><br>
+In the list of the received:<br>
+Press OK - send the packet,<br>
+Long press OK - view addresses.<br>
+<br>
+<br>
 <br>
 <br>
 <img src="https://raw.githubusercontent.com/vad7/nrf24scan/master/Screenshot-1.png">

+ 83 - 40
nrf24scan.c

@@ -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);
 	}