vad7 2 лет назад
Родитель
Сommit
7c5cc8ccce
5 измененных файлов с 51 добавлено и 27 удалено
  1. 1 1
      Distr/nrf24batch/CO2_mini.txt
  2. 17 9
      Distr/nrf24batch/Kitchen Vent.txt
  3. 5 5
      README.md
  4. 5 0
      descript.txt
  5. 23 12
      nrf24batch.c

+ 1 - 1
Distr/nrf24batch/CO2_mini.txt

@@ -7,7 +7,7 @@ DPL: 0
 RETR: 0x0F
 Resend: 3
 Delay_ms: 30
-Listen repeat: 3
+ReadCmd repeat: 3
 
 Payload struct: 2,1,1
 EEPROM=0; RAM=1; PROGMEM=2; ID=3; RESET=4; WRAM=0x89

+ 17 - 9
Distr/nrf24batch/Kitchen Vent.txt

@@ -20,8 +20,12 @@ R: ID*=,ID
 R: CO2 level*2[3]=i:4,,R2
 W: CO2 level*2=,i:4,W2
 
+R: Fan speeds=25
+W: Fan speeds=,25
 R: FanSpeed[3]=i:19
 W: FanSpeed=,i:19
+R: FanCook speeds=26
+W: FanCook speeds=,26
 R: FanCookSpeed[3]=i:22
 W: FanCookSpeed=,i:22
 
@@ -52,8 +56,8 @@ W: SpeedKeyIdx=,17
 R: IRRemotes=32
 W: IRRemotes=,32
 
-R: IRRemotesHash*2[80]=i:32#,,R2
-W: IRRemotesHash*2=,i:32,W2
+R: IRRemotesHash*2[70]=i:33,,R2#
+W: IRRemotesHash*2=,i:33,W2
 
 R: OutPeriod=18
 W: OutPeriod=,18
@@ -67,24 +71,27 @@ W: RxAddr=,2
 R: Ch=3
 W: Ch=,3
 
+R: OSCCAL_EMEM=0
 R: _OSCCAL=0x51,RAM
 W: _OSCCAL=,0x51,WRAM
-R: OSCCAL_EMEM=0      				
 
 R: _PORTA=0x39,RAM
 W: _PORTA=,0x3B,WRAM
 R: _PORTB=0x36,RAM
 W: _PORTB=,0x38,WRAM
 
-R: _LED Warning=0x6B,RAM
-W: _LED Warning=,0x6B,WRAM
+R: _OutPeriod=0x8B,RAM
+W: _OutPeriod=,0x8B,WRAM
 
+R: _Fanspeed=0x74,RAM
 R: _FanOn=0x75,RAM
 R: _FanOnNext=0x73,RAM
 R: _FanOnNextCnt=0x71,RAM
 R: _FanOnLast=0x72,RAM
-R: _Fanspeed=0x74,RAM
-R: _IRHashLast*2=0x79,RAM,R2
+R: _IRHashLast*2=0x79,RAM,R2#
+
+R: _LED Warning=0x6B,RAM
+W: _LED Warning=,0x6B,WRAM
 
 W: Reset=,RESET,0xC1
 
@@ -109,11 +116,12 @@ RBatch: Work: ID;CO2 level;FanCookSpeed;FanCookOnTime;FanCookOffTime;FanCookSlee
 RBatch: Hardware: ID;RxAddr;Ch;SpeedInitIdx;Flags;OutPeriod;IRRemotes;OSCCAL_EMEM
 RBatch: All: ID;CO2 level;FanCookSpeed;FanCookOnTime;FanCookOffTime;FanCookSleep;FanSpeed;FanOnTime;FanOffTime;FanSleep;RxAddr;Ch;SpeedInitIdx;Flags;OutPeriod;IRRemotes;IRRemotesHash
 
