Skip to content

Commit 3101be2

Browse files
committed
NRF24_mini board support - 5V auto power on
1 parent 8438749 commit 3101be2

File tree

2 files changed

+68
-43
lines changed

2 files changed

+68
-43
lines changed

README.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ Flipper Zero application for nRF24L01 external board. Sends batch commands.
66
<br>
77
Сначала выбирается файл настройки с описанием команд.
88
Можно отредактировать адрес и номер канала.
9-
Затем стрелками влево или вправо выбирается нужный режим - Пакетное чтение (Read Batch), Чтение по одной команде (Read cmd), Пакетная запись (Write Batch).
10-
<br><br>
9+
Затем стрелками влево или вправо выбирается нужный режим - Пакетное чтение (Read Batch), Чтение по одной команде (Read cmd), Пакетная запись (Write Batch), Режим прослушивания адреса (Listen).
10+
<br>
1111
Есть два вида команд: запрос-ответ и запись.<br>
1212
Запрос-ответ (Read) - отправка пакета, переключение на прием и отображение на экране, что получили.<br>
1313
Запись (Write) - фактически отправка пакетов подряд с нужными данными.<br>
14-
<br><br>
14+
Режим прослушивания (Listen) - если в файле присутствует строка "Listen: <адрес>=<поле 1>,<поле 2>,...", где "поле.." название поля. Адрес пожно менять - долго нажать Ok.<br>
15+
<br>
1516
Формат пакета для отправки (payload) задается в виде размера полей структуры в байтах, например, так "Payload struct: 2,1,1", что означает структуру из 3 полей: 2 байта, 1 байт, 1 байт.<br>
1617
Полученный в ответ пакет (такой же длины как и отправленный) состоит из одного значения (остаток пакета не используется), размерность по умолчанию 1 байт (int8), при необходимости, она задается числом после '*' после имени команды.<br><br>
1718
Перед отправкой пакета, он заполняется сначала по шаблону по умолчанию "R default" для запроса чтения, "W default" - для записи.<br>

nrf24batch.c

+64-40
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.3"
17+
#define VERSION "1.4"
1818

1919
#define SCAN_APP_PATH_FOLDER "/ext/nrf24batch"
2020
#define LOG_FILEEXT ".txt"
@@ -84,15 +84,16 @@ uint8_t NRF_CRC; // 1 - No, 1 - CRC 1byte, 2 - CRC 2byte
8484
uint8_t NRF_RETR = ((0b0011<<4) | 0b1111); // Automatic Retransmission, ARD, ARC
8585
uint8_t NRF_Payload;// Payload len in bytes, 0..32
8686
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;
8889
uint8_t NRF_last_packet_send_st = 0;
8990
uint8_t NRF_resend = 1; // number of transaction attempts
9091
uint8_t NRF_repeat = 0; // count number of repeated requests (until < NRF_resend)
9192
uint32_t NRF_time;
9293
uint32_t delay_between_pkt = 10;// ms
9394

9495
uint8_t addr[5]; // nRF24 address, MSB first
95-
uint8_t addr_len; // 2..5
96+
uint8_t addr_len = 0; // 2..5
9697
uint8_t payload[32];
9798
uint8_t payload_receive[32];
9899
uint8_t payload_struct[32]; // sizeof(1..4) in bytes of each field, example: 2,1,1
@@ -112,7 +113,8 @@ FuriString *ReadDefault = NULL;
112113
FuriString *WriteDefault = NULL;
113114
FuriString *WriteStart = NULL;
114115
FuriString *Constants = NULL; // text of STR=x
115-
char *ListenAddr = NULL;
116+
uint8_t listen_addr[5];
117+
uint8_t listen_addr_len = 0;
116118
char *ListenFields = NULL; // ptr to string: field1,field2,... max 5 field now
117119
bool ListenNew;
118120
FuriHalRtcDateTime ListenLastTime = { 0 };
@@ -152,7 +154,7 @@ static bool ask_fill_screen_buf(void)
152154
//#define MIN(a, b) ((a<b)?a:b)
153155

154156
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)));
156158
}
157159