-WBatch: Init(Cook2spd,Lamp-F2.2): RxAddr=0xC1;Ch=122;CO2 level={700,850,1000};FanSpeed={3,5,6};FanCookSpeed={3,6,12};FanSleep=20;FanCookSleep=6;FanOnTime=150;FanCookOnTime=2;FanOffTime=100;FanCookOffTime=0;SpeedInitIdx=0;SpeedKeyIdx=6;Flags=0x49;OutPeriod=6;IRRemotes=0
+WBatch: Init(Cook2spd,Lamp-F2.2): RxAddr=0xC1;Ch=122;CO2 level={950,1050,1200};Fan speeds=1;FanSpeed={2,2,2};FanCook speeds=2;FanCookSpeed={2,4,4};FanSleep=20;FanCookSleep=6;FanOnTime=150;FanCookOnTime=0;FanOffTime=100;FanCookOffTime=0;SpeedInitIdx=0;SpeedKeyIdx=6;Flags=0x0D;OutPeriod=2;IRRemotes=0
 WBatch: IRRemotes: IRRemotes=0
 WBatch: LED Warning: _LED Warning=0x10
 WBatch: PORTA: _PORTA=0x0C
 WBatch: PORTB: _PORTB=0xC
+WBatch: OutPeriod: _OutPeriod=2
 WBatch: OSCCAL: _OSCCAL=128
-WBatch: CO2 Level+Fan speed: CO2 level={700,850,1000};FanSpeed={3,5,6}
+WBatch: CO2 Level: CO2 level={750,850,1000}
 WBatch: Reset: Reset

+ 5 - 5
README.md

@@ -13,11 +13,11 @@ Flipper Zero application for nRF24L01 external board. Sends batch commands.
 - Пакетная отправка (Set),  
 - Режим прослушивания адреса (Listen).  
 <br>
-Есть два вида команд: запрос-ответ и запись.<br>
-Запрос-ответ (Read) - отправка пакета, переключение на прием и отображение на экране, что получили.<br>
-Запись (Write) - фактически отправка пакетов подряд с нужными данными.<br>
-Пакетная отправка (Set) - режим пульта, отправка пакетов сразу из списка без вопросов и без преварительного пакета "Write start".<br>
-Режим прослушивания (Listen) - если в файле присутствует строка "Listen: <адрес>=<поле 1>,<поле 2>,...", где "поле.." название поля. Адрес пожно менять - долго нажать Ok.<br>
+Чтение по одной команде - отправка пакета, переключение на прием и отображение на экране, что получили. Длительное нажатие кнопки Ok включает режим автоматического повторного запроса через заданный интервал в секундах (настройка "ReadCmd repeat:").<br><br>
+Пакетное чтение - выполнение подряд нескольких команд чтения.<br><br>
+Пакетная запись - фактически отправка пакетов подряд с нужными данными. Предварительно отправляется пакет "Write start", если эта строка присутствует в файле настроек.<br><br>
+Пакетная отправка - режим пульта, отправка пакетов сразу из списка без вопросов и без преварительного пакета "Write start".<br><br>
+Режим прослушивания - если в файле присутствует строка "Listen: <адрес>=<поле 1>,<поле 2>,...", где "поле.." название поля. Адрес можно менять - долго нажать кнопку Ok.<br><br>
 <br>
 Формат пакета для отправки (payload) задается в виде размера полей структуры в байтах, например, так "Payload struct: 2,1,1", что означает структуру из 3 полей: 2 байта, 1 байт, 1 байт.<br>
 Полученный в ответ пакет (такой же длины как и отправленный) состоит из одного значения (остаток пакета не используется), размерность по умолчанию 1 байт (int8), при необходимости, она задается числом после '*' после имени команды.<br><br>

+ 5 - 0
descript.txt

@@ -7,6 +7,7 @@ DPL: 0            <- nRF24 dynamic payload en/dis
 RETR: 0x0F        <- nRF24 SETUP_RETR register (address 04)
 Resend: 3         <- resend attempts on error
 Delay_ms: 30      <- delay between cmd and resend
+ReadCmd repeat: 3 <- seconds (long press "Ok" in ReadCmd mode turn on repeating)
 
 Payload struct: 2,1,1   <- field sizes of send packet in bytes, received packet consists of 1 field with default size 1 byte (int8)
 EEPROM=0; RAM=1; PROGMEM=2; ID=3; RESET=4   <- Constants
@@ -34,3 +35,7 @@ RBatch: Settings: ID;OSCCAL;RxAddr;Ch;nRF RETR;CO2 threshold;CO2 correct;FanLSB
 
 WBatch: Default: RxAddr=0xCF;CO2 threshold=1000;Reset  <- Write Batch, Send: { 0,0,0,0x8F }, { 0xCF, 0, 1, 0x81 }, { 0xE8, 0x03, 5, 0x82 }, { 0, 0, 4, 0xC1 }
 WBatch: Fans: FanLSB={0xC2,0xC3,0}                     <- Write Batch, Send: { 0,0,0,0x8F }, { 0xC2, 0, 9, 0x81 }, { 0xC3, 0, 10, 0x81 }
+
+S: Lamp=,0,0x40             <- Set cmd
+SBatch: Lamp On: Lamp=1     <- Set batch
+SBatch: Lamp Off: Lamp=0    <- Set batch

+ 23 - 12
nrf24batch.c

@@ -14,7 +14,7 @@
 #include <u8g2.h>
 
 #define TAG 		"nrf24batch"
-#define VERSION		"1.7"
+#define VERSION		"1.8"
 
 #define SCAN_APP_PATH_FOLDER 	"/ext/nrf24batch"
 #define LOG_FILEEXT	 			".txt"
@@ -44,7 +44,7 @@ const char SettingsFld_ReadBatch[] = "RBatch:";
 const char SettingsFld_WriteBatch[] = "WBatch:";
 const char SettingsFld_SetBatch[] = "SBatch:";
 const char SettingsFld_Listen[] = "Listen:";
-const char SettingsFld_ListenRepeatPeriod[] = "Listen repeat:";
+const char SettingsFld_ReadCmdRepeatPeriod[] = "ReadCmd repeat:";
 const char AskQuestion_Save[] = "SAVE BATCH?";
 #define Settings_i 'i'
 #define Settings_n 'n'
@@ -95,7 +95,7 @@ uint8_t NRF_last_packet_send_st = 0;
 uint8_t NRF_resend = 1; // number of transaction attempts 
 int8_t  NRF_repeat = 0; // count number of repeated requests (until < NRF_resend)
 uint32_t NRF_time;
-uint16_t ListenRepeatPeriod = 10; // s
+uint16_t ReadCmdRepeatPeriod = 10; // s
 bool ReadRepeat = false;
 uint32_t delay_between_pkt = 10;// ms
 