158160
static bool is_digit(char *ptr, bool hex)
@@ -245,10 +247,6 @@ void free_store(void)
245247
furi_string_free(WriteStart);
246248
WriteDefault = NULL;
247249
}
248-
if(ListenAddr) {
249-
free(ListenAddr);
250-
ListenAddr = NULL;
251-
}
252250
if(ListenFields) {
253251
free(ListenFields);
254252
ListenFields = NULL;
@@ -307,7 +305,30 @@ static bool select_settings_file() {
307305

308306
static void prepare_nrf24(void)
309307
{
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+
}
311332
nrf24_write_reg(nrf24_HANDLE, REG_RF_CH, NRF_channel);
312333
nrf24_write_reg(nrf24_HANDLE, REG_RF_SETUP, (NRF_rate == 0 ? 0b00100000 : NRF_rate == 1 ? 0 : 0b00001000) | 0b111); // +TX high power
313334
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)
316337
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
317338
nrf24_write_reg(nrf24_HANDLE, REG_DYNPD, NRF_DPL ? 0x3F : 0); // Enable dynamic payload reg
318339
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);
330342
nrf24_write_reg(nrf24_HANDLE, REG_EN_RXADDR, 1);
331343
//nrf24_set_idle(nrf24_HANDLE);
332344
NRF_INITED = true;
@@ -818,16 +830,11 @@ static uint8_t load_settings_file() {
818830
p += sizeof(SettingsFld_Listen);
819831
char *p2 = strchr(p, '=');
820832
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);
831838
}
832839
}
833840
}
@@ -981,7 +988,12 @@ static void render_callback(Canvas* const canvas, void* ctx) {
981988
canvas_set_font(canvas, FontSecondary); // 8x10 font, 6 lines
982989
canvas_draw_str(canvas, 0, 10, "Listen mode");
983990
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+
}
985997
} else {
986998
canvas_set_font(canvas, FontBatteryPercent); // 5x7 font, 9 lines, 25 cols
987999
if(rw_type == rwt_read_batch) {
@@ -1031,7 +1043,8 @@ static void render_callback(Canvas* const canvas, void* ctx) {
10311043
for(uint8_t i = 0; i < 5 && *p; i++) {
10321044
hex = false;
10331045
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;
10351048
memcpy(screen_buf, p, len = p2 - p);
10361049
strcpy(screen_buf + len, ": ");
10371050
if(ListenNew) {
@@ -1178,7 +1191,6 @@ int32_t nrf24batch_app(void* p) {
11781191
free(APP->plugin_state);
11791192
return 255;
11801193
}
1181-
nrf24_init();
11821194

11831195
// Set system callbacks
11841196
APP->view_port = view_port_alloc();
@@ -1194,6 +1206,12 @@ int32_t nrf24batch_app(void* p) {
11941206
file_stream = file_stream_alloc(APP->storage);
11951207
FuriTimer *work_timer = furi_timer_alloc(work_timer_callback, FuriTimerTypePeriodic, NULL);
11961208
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();
11971215

11981216
PluginEvent event;
11991217
for(bool processing = true; processing;) {
@@ -1337,8 +1355,8 @@ int32_t nrf24batch_app(void* p) {
13371355
}
13381356
ask_question = 0;
13391357
} 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)) {
13421360
memmove(Edit_pos + 1, Edit_pos, strlen(Edit_pos) + 1);
13431361
*Edit_pos = '0';
13441362
}
@@ -1448,7 +1466,7 @@ int32_t nrf24batch_app(void* p) {
14481466
}
14491467
} else if(event.input.type == InputTypeLong) {
14501468
if(Edit) { // delete
1451-
if(what_doing == 0) {
1469+
if(what_doing <= 1) {
14521470
if(strlen(Edit_start) > 1) {
14531471
memmove(Edit_pos, Edit_pos + 1, strlen(Edit_pos) + 1);
14541472
if(*Edit_pos == '\0') Edit_pos--;
@@ -1462,11 +1480,14 @@ int32_t nrf24batch_app(void* p) {
14621480
}
14631481
} else if(what_doing == 1) {
14641482
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);
14681486
Edit_hex = true;
1487+
Edit_pos = ebuf + strlen(ebuf) - 1;
1488+
Edit_start = ebuf;
14691489
Edit = 1;
1490+
NRF_INITED = false;
14701491
}
14711492
} else if(what_doing == 2 && Log_Total) {
14721493
if(rw_type == rwt_write_batch) {
@@ -1495,6 +1516,8 @@ int32_t nrf24batch_app(void* p) {
14951516
NRF_channel = str_to_int((char*)payload);
14961517
if(NRF_channel > MAX_CHANNEL) NRF_channel = MAX_CHANNEL;
14971518
}
1519+
} else if(what_doing == 1 && rw_type == rwt_listen) {
1520+
listen_addr_len = ConvertHexToArray((char*)payload, listen_addr, 5);
14981521
}
14991522
Edit = 0;
15001523
} else {
@@ -1522,6 +1545,7 @@ int32_t nrf24batch_app(void* p) {
15221545
}
15231546
nrf24_set_idle(nrf24_HANDLE);
15241547
nrf24_deinit();
1548+
if(NRF_BOARD_POWER_5V) furi_hal_power_disable_otg();
15251549

15261550
view_port_enabled_set(APP->view_port, false);
15271551
gui_remove_view_port(APP->gui, APP->view_port);

0 commit comments

Comments
 (0)