@@ -550,7 +550,13 @@ bool fill_payload(char *p, uint8_t *idx_i, int32_t var_n)
 		} else if(*p == 'n' && *(p + 1) < '0') { // var_n
 			if(var_n != VAR_EMPTY) b = var_n;
 		} else if(*p >= 'A') { // constant found
-			b = subs_constant(p, end ? (uint8_t)(end - p) : strlen(p));
+			uint8_t len;
+			if(end) len =  end - p;
+			else {
+				len = strlen(p);
+				if(*(p + len - 1) == '#') len--;
+			}
+			b = subs_constant(p, len);
 			if(b == VAR_EMPTY) {
 				ERR = 1;
 				memset(ERR_STR, 0, sizeof(ERR_STR));
@@ -854,8 +860,8 @@ static uint8_t load_settings_file() {
 				NRF_resend = str_to_int(p + sizeof(SettingsFld_Resend));
 			} else if(strncmp(p, SettingsFld_Delay, sizeof(SettingsFld_Delay)-1) == 0) {
 				delay_between_pkt = str_to_int(p + sizeof(SettingsFld_Delay));
-			} else if(strncmp(p, SettingsFld_ListenRepeatPeriod, sizeof(SettingsFld_ListenRepeatPeriod)-1) == 0) {
-				ListenRepeatPeriod = str_to_int(p + sizeof(SettingsFld_ListenRepeatPeriod));
+			} else if(strncmp(p, SettingsFld_ReadCmdRepeatPeriod, sizeof(SettingsFld_ReadCmdRepeatPeriod)-1) == 0) {
+				ReadCmdRepeatPeriod = str_to_int(p + sizeof(SettingsFld_ReadCmdRepeatPeriod));
 			} else if(strncmp(p, SettingsFld_Payload, sizeof(SettingsFld_Payload)-1) == 0) {
 				p += sizeof(SettingsFld_Payload);
 				payload_fields = 0;
@@ -1073,7 +1079,7 @@ void display_add_status(void)
 static void render_callback(Canvas* const canvas, void* ctx) {
 	if(ctx == NULL) return;
 	const PluginState* plugin_state = ctx;
-	if(furi_mutex_acquire(plugin_state->mutex, 25) != FuriStatusOk) return;
+	if(furi_mutex_acquire(plugin_state->mutex, 5) != FuriStatusOk) return;
 
 	//canvas_draw_frame(canvas, 0, 0, 128, 64); // border around the edge of the screen
 	if(what_doing == 0) {
@@ -1348,6 +1354,7 @@ void next_rw_type(int8_t add)
 
 void next_view_cmd(int8_t add)
 {
+	if(rw_type == rwt_listen) return;
 	uint16_t max = (rw_type == rwt_read_batch ? ReadBatch_cmd_Total : 
 					rw_type == rwt_read_cmd ? Read_cmd_Total : 
 					rw_type == rwt_set_batch ? SetBatch_cmd_Total : WriteBatch_cmd_Total);
@@ -1393,7 +1400,7 @@ int32_t nrf24batch_app(void* p) {
 		 	FuriLogLevel = furi_log_get_level();
 		 	if(FuriLogLevel == FuriLogLevelDebug) furi_hal_uart_set_br(FuriHalUartIdUSART1, 1843200);
 		}
-		if(what_doing == 2 && rw_type == rwt_read_cmd && ReadRepeat && furi_get_tick() - NRF_time > (uint32_t)(ListenRepeatPeriod * 1000)) {
+		if(what_doing == 2 && rw_type == rwt_read_cmd && ReadRepeat && furi_get_tick() - NRF_time > (uint32_t)(ReadCmdRepeatPeriod * 1000)) {
 			ERR = 0;
 			free_Log();
 			Run_Read_cmd(Read_cmd[view_cmd[rwt_read_cmd]]);
@@ -1468,8 +1475,10 @@ int32_t nrf24batch_app(void* p) {
 								else if(*(Edit_pos - 1) == ',') Edit_pos -= 2;
 							}
 						} else if(what_doing == 0) {
-							rw_type = rwt_listen;
-							what_doing = 1;
+							if(addr_len) {
+								rw_type = rwt_listen;
+								what_doing = 1;
+							}
 						} else if(what_doing == 1) {
 							if(event.input.type == InputTypeShort) next_rw_type(-1); else if(view_x) view_x--;
 						} else if(what_doing == 2) if(view_x) view_x--;
@@ -1492,8 +1501,10 @@ int32_t nrf24batch_app(void* p) {
 								if(*(Edit_pos + 1) == 'x') Edit_pos += 2;
 							}
 						} else if(what_doing == 0) {
-							rw_type = rwt_set_batch;
-							what_doing = 1;
+							if(addr_len) {
+								rw_type = rwt_set_batch;
+								what_doing = 1;
+							}
 						} else if(what_doing == 1) {
 							if(event.input.type == InputTypeShort) next_rw_type(+1); else view_x++;
 						} else if(what_doing == 2) view_x++;