From 4a6751c34e5ac216859a0e96b4a7988f6e26400b Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 6 Jul 2023 18:37:55 +0300 Subject: [PATCH] move apps --- Distr/nrf24batch/CO2_mini.txt | 83 + Distr/nrf24batch/CO2_mini_old.txt | 83 + Distr/nrf24batch/Kitchen Vent Dimmer.txt | 164 ++ Distr/nrf24batch/Kitchen Vent.txt | 127 ++ LICENSE | 674 ++++++++ Pics/NRF24_mini_3D.png | Bin 0 -> 101885 bytes Pics/Screenshot-1.png | Bin 0 -> 1985 bytes Pics/Screenshot-2.png | Bin 0 -> 2538 bytes Pics/Screenshot-3.png | Bin 0 -> 1435 bytes Pics/Screenshot-4.png | Bin 0 -> 2439 bytes Pics/Screenshot-5.png | Bin 0 -> 2153 bytes Pics/descript.png | Bin 0 -> 78858 bytes README.md | 59 + application.fam | 20 + descript.txt | 41 + lib/nrf24/nrf24.c | 365 ++++ lib/nrf24/nrf24.h | 386 +++++ nrf24batch.c | 1972 ++++++++++++++++++++++ nrf24batch.h | 32 + nrf24batch_10px.png | Bin 0 -> 1771 bytes 20 files changed, 4006 insertions(+) create mode 100644 Distr/nrf24batch/CO2_mini.txt create mode 100644 Distr/nrf24batch/CO2_mini_old.txt create mode 100644 Distr/nrf24batch/Kitchen Vent Dimmer.txt create mode 100644 Distr/nrf24batch/Kitchen Vent.txt create mode 100644 LICENSE create mode 100644 Pics/NRF24_mini_3D.png create mode 100644 Pics/Screenshot-1.png create mode 100644 Pics/Screenshot-2.png create mode 100644 Pics/Screenshot-3.png create mode 100644 Pics/Screenshot-4.png create mode 100644 Pics/Screenshot-5.png create mode 100644 Pics/descript.png create mode 100644 README.md create mode 100644 application.fam create mode 100644 descript.txt create mode 100644 lib/nrf24/nrf24.c create mode 100644 lib/nrf24/nrf24.h create mode 100644 nrf24batch.c create mode 100644 nrf24batch.h create mode 100644 nrf24batch_10px.png diff --git a/Distr/nrf24batch/CO2_mini.txt b/Distr/nrf24batch/CO2_mini.txt new file mode 100644 index 00000000000..1fb281b4148 --- /dev/null +++ b/Distr/nrf24batch/CO2_mini.txt @@ -0,0 +1,83 @@ +Info: CO2 sensor mini +Address: C8C8CF +Rate: 1 +Ch: 122 +CRC: 2 +DPL: 0 +RETR: 0x0F +Resend: 3 +Delay_ms: 30 +ReadCmd repeat: 3 + +Payload struct: 2,1,1 +ROM=0x41;ROM2=0x42;WROM=0x81;WROM2=0x82;RAM=0x51;RAM2=0x52;WRAM=0x91;WRAM2=0x92;PGM=0x61;SET=0xC0 + +R default: ,,ROM +W default: n,,WROM +Write start: 0,0,0x2F + +Listen: C8C8C1=CO2,Alarm,- + +R: ID*=,0,0x65 + +R: _CO2*2=0x6C,,RAM2 +R: _PORTA=0x39,,RAM +W: _PORTA=,0x3B,WRAM +R: _PORTB=0x36,,RAM +W: _PORTB=,0x38,WRAM +R: _OSCCAL=0x51,,RAM +W: _OSCCAL=,0x51,WRAM +R: OSCCAL_EMEM=0 + +R: RxAddr=1# +W: RxAddr=,1 + +R: Ch=2 +W: Ch=,2 + +R: nRF RETR=3# +W: nRF RETR=,3 + +R: Send period=4 +W: Send period=,4 + +R: CO2 threshold*2=5,,ROM2 +W: CO2 threshold=,5,WROM2 + +R: CO2 correct*2=7,,ROM2 +W: CO2 correct*2=,7,WROM2 + +R: FanLSB[10]=i:9# +W: FanLSB=,i:9 + +R: Transmit pause=19 +W: Transmit pause=,19 + +R: Flags=20# +W: Flags=,20 + +W: Reset=0xEEEE,14,SET + +R: _LED Warning=0x74,,RAM +W: _LED Warning=,0x74,WRAM + +S: LED=,0,SET + +SBatch: LED On: LED=1 +SBatch: LED Off: LED=0 + +RBatch: Settings: ID;RxAddr;Ch;Send period;CO2 threshold;CO2 correct;FanLSB;nRF RETR;Transmit pause;Flags + +WBatch: Default: RxAddr=0xCF;Ch=122;Send period=30;CO2 threshold=1000;CO2 correct=0;FanLSB={0xC1,0,0,0,0,0,0,0};nRF RETR=0x3;Transmit pause=1;Flags=0;Reset +WBatch: CO2: Send period=60;CO2 threshold=1000;CO2 correct=0 +WBatch: Fan: FanLSB={0xC1,0,0,0,0,0,0,0,0,0};Reset +WBatch: RETR: nRF RETR=0x2F;Reset +WBatch: Transmit pause: Transmit pause=30 +WBatch: Flags: Flags=0x00 + +WBatch: LED Warning: _LED Warning=0x30 +WBatch: PORTA: _PORTA=0x0C +WBatch: PORTB: _PORTB=0xC +WBatch: OSCCAL: _OSCCAL=128 + +WBatch: Reset: Reset diff --git a/Distr/nrf24batch/CO2_mini_old.txt b/Distr/nrf24batch/CO2_mini_old.txt new file mode 100644 index 00000000000..9aaa05db059 --- /dev/null +++ b/Distr/nrf24batch/CO2_mini_old.txt @@ -0,0 +1,83 @@ +Info: CO2 sensor mini +Address: C8C8CF +Rate: 1 +Ch: 122 +CRC: 2 +DPL: 0 +RETR: 0x0F +Resend: 3 +Delay_ms: 30 +ReadCmd repeat: 3 + +Payload struct: 2,1,1 +EEPROM=0; RAM=1; PROGMEM=2; ID=3; RESET=4; WRAM=0x89 + +R default: ,EEPROM,0xC1 +W default: n,,0x81 +Write start: 0,0,0x8F + +Listen: C8C8C1=CO2,Alarm,- + +R: ID*=,ID + +R: _CO2*2=0x6C,RAM,0xC2 +R: _PORTA=0x39,RAM +W: _PORTA=,0x3B,WRAM +R: _PORTB=0x36,RAM +W: _PORTB=,0x38,WRAM +R: _OSCCAL=0x51,RAM +W: _OSCCAL=,0x51,WRAM +R: OSCCAL_EMEM=0 + +R: RxAddr=1# +W: RxAddr=,1 + +R: Ch=2 +W: Ch=,2 + +R: nRF RETR=3# +W: nRF RETR=,3 + +R: Send period=4 +W: Send period=,4 + +R: CO2 threshold*2=5,,0xC2 +W: CO2 threshold=,5,0x82 + +R: CO2 correct*2=7,,0xC2 +W: CO2 correct*2=,7,0x82 + +R: FanLSB[10]=i:9# +W: FanLSB=,i:9 + +R: Transmit pause=19 +W: Transmit pause=,19 + +R: Flags=20# +W: Flags=,20 + +W: Reset=,RESET,0xC1 + +R: _LED Warning=0x74,RAM +W: _LED Warning=,0x74,WRAM + +S: LED=,0,0x40 + +SBatch: LED On: LED=1 +SBatch: LED Off: LED=0 + +RBatch: Settings: ID;RxAddr;Ch;Send period;CO2 threshold;CO2 correct;FanLSB;nRF RETR;Transmit pause;Flags + +WBatch: Default: RxAddr=0xCF;Ch=122;Send period=30;CO2 threshold=1000;CO2 correct=0;FanLSB={0xC1,0,0,0,0,0,0,0};nRF RETR=0x3;Transmit pause=1;Flags=0;Reset +WBatch: CO2: CO2 threshold=1000;CO2 correct=0 +WBatch: Fan: FanLSB={0xC1,0,0,0,0,0,0,0,0,0};Reset +WBatch: RETR: nRF RETR=0x2F;Reset +WBatch: Transmit pause: Transmit pause=30 +WBatch: Flags: Flags=0x00 + +WBatch: LED Warning: _LED Warning=0x30 +WBatch: PORTA: _PORTA=0x0C +WBatch: PORTB: _PORTB=0xC +WBatch: OSCCAL: _OSCCAL=128 + +WBatch: Reset: Reset diff --git a/Distr/nrf24batch/Kitchen Vent Dimmer.txt b/Distr/nrf24batch/Kitchen Vent Dimmer.txt new file mode 100644 index 00000000000..ed32d75149d --- /dev/null +++ b/Distr/nrf24batch/Kitchen Vent Dimmer.txt @@ -0,0 +1,164 @@ +Info: Kitchen Vent Dimmer +Address: C8C8C1 +Rate: 1 +Ch: 122 +CRC: 2 +DPL: 0 +RETR: 0x0F +Resend: 3 +Delay_ms: 30 + +Payload struct: 2,1,1 +ROM=0x41;ROM2=0x42;WROM=0x81;WROM2=0x82;RAM=0x51;RAM2=0x52;WRAM=0x91;WRAM2=0x92;PGM=0x61;SET=0xC0 + +R default: ,,ROM +W default: n,,WROM +Write start: 0,0,0x2F + +R: ID*=,0,0x65 + +R: CO2 level*2[3]=i:4,,ROM2 +W: CO2 level*2=,i:4,WROM2 + +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 + +R: FanOnTime=10 +W: FanOnTime=,10 + +R: FanOffTime=11 +W: FanOffTime=,11 + +R: FanCookOnTime=12 +W: FanCookOnTime=,12 + +R: FanCookOffTime=13 +W: FanCookOffTime=,13 + +R: FanSleep=14 +W: FanSleep=,14 + +R: FanCookSleep=15 +W: FanCookSleep=,15 + +R: SpeedInitIdx=16 +W: SpeedInitIdx=,16 + +R: SpeedKeyIdx=17 +W: SpeedKeyIdx=,17 + +R: OutSpeedMax=18 +W: OutSpeedMax=,18 + +R: PauseSetByCO2,min=27 +W: PauseSetByCO2,min=,27 + +R: SSR_PulseWidth,us*2=28,,ROM2 +W: SSR_PulseWidth,us*2=,28,WROM2 + +R: SSR_PulseSafeTime,us*2=30,,ROM2 +W: SSR_PulseSafeTime,us*2=,30,WROM2 + +R: SSR2_PulseWidth,us*2=32,,ROM2 +W: SSR2_PulseWidth,us*2=,32,WROM2 + +R: DamperOpenTime=34 +W: DamperOpenTime=,34 + +!R: FanCookSpIdxDnKey=35 +!W: FanCookSpIdxDnKey=,35 +!R: FanCookSpIdxUpKey=36 +!W: FanCookSpIdxUpKey=,36 + +R: IRRemotes=35 +W: IRRemotes=,35 + +R: IRRemotesHash*2[70]=i:36,,ROM2# +W: IRRemotesHash*2=,i:36,WROM2 + +R: Flags=1# +W: Flags=,1 + +R: RxAddr=2# +W: RxAddr=,2 + +R: Ch=3 +W: Ch=,3 + +R: OSCCAL_EMEM=0 +R: _OSCCAL=0x51,,RAM +W: _OSCCAL=,0x51,,WRAM +R: _PORTA=0x39,,RAM +W: _PORTA=,0x3B,,WRAM +R: _PORTB=0x36,,RAM +W: _PORTB=,0x38,WRAM + +R: _LED_Warning=0x71,,RAM +W: _LED_Warning=,0x71,WRAM +R: _IRHashLast*2=0x89,,RAM2# +R: _IRCntLast=0x87,,RAM +R: _IRHash*2=0x8B,,RAM2# +R: _SleepTimer=0x8E,,RAM +R: _FanOn=0x7F,,RAM +R: _FanOnNext=0x7D,,RAM +R: _FanOnNextCnt=0x7B,,RAM +R: _FanOnLast=0x7C,,RAM + +R: _OutSpeedMax=0x90,,RAM +W: _OutSpeedMax=,0x90,WRAM + +R: _Fanspeed=0x7E,,RAM +R: _SSR_full_period*2=0x64,,RAM2 + +R: _PulseDelayAfterZero*2=0x9F,,RAM2 +W: _PulseDelayAfterZero*2=,0x9F,WRAM2 +R: _PulseWidth*2=0x92,,RAM2 +W: _PulseWidth*2=,0x92,WRAM2 +R: _PulseWidth2=0xA3,,RAM +W: _PulseWidth2=,0xA3,WRAM + +W: Reset=0xEEEE,14,SET + +S: Lamp=,0,SET +S: Fan=,1,SET +S: FanAdd=,2,SET +S: FanSpdUp=,3,SET +S: FanSpdDn=,4,SET +S: FanSpdSave=,5,SET +S: SetupIR=,6,SET + +SBatch: Fan Cooker Max: Fan=6 +SBatch: Fan Cooker Min: Fan=4 +SBatch: Fan Max: Fan=3 +SBatch: Fan Min: Fan=1 +SBatch: Fan Off: Fan=0 +SBatch: Fan +: FanAdd=1 +SBatch: Fan -: FanAdd=-1 +SBatch: Lamp On: Lamp=1 +SBatch: Lamp Off: Lamp=0 +SBatch: Fan Up: FanSpdUp=0 +SBatch: Fan Down: FanSpdDn=0 +SBatch: Fan SAVE: FanSpdSave=0; +SBatch: Add new IR: SetupIR=1 + +RBatch: Work: ID;CO2 level;FanCookSpeed;FanCookOnTime;FanCookOffTime;FanCookSleep;FanSpeed;FanOnTime;FanOffTime;FanSleep;DamperOpenTime +RBatch: Hardware: ID;RxAddr;Ch;SpeedInitIdx;Flags;OutSpeedMax;IRRemotes;SSR_PulseWidth,us;OSCCAL_EMEM +RBatch: All: ID;CO2 level;FanCookSpeed;FanCookOnTime;FanCookOffTime;FanCookSleep;FanSpeed;FanOnTime;FanOffTime;FanSleep;DamperOpenTime;RxAddr;Ch;SpeedInitIdx;Flags;OutSpeedMax;IRRemotes;IRRemotesHash + +WBatch: Init(Cook2spd,Lamp-F2.2): RxAddr=0xC1;Ch=122;CO2 level={870,930,1000};Fan speeds=3;FanSpeed={10,12,16};FanCook speeds=3;FanCookSpeed={12,16,32};FanSleep=20;FanCookSleep=6;FanOnTime=1;FanCookOnTime=3;FanOffTime=100;FanCookOffTime=0;DamperOpenTime=60;SpeedInitIdx=0;SpeedKeyIdx=6;Flags=0x0D;OutSpeedMax=16;SSR_PulseWidth,us=9990 +WBatch: IRRemotes clear: IRRemotes=0 +WBatch: IRRemotes 1 kitchen: IRRemotes=1;IRRemotesHash={0x6DA5,0xFCA5,0x7CA5,0xB425,0x3425,0x1625,0x8525} +WBatch: Fans Speeds: Fan speeds=3;FanSpeed={10,12,16};FanCook speeds=3;FanCookSpeed={12,16,32} +WBatch: FanCooker Down/Up key idx: FanCookSpIdxDnKey=2;FanCookSpIdxUpKey=3 +WBatch: LED Warning: _LED Warning=0x10 +WBatch: OSCCAL: _OSCCAL=146 +WBatch: CO2 Level: CO2 level={750,850,1000} +WBatch: Zero cross EEPROM: SSR_PulseWidth,us=200;SSR2_PulseWidth,us=200;SSR_PulseSafeTime,us=100;Reset +WBatch: Zero cross RAM: _PulseDelayAfterZero=0001;_PulseWidth=200;_PulseWidth2=200 +WBatch: Reset: Reset diff --git a/Distr/nrf24batch/Kitchen Vent.txt b/Distr/nrf24batch/Kitchen Vent.txt new file mode 100644 index 00000000000..48533810544 --- /dev/null +++ b/Distr/nrf24batch/Kitchen Vent.txt @@ -0,0 +1,127 @@ +Info: Kitchen Vent (FanControl) +Address: C8C8C1 +Rate: 1 +Ch: 122 +CRC: 2 +DPL: 0 +RETR: 0x0F +Resend: 3 +Delay_ms: 30 + +Payload struct: 2,1,1 +ROM=0x41;ROM2=0x42;WROM=0x81;WROM2=0x82;RAM=0x51;RAM2=0x52;WRAM=0x91;WRAM2=0x92;PGM=0x61;SET=0xC0 + +R default: ,,ROM +W default: n,,WROM +Write start: 0,0,0x2F + +R: ID*=,0,0x65 + +R: CO2 level*2[3]=i:4,,ROM2 +W: CO2 level*2=,i:4,WROM2 + +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 + +R: FanOnTime=10 +W: FanOnTime=,10 + +R: FanOffTime=11 +W: FanOffTime=,11 + +R: FanCookOnTime=12 +W: FanCookOnTime=,12 + +R: FanCookOffTime=13 +W: FanCookOffTime=,13 + +R: FanSleep=14 +W: FanSleep=,14 + +R: FanCookSleep=15 +W: FanCookSleep=,15 + +R: SpeedInitIdx=16 +W: SpeedInitIdx=,16 + +R: SpeedKeyIdx=17 +W: SpeedKeyIdx=,17 + +R: IRRemotes=32 +W: IRRemotes=,32 + +R: IRRemotesHash*2[70]=i:33,,ROM2# +W: IRRemotesHash*2=,i:33,WROM2 + +R: OutPeriod=18 +W: OutPeriod=,18 + +R: Flags=1# +W: Flags=,1 + +R: RxAddr=2# +W: RxAddr=,2 + +R: Ch=3 +W: Ch=,3 + +R: OSCCAL_EMEM=0 +R: _OSCCAL=0x51,,RAM +W: _OSCCAL=,0x51,WRAM + +R: _PORTA=0x39,,RAM +W: _PORTA=,0x3B,WRAM +R: _PORTB=0x36,,RAM +W: _PORTB=,0x38,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: _IRHashLast*2=0x79,,RAM2# + +R: _LED Warning=0x6B,,RAM +W: _LED Warning=,0x6B,WRAM + +W: Reset=0xEEEE,14,SET + +S: Lamp=,0,SET +S: Fan=,1,SET +S: FanSpdUp=,2,SET +S: FanSpdDn=,3,SET +S: FanSpdSave=,4,SET +S: SetupIR=,5,SET + +SBatch: Fan Cooker On: Fan=6 +SBatch: Fan On: Fan=3 +SBatch: Fan Off: Fan=0 +SBatch: Lamp On: Lamp=1 +SBatch: Lamp Off: Lamp=0 +SBatch: Fan Up: FanSpdUp=0 +SBatch: Fan Down: FanSpdDn=0 +SBatch: Fan SAVE: FanSpdSave=0; +SBatch: Add new IR: SetupIR=1 + +RBatch: Work: ID;CO2 level;FanCookSpeed;FanCookOnTime;FanCookOffTime;FanCookSleep;FanSpeed;FanOnTime;FanOffTime;FanSleep +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={950,1050,1200};Fan speeds=1;FanSpeed={1,1,1};FanCook speeds=2;FanCookSpeed={1,2,2};FanSleep=20;FanCookSleep=6;FanOnTime=150;FanCookOnTime=0;FanOffTime=100;FanCookOffTime=0;SpeedInitIdx=0;SpeedKeyIdx=6;Flags=0x0D;OutPeriod=1 +WBatch: IRRemotes clear: IRRemotes=0 +WBatch: IRRemotes 1 kitchen: IRRemotes=1;IRRemotesHash={0x6DA5,0xFCA5,0x7CA5,0xB425,0x3425,0x1625,0x8525} +WBatch: Fans Speeds: Fan speeds=1;FanSpeed={1,1,1};FanCook speeds=2;FanCookSpeed={1,2,2} +WBatch: LED Warning: _LED Warning=0x10 +WBatch: OutPeriod: _OutPeriod=1 +WBatch: OSCCAL: _OSCCAL=146 +WBatch: CO2 Level: CO2 level={750,850,1000} +WBatch: Reset: Reset diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000000..f288702d2fa --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Pics/NRF24_mini_3D.png b/Pics/NRF24_mini_3D.png new file mode 100644 index 0000000000000000000000000000000000000000..0e56484b98264590805af58c9767e71a608509f4 GIT binary patch literal 101885 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 yfX}6 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 ALjV8( literal 0 HcmV?d00001 diff --git a/Pics/Screenshot-1.png b/Pics/Screenshot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..96729a396261f2d4dab4007468729747554ab19d GIT binary patch literal 1985 zcmc&#ZA_C_6uuRSS|ff1jf!+hr&W=}$v~Ju@rw`R02Kwwm&zCh#teHED&0blxcKtFtcOq!`a%xUm+}_4er^6sz z4vLs24Gv5#0-#|w2wR5(i*^HWX2}P)S7bw5$LMG(+3B>ZWC^0-`z_Q1IklaFj=+(G z@IR8Tkv%2t6LIf+jnw!GAq}~Q-c2+#4+b_RT$7Qwb2Jrr@X0v<=B@!?JA*S>;FG{0 z+lOco62ulPlorUDt5D?;J*BnWZ}ZbSBwhZ6;K7(60y^e?u zYB28c&+PUvrS_e~S(>!47M&2!GGvFz(j7qKZ1Sa9Z=m=m&|73au;n4NM;4m} zmC`7Rjm-fb*x~l#CiH#{9>P3JWe4=)dKym{;L)}oI%vK_1-=Jg4Dd`kZAj*^)`g-_ z?f8(VYDmnZ>B>!+_XCOPx2qrrrvON5SQt{~Za`K@wQrdH0{LIBv85FCFF zuP7r4{cEG4=5l^?JKC$7zB(4X?Ym-Qys-V@pF(W4;av8D^Ke;7-MF}eS231cRVHjh zt()GvBEgZW_H>v@_GcnVe&@+B%o!KDtbZ32$Hl!#L94Ve7rB9H$6xTX&}Y?FHc8n{ zC?f0-Q|Eia+Aq-zUstO<;QH6OMsNev*!RZfYZ)pzw~A8_D*}lHS1oCy{Yiq}DvauF z-6N*j^#%7Dpnj^J0s+N#!PlWq)crQRI@2=fKsXG&UsI$r<+%n5<04#`JBmJ}8CyAC z_7ovY&$ZDSBVsaO@*eRxq^KbgbtVcavt42iE;3>Id(>?684?8H48ahoA#!@M$0&Uz zuuC)Rb~tmDSeD}Ea`j%Q(MzZx9-$8qRfFPXuj(|^gu^}cw?kVFF<2Y+LuSWaW<=Cf z{aKQeY4|otr0}o#>4_J&KbvcbKAn}l$0Be)@mPGx1LC6X!49>LRf_4;OW+aK>E#;p iklDv6`+uF<7DlD&lJA6U`qcF%gQ#86I|bVho&Fnb;RNOY literal 0 HcmV?d00001 diff --git a/Pics/Screenshot-2.png b/Pics/Screenshot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..3a26ae682cb1ec15d9d4948f2bfc606cc71d8dd6 GIT binary patch literal 2538 zcmZ8jdsI@{8b6q3*3zb&%#{~yW#uhzw}+9M&z`1T(K0f?bTrdOMoqa&ilEn;)udKK zmiZ>Di2{WR8738u_ts=(YHCQyt2AYVlvI!efs3p8V>f@Cwa+_?oaHOzc{qv>P10P0I`fiE^Xto?#w-#QgTA5M!TXwm@R~$ zfo~wF!4?X=8`Zhr>yq=F!AQ55HCSeu|OMOa=8yHNfxGSgyyCghd{mdgnfLFi7Mc2!jjXDM># zw%wPy%dLViSk#~@v^dTDN@NK#W7AQXw%)>rlh&Y^u?rppt>RrQ5Woff0~COPa$Qx zuvk6ea)JIv2$Bj4A-ssFjVCAb)trgz38)=D+fqH=oCicOF#quNsPYoxL(Fv*c_W_0 zJ~F*$Lr?k#e%4T)w`zUe)Nv;xSk{B`6I2B{Bku7X^WEkZl&J9S8fM2kpBczY^&g=s zv~IU90fnk}EPRDmGWh#n)XdbK#F*&v77Mrj@v~OfL%o)GlY~4qd-|W7zPLTFIA#hN z%Be8Fpb0xMMj@s%e<2BtB zQ&q;0zOXn!=0P~uj;PY}ReZ!IkV5m;q6)(n0k4xJCskAk-^mPG4f_%4A4=wkdo0B> zdniv~IBrJ-y}E4PRrD{wYQ`reK7xr$bZ|jijCHPEblV;Hb2>FT*s*lt2 zMk+JMOBD^&LpgP|SdBhXgG}iKyv1`Iq^(_zgu8Om`ONk8M@&?*dRRZPB=Z-5S;SN5 zXj4}}-%15ODkWLLI`?Qipixlpf?MnbBAvp8dQPjuy2-i^sFz6@c44)9kd5OV|$o<>aw-30O})ZM4TX} zP9ox0bY!6ez*BN(FBgz_YN$~b51COfC%8*?D$VEQj!;;P^J@imK% zf<9XjxL{oTs20-h`a}vZFt>ma;bGpb8@r+eCFi}ke zMBU-d>&B~f48D(^UI%(VZf%hI#@XP58k8n_&)8LE;M5P^!pOI?*j-Bi$huyV!_VQs zsJm8RzvZxZib&|0uRP1>@=&~|dQ;s3q_L$mbzqia8CNKKwCY|f#+(^D){A&k@#ln$ zbX(whuk~SCLUtpLn|MC!9*si!Ovah?eEnz7VVa=h-W?#n?#GwjxY&!x1x`)5@V#iQ!Iv4gR*zX_sAnvdD^GF%Yk9@aGL_D9`72`gen>bLQQq%cA z^k+Mg(6imcS9P^m){sV14ruq<8i`hs_6(~8<*;#7=k=*Tu8g#Fg91k7B+QAJgMI?> zmYX96(%p;ZWXGFW;w*`ku>GONNmt4gbExX-c9J9kIjzBfgs+t$p!*?!l95juV5Wyy;!&hOTF19z^pqApbUOUIuX9u|UMaJ*0ri;4K}B`O)2VM0k6W2Z$B^7d z5*dc}fDuo~Mqq4J$>!JXm)ETA>@#T;it1=N*J4<+@3-E_lyi zm#PEq4_MzkZET_*ZGAgVUwzY+gtElkheEb6NlW$0M| z6YCUB@y{|(mFq(LKE6tAIqNK5>$gv8`s(&$J!o)-E>_2aeAuTFMdv5U#8wvR3Vc7D z6!}i3m1~~u5Wy@A>ZgtMqGx&dwNegXt)VT4>ix-bn*v`cfB{idnSl|{9sl$B%`)rd P4GQ0f-pk(oUGe_`2wY;! literal 0 HcmV?d00001 diff --git a/Pics/Screenshot-3.png b/Pics/Screenshot-3.png new file mode 100644 index 0000000000000000000000000000000000000000..352248366d4d7ddb2f092196bcfeba39410b72b7 GIT binary patch literal 1435 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 YnGo5P7nZxfd{4haU0Fw|RKYUjAMfI$?f?J) literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 00000000000..bacb2da6d57 --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +# nRF24-Batch +Flipper Zero application for nRF24L01 external board. Sends batch commands. + +Приложение для Flipper Zero, предназначено для отправки пакетных команд на удаленные устройства, использующие радио nRF24L01.

+Можно использовать для настройки или чтения данных с удаленного устройства. На удаленной стороне требуется поддержка, ссылка на код для микроконтроллера AVR ниже.
+
+Сначала выбирается файл настройки с описанием команд. +Можно отредактировать адрес и номер канала. +Затем стрелками влево или вправо выбирается нужный режим: +- Пакетное чтение (Read Batch), +- Чтение по одной команде (Read cmd), +- Пакетная запись (Write Batch), +- Пакетная отправка (Set), +- Режим прослушивания адреса (Listen). +
+Чтение по одной команде - отправка пакета, переключение на прием и отображение на экране, что получили. Длительное нажатие кнопки Ok включает режим автоматического повторного запроса через заданный интервал в секундах (настройка "ReadCmd repeat:").

+Пакетное чтение - выполнение подряд нескольких команд чтения.

+Пакетная запись - фактически отправка пакетов подряд с нужными данными. Предварительно отправляется пакет "Write start", если эта строка присутствует в файле настроек.

+Пакетная отправка - режим пульта, отправка пакетов сразу из списка без вопросов и без преварительного пакета "Write start".

+Режим прослушивания - если в файле присутствует строка "Listen: <адрес>=<поле 1>,<поле 2>,...", где "поле.." название поля. Адрес можно менять - долго нажать кнопку Ok.

+
+Формат пакета для отправки (payload) задается в виде размера полей структуры в байтах, например, так "Payload struct: 2,1,1", что означает структуру из 3 полей: 2 байта, 1 байт, 1 байт.
+Полученный в ответ пакет (такой же длины как и отправленный) состоит из одного значения (остаток пакета не используется), размерность по умолчанию 1 байт (int8), при необходимости, она задается числом после '*' после имени команды.

+Перед отправкой пакета, он заполняется сначала по шаблону по умолчанию "R default" для запроса чтения, "W default" - для записи.
+Поля разделены - ','. Для "W default" есть специальный маркер 'n', говорящий какое поле будет заполняться значением после '=' из команды "WBatch".
+Можно использовать константы по их имени, они задаются в файле в формате "имя=число", число либо десятичное или шестнадцатеричное с префиксом 0x.
+Затем берутся заполненные значения полей из самой команды ("R:" или "W:").
+Если в конце строки с командой чтения символ '#', то считанное значение будет показано в шестнадцатеричном виде.

+Пакеты чтения "RBatch:", записи "WBatch:", отправки "SBatch:" состоят из списка имен команд "R:" или "W:"("S:"), соответственно, перечисленных через ";".
+"S:" то же самое, что и "W:", только пакет "Write start" отправлен не будет

+Отправка пакета для записи - длительно нажать Ok в списке и подтвердить.
+Перед пакетом команд для записи отправляется пакет "Write start", если эта строка присутствует в файле настроек.

+Значение команды для записи можно редактировать - Ok на списке команд, стрелки - +/- и переход по цифрам, завершить - Назад, вставка цифры - Ok, удаление цифры - длительный Ok.
+Из списка команд в пакетах чтения и записи команды можно убирать - для этого нужно долго нажать на кнопку влево и подтвердить.
+Это нужно, например, чтобы убирать те команды в сохраненном пакете для чтения, для которых нет команды записи.
+
+Пример файл [CO2_mini](https://raw.githubusercontent.com/vad7/nRF24-Batch/main/Distr/nrf24batch/CO2_mini.txt)
+Для устройства на Attiny44A, которое отправляет данные с датчика CO2 на контроллеры, управляющие вентиляцией или проветриватели: https://github.com/vad7/CO2-mini
+Управляет вентиляцией на кухне: https://github.com/vad7/Kitchen_Vent
+

+Структура [файла настроек](https://raw.githubusercontent.com/vad7/nRF24-Batch/main/descript.txt): + + +
+
+ + + + + +
+
+Mini board for Flipper Zero to connect nRF24l01:

+ +
+ +
+
Gerber for mini board with 5V - 3.3V converter LM1117-3.3
+Easyeda source diff --git a/application.fam b/application.fam new file mode 100644 index 00000000000..3d09a2e7f81 --- /dev/null +++ b/application.fam @@ -0,0 +1,20 @@ +App( + appid="nrf24_batch", + name="[NRF24] Batch", + apptype=FlipperAppType.EXTERNAL, + entry_point="nrf24batch_app", + cdefines=["APP_NRF24BATCH"], + requires=["gui"], + stack_size=2 * 1024, + order=60, + fap_icon="nrf24batch_10px.png", + fap_category="GPIO", + fap_private_libs=[ + Lib( + name="nrf24", + sources=[ + "nrf24.c", + ], + ), + ], +) diff --git a/descript.txt b/descript.txt new file mode 100644 index 00000000000..2487702ca2b --- /dev/null +++ b/descript.txt @@ -0,0 +1,41 @@ +Info: CO2 sensor mini +Address: C8C8CF <- nRF24 address (3..5 bytes) +Rate: 1 <- nRF24 data rate (0 - 250Kbps, 1 - 1Mbps, 2 - 2Mbps) +Ch: 121 <- nRF24 channel (0..125) +CRC: 2 <- nRF24 CRC size +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 + +R default: ,EEPROM,0xC1 <- default for read +W default: n,,0x81 <- default for write, 'n' - means field value position +Write start: 0,0,0x8F <- if exist in the file - packet before write a batch + +R: ID*=,ID <- Read cmd, '*' - means string like device ID, payload result in bytes = { 0, 0, 3, 0xC1 } +R: OSCCAL=0x51,RAM <- Read cmd, result in bytes = { 0x51, 0, 1, 0xC1 } +R: OSCCAL_EMEM=0# <- Read cmd, result in bytes = { 0, 0, 0, 0xC1 }, in the end of line '#' - returned value in hexadecimal format +R: CO2=0x67,RAM,0xC2 <- Read cmd, result in bytes = { 0x67, 0, 1, 0xC2 } + +R: CO2 threshold*2=5,,0xC2 <- Read cmd, '*2' - means received field with 2 bytes size (int16), result in bytes = { 5, 0, 0, 0xC2 } +W: CO2 threshold=,5,0x82 <- Write cmd, send pkt = { , , 5, 0x82 } + +R: FanLSB[10]=i:9 <- Read cmd, '[10]' - means array with 10 elements, 'i:9' - means array index field (9) that will be incemented after each send + result in bytes = 1 pkt: { 9, 0, 0, 0xC1 }, 2 pkt: { 10, 0, 0, 0xC1 }, 3 pkt: { 10, 0, 0, 0xC1 },... total 10 packets +W: FanLSB=,i:9 <- Write cmd, 'i' - index field. Send packets: { n & 0xFF, n >> 8, 9, 0x81 }, { n & 0xFF, n >> 8, 10, 0x81 },... +R: Int16Array*2[10]=i:21 <- Read cmd, array with 10 elements of int16 (2 bytes) +W: RxAddr=,1 <- Write cmd, payload = { n, 0, 1, 0x81 } +W: Reset=,RESET,0xC1 <- Send payload = { 0, 0, 4, 0xC1 } + +RBatch: Settings: ID;OSCCAL;RxAddr;Ch;nRF RETR;CO2 threshold;CO2 correct;FanLSB <- Read Batch, 8 packets will be sent and received + +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 diff --git a/lib/nrf24/nrf24.c b/lib/nrf24/nrf24.c new file mode 100644 index 00000000000..789002f80d5 --- /dev/null +++ b/lib/nrf24/nrf24.c @@ -0,0 +1,365 @@ +// Modified by vad7, 24.02.2023 +// +#include "nrf24.h" +#include +#include +#include +#include +#include + +void nrf24_init() { + furi_hal_spi_bus_handle_init(nrf24_HANDLE); + furi_hal_spi_acquire(nrf24_HANDLE); + furi_hal_gpio_init(nrf24_CE_PIN, GpioModeOutputPushPull, GpioPullUp, GpioSpeedVeryHigh); + furi_hal_gpio_write(nrf24_CE_PIN, false); +} + +void nrf24_deinit() { + furi_hal_spi_release(nrf24_HANDLE); + furi_hal_spi_bus_handle_deinit(nrf24_HANDLE); + furi_hal_gpio_write(nrf24_CE_PIN, false); + furi_hal_gpio_init(nrf24_CE_PIN, GpioModeAnalog, GpioPullNo, GpioSpeedLow); +} + +void nrf24_spi_trx( + FuriHalSpiBusHandle* handle, + uint8_t* tx, + uint8_t* rx, + uint8_t size) { + furi_hal_gpio_write(handle->cs, false); + furi_hal_spi_bus_trx(handle, tx, rx, size, nrf24_TIMEOUT); + furi_hal_gpio_write(handle->cs, true); +} + +uint8_t nrf24_write_reg(FuriHalSpiBusHandle* handle, uint8_t reg, uint8_t data) { + uint8_t buf[] = {W_REGISTER | (REGISTER_MASK & reg), data}; + nrf24_spi_trx(handle, buf, buf, 2); + //FURI_LOG_D("NRF_WR", " #%02X=%02X", reg, data); + return buf[0]; +} + +uint8_t nrf24_write_buf_reg(FuriHalSpiBusHandle* handle, uint8_t reg, uint8_t* data, uint8_t size) { + uint8_t buf[size + 1]; + buf[0] = W_REGISTER | (REGISTER_MASK & reg); + memcpy(&buf[1], data, size); + nrf24_spi_trx(handle, buf, buf, size + 1); + //FURI_LOG_D("NRF_WR", " #%02X(%02X)=0x%02X%02X%02X%02X%02X", reg, size, data[0], data[1], data[2], data[3], data[4] ); + return buf[0]; +} + +uint8_t nrf24_read_reg(FuriHalSpiBusHandle* handle, uint8_t reg, uint8_t* data, uint8_t size) { + uint8_t buf[size + 1]; + memset(buf, 0, size + 1); + buf[0] = R_REGISTER | (REGISTER_MASK & reg); + nrf24_spi_trx(handle, buf, buf, size + 1); + memcpy(data, &buf[1], size); + return buf[0]; +} + +uint8_t nrf24_read_register(FuriHalSpiBusHandle* handle, uint8_t reg) { + uint8_t buf[] = { R_REGISTER | (REGISTER_MASK & reg), 0 }; + nrf24_spi_trx(handle, buf, buf, 2); + return buf[1]; +} + +uint8_t nrf24_flush_rx(FuriHalSpiBusHandle* handle) { + uint8_t tx[] = {FLUSH_RX}; + uint8_t rx[] = {0}; + nrf24_spi_trx(handle, tx, rx, 1); + return rx[0]; +} + +uint8_t nrf24_flush_tx(FuriHalSpiBusHandle* handle) { + uint8_t tx[] = {FLUSH_TX}; + uint8_t rx[] = {0}; + nrf24_spi_trx(handle, tx, rx, 1); + return rx[0]; +} + +uint8_t nrf24_get_maclen(FuriHalSpiBusHandle* handle) { + uint8_t maclen; + nrf24_read_reg(handle, REG_SETUP_AW, &maclen, 1); + maclen &= 3; + return maclen + 2; +} + +uint8_t nrf24_set_maclen(FuriHalSpiBusHandle* handle, uint8_t maclen) { + assert(maclen > 1 && maclen < 6); + uint8_t status = 0; + status = nrf24_write_reg(handle, REG_SETUP_AW, maclen - 2); + return status; +} + +uint8_t nrf24_status(FuriHalSpiBusHandle* handle) { + uint8_t tx = RF24_NOP; + nrf24_spi_trx(handle, &tx, &tx, 1); + return tx; +} + +uint32_t nrf24_get_rate(FuriHalSpiBusHandle* handle) { + uint8_t setup = 0; + uint32_t rate = 0; + nrf24_read_reg(handle, REG_RF_SETUP, &setup, 1); + setup &= 0x28; + if(setup == 0x20) + rate = 250000; // 250kbps + else if(setup == 0x08) + rate = 2000000; // 2Mbps + else if(setup == 0x00) + rate = 1000000; // 1Mbps + + return rate; +} + +uint8_t nrf24_set_rate(FuriHalSpiBusHandle* handle, uint32_t rate) { + uint8_t r6 = 0; + uint8_t status = 0; + if(!rate) rate = 2000000; + + nrf24_read_reg(handle, REG_RF_SETUP, &r6, 1); // RF_SETUP register + r6 = r6 & (~0x28); // Clear rate fields. + if(rate == 2000000) + r6 = r6 | 0x08; + else if(rate == 1000000) + r6 = r6; + else if(rate == 250000) + r6 = r6 | 0x20; + + status = nrf24_write_reg(handle, REG_RF_SETUP, r6); // Write new rate. + return status; +} + +uint8_t nrf24_get_chan(FuriHalSpiBusHandle* handle) { + uint8_t channel = 0; + nrf24_read_reg(handle, REG_RF_CH, &channel, 1); + return channel; +} + +uint8_t nrf24_set_chan(FuriHalSpiBusHandle* handle, uint8_t chan) { + uint8_t status; + status = nrf24_write_reg(handle, REG_RF_CH, chan); + return status; +} + +uint8_t nrf24_get_src_mac(FuriHalSpiBusHandle* handle, uint8_t* mac) { + uint8_t size = 0; + uint8_t status = 0; + size = nrf24_get_maclen(handle); + status = nrf24_read_reg(handle, REG_RX_ADDR_P0, mac, size); + return status; +} + +uint8_t nrf24_set_src_mac(FuriHalSpiBusHandle* handle, uint8_t* mac, uint8_t size) { + uint8_t status = 0; + uint8_t clearmac[] = {0, 0, 0, 0, 0}; + nrf24_set_maclen(handle, size); + nrf24_write_buf_reg(handle, REG_RX_ADDR_P0, clearmac, 5); + status = nrf24_write_buf_reg(handle, REG_RX_ADDR_P0, mac, size); + return status; +} + +uint8_t nrf24_get_dst_mac(FuriHalSpiBusHandle* handle, uint8_t* mac) { + uint8_t size = 0; + uint8_t status = 0; + size = nrf24_get_maclen(handle); + status = nrf24_read_reg(handle, REG_TX_ADDR, mac, size); + return status; +} + +uint8_t nrf24_set_dst_mac(FuriHalSpiBusHandle* handle, uint8_t* mac, uint8_t size) { + uint8_t status = 0; + uint8_t clearmac[] = {0, 0, 0, 0, 0}; + nrf24_set_maclen(handle, size); + nrf24_write_buf_reg(handle, REG_TX_ADDR, clearmac, 5); + status = nrf24_write_buf_reg(handle, REG_TX_ADDR, mac, size); + return status; +} + +uint8_t nrf24_get_packetlen(FuriHalSpiBusHandle* handle, uint8_t pipe) { + uint8_t len = 0; + if(pipe > 5) pipe = 0; + nrf24_read_reg(handle, RX_PW_P0 + pipe, &len, 1); + return len; +} + +uint8_t nrf24_set_packetlen(FuriHalSpiBusHandle* handle, uint8_t len) { + uint8_t status = 0; + status = nrf24_write_reg(handle, RX_PW_P0, len); + return status; +} + +// packet_size: 0 - dyn payload (read from PL_WID), 1 - read from pipe size, >1 - override +// Return STATUS reg + additional: RX_DR - new data available, 0x80 - NRF24 hardware error +uint8_t nrf24_rxpacket(FuriHalSpiBusHandle* handle, uint8_t* packet, uint8_t* ret_packetsize, uint8_t packet_size) { + uint8_t status = 0; + uint8_t buf[33]; // 32 max payload size + 1 for command + + status = nrf24_status(handle); + if(!(status & RX_DR)) { + uint8_t st = nrf24_read_register(handle, REG_FIFO_STATUS); + if(st == 0xFF || st == 0) return 0x80; // hardware error + if((st & 1) == 0) { + FURI_LOG_D("NRF", "FIFO PKT"); + status |= RX_DR; // packet in FIFO buffer + } + } + if(status & RX_DR) { + if(status & 0x80) return 0x80; // hardware error + if(packet_size == 1) + packet_size = nrf24_get_packetlen(handle, (status >> 1) & 7); + else if(packet_size == 0){ + buf[0] = R_RX_PL_WID; buf[1] = 0xFF; + nrf24_spi_trx(handle, buf, buf, 2); + packet_size = buf[1]; + } + if(packet_size > 32 || packet_size == 0) packet_size = 32; + memset(buf, 0, packet_size + 1); + buf[0] = R_RX_PAYLOAD; + nrf24_spi_trx(handle, buf, buf, packet_size + 1); + memcpy(packet, &buf[1], packet_size); + nrf24_write_reg(handle, REG_STATUS, RX_DR); // clear RX_DR + } + if(status & (MAX_RT)) { // MAX_RT + nrf24_write_reg(handle, REG_STATUS, (MAX_RT)); // clear MAX_RT. + } + + *ret_packetsize = packet_size; + return status; +} + +// Return 0 when error +uint8_t nrf24_txpacket(FuriHalSpiBusHandle* handle, uint8_t* payload, uint8_t size, bool ack) { + uint8_t status = 0; + uint8_t buf[size + 1]; + buf[0] = ack ? W_TX_PAYLOAD : W_TX_PAYLOAD_NOACK; + memcpy(&buf[1], payload, size); + nrf24_set_tx_mode(handle); + nrf24_spi_trx(handle, buf, buf, size + 1); + uint32_t start_time = furi_get_tick(); + do { + furi_delay_us(100); + status = nrf24_status(handle); + } while(!(status & (TX_DS | MAX_RT)) && furi_get_tick() - start_time < 100UL); + if(status & MAX_RT) { + if(furi_log_get_level() == FuriLogLevelDebug) FURI_LOG_D("NRF", "MAX RT: %X (%X)", nrf24_read_register(handle, REG_OBSERVE_TX), status); + nrf24_flush_tx(handle); + } + furi_hal_gpio_write(nrf24_CE_PIN, false); + //nrf24_set_idle(handle); + if(status & (TX_DS | MAX_RT)) nrf24_write_reg(handle, REG_STATUS, TX_DS | MAX_RT); + return status & TX_DS; +} + +uint8_t nrf24_power_up(FuriHalSpiBusHandle* handle) { + uint8_t status = 0; + uint8_t cfg = 0; + nrf24_read_reg(handle, REG_CONFIG, &cfg, 1); + cfg = cfg | 2; + status = nrf24_write_reg(handle, REG_CONFIG, cfg); + //furi_delay_ms(1000); + return status; +} + +uint8_t nrf24_set_idle(FuriHalSpiBusHandle* handle) { + uint8_t status = 0; + uint8_t cfg = 0; + nrf24_read_reg(handle, REG_CONFIG, &cfg, 1); + cfg &= 0xfc; // clear bottom two bits to power down the radio + status = nrf24_write_reg(handle, REG_CONFIG, cfg); + furi_hal_gpio_write(nrf24_CE_PIN, false); + return status; +} + +uint8_t nrf24_set_rx_mode(FuriHalSpiBusHandle* handle) { + uint8_t cfg = 0; + cfg = nrf24_read_register(handle, REG_CONFIG); + cfg |= 0x03; // PWR_UP, and PRIM_RX + cfg = nrf24_write_reg(handle, REG_CONFIG, cfg); + furi_hal_gpio_write(nrf24_CE_PIN, true); + return cfg; +} + +uint8_t nrf24_set_tx_mode(FuriHalSpiBusHandle* handle) { + uint8_t reg; + furi_hal_gpio_write(nrf24_CE_PIN, false); + //nrf24_write_reg(handle, REG_STATUS, TX_DS | MAX_RT); + reg = nrf24_read_register(handle, REG_CONFIG); + reg &= ~0x01; // disable PRIM_RX + reg |= 0x02; // PWR_UP + reg = nrf24_write_reg(handle, REG_CONFIG, reg); + furi_hal_gpio_write(nrf24_CE_PIN, true); + return reg; +} + +void hexlify(uint8_t* in, uint8_t size, char* out) { + memset(out, 0, size * 2); + for(int i = 0; i < size; i++) + snprintf(out + strlen(out), sizeof(out + strlen(out)), "%02X", in[i]); +} + +uint64_t bytes_to_int64(uint8_t* bytes, uint8_t size, bool bigendian) { + uint64_t ret = 0; + for(int i = 0; i < size; i++) + if(bigendian) + ret |= bytes[i] << ((size - 1 - i) * 8); + else + ret |= bytes[i] << (i * 8); + + return ret; +} + +void int64_to_bytes(uint64_t val, uint8_t* out, bool bigendian) { + for(int i = 0; i < 8; i++) { + if(bigendian) + out[i] = (val >> ((7 - i) * 8)) & 0xff; + else + out[i] = (val >> (i * 8)) & 0xff; + } +} + +uint32_t bytes_to_int32(uint8_t* bytes, bool bigendian) { + uint32_t ret = 0; + for(int i = 0; i < 4; i++) + if(bigendian) + ret |= bytes[i] << ((3 - i) * 8); + else + ret |= bytes[i] << (i * 8); + + return ret; +} + +void int32_to_bytes(uint32_t val, uint8_t* out, bool bigendian) { + for(int i = 0; i < 4; i++) { + if(bigendian) + out[i] = (val >> ((3 - i) * 8)) & 0xff; + else + out[i] = (val >> (i * 8)) & 0xff; + } +} + +uint64_t bytes_to_int16(uint8_t* bytes, bool bigendian) { + uint16_t ret = 0; + for(int i = 0; i < 2; i++) + if(bigendian) + ret |= bytes[i] << ((1 - i) * 8); + else + ret |= bytes[i] << (i * 8); + + return ret; +} + +void int16_to_bytes(uint16_t val, uint8_t* out, bool bigendian) { + for(int i = 0; i < 2; i++) { + if(bigendian) + out[i] = (val >> ((1 - i) * 8)) & 0xff; + else + out[i] = (val >> (i * 8)) & 0xff; + } +} + +uint8_t nrf24_set_mac(uint8_t mac_addr, uint8_t *mac, uint8_t mlen) +{ + uint8_t addr[5]; + for(int i = 0; i < mlen; i++) addr[i] = mac[mlen - i - 1]; + return nrf24_write_buf_reg(nrf24_HANDLE, mac_addr, addr, mlen); +} \ No newline at end of file diff --git a/lib/nrf24/nrf24.h b/lib/nrf24/nrf24.h new file mode 100644 index 00000000000..a05ddbebc35 --- /dev/null +++ b/lib/nrf24/nrf24.h @@ -0,0 +1,386 @@ +#pragma once +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define R_REGISTER 0x00 +#define W_REGISTER 0x20 +#define REGISTER_MASK 0x1F +#define ACTIVATE 0x50 +#define R_RX_PL_WID 0x60 +#define R_RX_PAYLOAD 0x61 +#define W_TX_PAYLOAD 0xA0 +#define W_TX_PAYLOAD_NOACK 0xB0 +#define W_ACK_PAYLOAD 0xA8 +#define FLUSH_TX 0xE1 +#define FLUSH_RX 0xE2 +#define REUSE_TX_PL 0xE3 +#define RF24_NOP 0xFF + +#define REG_CONFIG 0x00 +#define REG_EN_AA 0x01 +#define REG_EN_RXADDR 0x02 +#define REG_SETUP_AW 0x03 +#define REG_SETUP_RETR 0x04 +#define REG_DYNPD 0x1C +#define REG_FEATURE 0x1D +#define REG_RF_SETUP 0x06 +#define REG_STATUS 0x07 +#define REG_RX_ADDR_P0 0x0A +#define REG_RX_ADDR_P1 0x0B +#define REG_RX_ADDR_P2 0x0C +#define REG_RX_ADDR_P3 0x0D +#define REG_RX_ADDR_P4 0x0E +#define REG_RX_ADDR_P5 0x0F +#define REG_RF_CH 0x05 +#define REG_TX_ADDR 0x10 +#define REG_FIFO_STATUS 0x17 +#define REG_OBSERVE_TX 0x08 + +#define RX_PW_P0 0x11 +#define RX_PW_P1 0x12 +#define RX_PW_P2 0x13 +#define RX_PW_P3 0x14 +#define RX_PW_P4 0x15 +#define RX_PW_P5 0x16 +#define RX_DR 0x40 +#define TX_DS 0x20 +#define MAX_RT 0x10 +#define NRF24_EN_DYN_ACK 0x01 + +#define nrf24_TIMEOUT 500 +#define nrf24_CE_PIN &gpio_ext_pb2 +#define nrf24_HANDLE &furi_hal_spi_bus_handle_external + +/* Low level API */ + +/** Write device register + * + * @param handle - pointer to FuriHalSpiHandle + * @param reg - register + * @param data - data to write + * + * @return device status + */ +uint8_t nrf24_write_reg(FuriHalSpiBusHandle* handle, uint8_t reg, uint8_t data); + +/** Write buffer to device register + * + * @param handle - pointer to FuriHalSpiHandle + * @param reg - register + * @param data - data to write + * @param size - size of data to write + * + * @return device status + */ +uint8_t nrf24_write_buf_reg(FuriHalSpiBusHandle* handle, uint8_t reg, uint8_t* data, uint8_t size); + +/** Read device register + * + * @param handle - pointer to FuriHalSpiHandle + * @param reg - register + * @param[out] data - pointer to data + * + * @return device status + */ +uint8_t nrf24_read_reg(FuriHalSpiBusHandle* handle, uint8_t reg, uint8_t* data, uint8_t size); + +// Read single register (1 byte) +uint8_t nrf24_read_register(FuriHalSpiBusHandle* handle, uint8_t reg); + +/** Power up the radio for operation + * + * @param handle - pointer to FuriHalSpiHandle + * + * @return device status + */ +uint8_t nrf24_power_up(FuriHalSpiBusHandle* handle); + +/** Power down the radio + * + * @param handle - pointer to FuriHalSpiHandle + * + * @return device status + */ +uint8_t nrf24_set_idle(FuriHalSpiBusHandle* handle); + +/** Sets the radio to RX mode + * + * @param handle - pointer to FuriHalSpiHandle + * + * @return device status + */ +uint8_t nrf24_set_rx_mode(FuriHalSpiBusHandle* handle); + +/** Sets the radio to TX mode + * + * @param handle - pointer to FuriHalSpiHandle + * + * @return device status + */ +uint8_t nrf24_set_tx_mode(FuriHalSpiBusHandle* handle); + +/*=============================================================================================================*/ + +/* High level API */ + +/** Must call this before using any other nrf24 API + * + */ +void nrf24_init(); + +/** Must call this when we end using nrf24 device + * + */ +void nrf24_deinit(); + +/** Send flush rx command + * + * @param handle - pointer to FuriHalSpiHandle + * + * @return device status + */ +uint8_t nrf24_flush_rx(FuriHalSpiBusHandle* handle); + +/** Send flush tx command + * + * @param handle - pointer to FuriHalSpiHandle + * + * @return device status + */ +uint8_t nrf24_flush_tx(FuriHalSpiBusHandle* handle); + +/** Gets the RX packet length in data pipe 0 + * + * @param handle - pointer to FuriHalSpiHandle + * pipe - pipe index (0..5) + * @return packet length in data pipe 0 + */ +uint8_t nrf24_get_packetlen(FuriHalSpiBusHandle* handle, uint8_t pipe); + +/** Sets the RX packet length in data pipe 0 + * + * @param handle - pointer to FuriHalSpiHandle + * @param len - length to set + * + * @return device status + */ +uint8_t nrf24_set_packetlen(FuriHalSpiBusHandle* handle, uint8_t len); + +/** Gets configured length of MAC address + * + * @param handle - pointer to FuriHalSpiHandle + * + * @return MAC address length + */ +uint8_t nrf24_get_maclen(FuriHalSpiBusHandle* handle); + +/** Sets configured length of MAC address + * + * @param handle - pointer to FuriHalSpiHandle + * @param maclen - length to set MAC address to, must be greater than 1 and less than 6 + * + * @return MAC address length + */ +uint8_t nrf24_set_maclen(FuriHalSpiBusHandle* handle, uint8_t maclen); + +/** Gets the current status flags from the STATUS register + * + * @param handle - pointer to FuriHalSpiHandle + * + * @return status flags + */ +uint8_t nrf24_status(FuriHalSpiBusHandle* handle); + +/** Gets the current transfer rate + * + * @param handle - pointer to FuriHalSpiHandle + * + * @return transfer rate in bps + */ +uint32_t nrf24_get_rate(FuriHalSpiBusHandle* handle); + +/** Sets the transfer rate + * + * @param handle - pointer to FuriHalSpiHandle + * @param rate - the transfer rate in bps + * + * @return device status + */ +uint8_t nrf24_set_rate(FuriHalSpiBusHandle* handle, uint32_t rate); + +/** Gets the current channel + * In nrf24, the channel number is multiplied times 1MHz and added to 2400MHz to get the frequency + * + * @param handle - pointer to FuriHalSpiHandle + * + * @return channel + */ +uint8_t nrf24_get_chan(FuriHalSpiBusHandle* handle); + +/** Sets the channel + * + * @param handle - pointer to FuriHalSpiHandle + * @param frequency - the frequency in hertz + * + * @return device status + */ +uint8_t nrf24_set_chan(FuriHalSpiBusHandle* handle, uint8_t chan); + +/** Gets the source mac address + * + * @param handle - pointer to FuriHalSpiHandle + * @param[out] mac - the source mac address + * + * @return device status + */ +uint8_t nrf24_get_src_mac(FuriHalSpiBusHandle* handle, uint8_t* mac); + +/** Sets the source mac address + * + * @param handle - pointer to FuriHalSpiHandle + * @param mac - the mac address to set + * @param size - the size of the mac address (2 to 5) + * + * @return device status + */ +uint8_t nrf24_set_src_mac(FuriHalSpiBusHandle* handle, uint8_t* mac, uint8_t size); + +/** Gets the dest mac address + * + * @param handle - pointer to FuriHalSpiHandle + * @param[out] mac - the source mac address + * + * @return device status + */ +uint8_t nrf24_get_dst_mac(FuriHalSpiBusHandle* handle, uint8_t* mac); + +/** Sets the dest mac address + * + * @param handle - pointer to FuriHalSpiHandle + * @param mac - the mac address to set + * @param size - the size of the mac address (2 to 5) + * + * @return device status + */ +uint8_t nrf24_set_dst_mac(FuriHalSpiBusHandle* handle, uint8_t* mac, uint8_t size); + +/** Reads RX packet + * + * @param handle - pointer to FuriHalSpiHandle + * @param[out] packet - the packet contents + * @param[out] ret_packetsize - size of the received packet + * @param packet_size: >1 - size, 1 - packet length is determined by RX_PW_P0 register, 0 - it is determined by dynamic payload length command + * + * @return device status + */ +uint8_t + nrf24_rxpacket(FuriHalSpiBusHandle* handle, uint8_t* packet, uint8_t* ret_packetsize, uint8_t packet_size_flag); + +/** Sends TX packet + * + * @param handle - pointer to FuriHalSpiHandle + * @param packet - the packet contents + * @param size - packet size + * @param ack - boolean to determine whether an ACK is required for the packet or not + * + * @return device status + */ +uint8_t nrf24_txpacket(FuriHalSpiBusHandle* handle, uint8_t* payload, uint8_t size, bool ack); + +/** Configure the radio + * This is not comprehensive, but covers a lot of the common configuration options that may be changed + * @param handle - pointer to FuriHalSpiHandle + * @param rate - transfer rate in Mbps (1 or 2) + * @param srcmac - source mac address + * @param dstmac - destination mac address + * @param maclen - length of mac address + * @param channel - channel to tune to + * @param noack - if true, disable auto-acknowledge + * @param disable_aa - if true, disable ShockBurst + * + */ +void nrf24_configure( + FuriHalSpiBusHandle* handle, + uint8_t rate, + uint8_t* srcmac, + uint8_t* dstmac, + uint8_t maclen, + uint8_t channel, + bool noack, + bool disable_aa); + +// Set mac address (MSB first), Return: Status +uint8_t nrf24_set_mac(uint8_t mac_addr, uint8_t *mac, uint8_t mlen); + +/** Configures the radio for "promiscuous mode" and primes it for rx + * This is not an actual mode of the nrf24, but this function exploits a few bugs in the chip that allows it to act as if it were. + * See http://travisgoodspeed.blogspot.com/2011/02/promiscuity-is-nrf24l01s-duty.html for details. + * @param handle - pointer to FuriHalSpiHandle + * @param channel - channel to tune to + * @param rate - transfer rate in Mbps (1 or 2) + */ +void nrf24_init_promisc_mode(FuriHalSpiBusHandle* handle, uint8_t channel, uint8_t rate); + +/** Listens for a packet and returns first possible address sniffed + * Call this only after calling nrf24_init_promisc_mode + * @param handle - pointer to FuriHalSpiHandle + * @param maclen - length of target mac address + * @param[out] addresses - sniffed address + * + * @return success + */ +bool nrf24_sniff_address(FuriHalSpiBusHandle* handle, uint8_t maclen, uint8_t* address); + +/** Sends ping packet on each channel for designated tx mac looking for ack + * + * @param handle - pointer to FuriHalSpiHandle + * @param srcmac - source address + * @param dstmac - destination address + * @param maclen - length of address + * @param rate - transfer rate in Mbps (1 or 2) + * @param min_channel - channel to start with + * @param max_channel - channel to end at + * @param autoinit - if true, automatically configure radio for this channel + * + * @return channel that the address is listening on, if this value is above the max_channel param, it failed + */ +uint8_t nrf24_find_channel( + FuriHalSpiBusHandle* handle, + uint8_t* srcmac, + uint8_t* dstmac, + uint8_t maclen, + uint8_t rate, + uint8_t min_channel, + uint8_t max_channel, + bool autoinit); + +/** Converts 64 bit value into uint8_t array + * @param val - 64-bit integer + * @param[out] out - bytes out + * @param bigendian - if true, convert as big endian, otherwise little endian + */ +void int64_to_bytes(uint64_t val, uint8_t* out, bool bigendian); + +/** Converts 32 bit value into uint8_t array + * @param val - 32-bit integer + * @param[out] out - bytes out + * @param bigendian - if true, convert as big endian, otherwise little endian + */ +void int32_to_bytes(uint32_t val, uint8_t* out, bool bigendian); + +/** Converts uint8_t array into 32 bit value + * @param bytes - uint8_t array + * @param bigendian - if true, convert as big endian, otherwise little endian + * + * @return 32-bit value + */ +uint32_t bytes_to_int32(uint8_t* bytes, bool bigendian); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/nrf24batch.c b/nrf24batch.c new file mode 100644 index 00000000000..ab5d7432190 --- /dev/null +++ b/nrf24batch.c @@ -0,0 +1,1972 @@ +// +// Written by vad7, 10.01.2023. vad7@yahoo.com +// +#include "nrf24batch.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TAG "nrf24batch" +#define VERSION "1.9" + +#define SCAN_APP_PATH_FOLDER "/ext/nrf24batch" +#define LOG_FILEEXT ".txt" +#define NRF_READ_TIMEOUT 300UL // ms +#define WORK_PERIOD 2 // ms, Timer period +#define MAX_CHANNEL 125 +#define FONT_5x7_SCREEN_WIDTH 25 +#define NRF_EN_DYN_ACK 0 // does not work on some nrf24l01+ chips, (0/1) + +const char SettingsFld_Info[] = "Info:"; +const char SettingsFld_Ch[] = "Ch:"; +const char SettingsFld_Rate[] = "Rate:"; +const char SettingsFld_DPL[] = "DPL:"; +const char SettingsFld_CRC[] = "CRC:"; +const char SettingsFld_RETR[] = "RETR:"; +const char SettingsFld_Address[] = "Address:"; +const char SettingsFld_Resend[] = "Resend:"; +const char SettingsFld_Delay[] = "Delay_ms:"; +const char SettingsFld_WriteStart[] = "Write start:"; +const char SettingsFld_Payload[] = "Payload struct:"; +const char SettingsFld_ReadDefault[] = "R default:"; +const char SettingsFld_WriteDefault[] = "W default:"; +const char SettingsFld_Read[] = "R:"; // Read cmd +const char SettingsFld_Write[] = "W:"; // Write cmd +const char SettingsFld_Set[] = "S:"; // Set cmd (like Write but without "Write start" packet) +const char SettingsFld_ReadBatch[] = "RBatch:"; +const char SettingsFld_WriteBatch[] = "WBatch:"; +const char SettingsFld_SetBatch[] = "SBatch:"; +const char SettingsFld_Listen[] = "Listen:"; +const char SettingsFld_ReadCmdRepeatPeriod[] = "ReadCmd repeat:"; +const char AskQuestion_Save[] = "SAVE BATCH?"; +#define Settings_i 'i' +#define Settings_n 'n' +#define VAR_EMPTY ((int32_t)0x80000000) + +nRF24Batch* APP; +uint8_t what_doing = 0; // 0 - setup, 1 - cmd list, 2 - read/write/listen cmd +enum { + rwt_set_batch = 0, // fast send packet without question + rwt_read_batch, // Send read cmd and wait for answer in batch + rwt_read_cmd, // Send read cmd and wait for answer + rwt_write_batch, // Send write cmd (with Write start pkt if available) with a question before it + rwt_listen, // Listen mode (wait incoming pkts) + rwt_max +}; +uint8_t rw_type = rwt_read_batch; // What to do: rwt_* +enum { sst_none = 0, sst_sending, sst_receiving, sst_ok, sst_error, sst_timeout }; +uint8_t send_status = sst_none; // sst_* +bool cmd_array = false; +uint8_t cmd_array_idx; +uint8_t cmd_array_cnt = 0; +bool cmd_array_hex; +uint8_t save_settings = 0; +uint16_t view_cmd[rwt_max - 1] = {0}; // SetBatch, ReadBatch, Read, WriteBatch +uint8_t view_x = 0; +char screen_buf[64]; +char Info[35] = ""; +char file_name[FONT_5x7_SCREEN_WIDTH]; +char ERR_STR[FONT_5x7_SCREEN_WIDTH]; +uint8_t ERR = 0; +uint8_t NRF_rate; // 0 - 250Kbps, 1 - 1Mbps, 2 - 2Mbps +uint8_t NRF_channel; // 0..125 +uint8_t NRF_DPL; // 1 - Dynamic Payload Length +uint8_t NRF_CRC; // 1 - No, 1 - CRC 1byte, 2 - CRC 2byte +uint8_t NRF_RETR = ((0b0011 << 4) | 0b1111); // Automatic Retransmission, ARD, ARC +uint8_t NRF_Payload; // Payload len in bytes, 0..32 +bool NRF_ERROR = 0; +uint8_t NRF_INITED = 0; // 0 - not, 1 - rw, rwt_listen - listen +bool NRF_BOARD_POWER_5V = false; +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 ReadCmdRepeatPeriod = 10; // s +bool ReadRepeat = false; +uint32_t delay_between_pkt = 10; // ms + +uint8_t addr[5]; // nRF24 address, MSB first +uint8_t addr_len = 0; // 2..5 +uint8_t payload[32]; +uint8_t payload_receive[32]; +uint8_t payload_struct[32]; // sizeof(1..4) in bytes of each field, example: 2,1,1 +uint8_t payload_fields = 0; +uint8_t payload_size = 0; // bytes +uint16_t view_Batch = 0; // view pos in Batch or inside WriteBatch (Log[view_Batch]) +uint16_t view_WriteBatch = 0; // view pos of WriteBatch list +uint8_t setup_cursor = 0; // cursor position on Setup scr +uint8_t Edit = 0; +char* Edit_pos; +char* Edit_start; +bool Edit_hex; // 0 - decimal, 1 - hex +bool Edited = false; // list of cmds edited + +Stream* file_stream = NULL; +FuriString* ReadDefault = NULL; +FuriString* WriteDefault = NULL; +FuriString* WriteStart = NULL; +FuriString* Constants = NULL; // text of STR=x +uint8_t listen_addr[5]; +uint8_t listen_addr_len = 0; +char* ListenFields = NULL; // ptr to string: field1,field2,... max 5 field now +bool ListenNew; +FuriHalRtcDateTime ListenLastTime = {0}; +uint32_t ListenPrev = 0; +uint32_t ListenLast = 0; +FuriString** Read_cmd = NULL; // Names of read cmd +uint16_t Read_cmd_Total = 0; +FuriString** Log = NULL; // Strings: var=n +uint16_t Log_Total = 0; +FuriString** ReadBatch_cmd = NULL; // Names of read batch cmd +uint16_t ReadBatch_cmd_Total = 0; +char* ReadBatch_cmd_curr = NULL; // =0xFFFFFFFF - finish +FuriString** WriteBatch_cmd = NULL; // Names of write batch cmd +uint16_t WriteBatch_cmd_Total = 0; +uint16_t WriteBatch_cmd_curr = 0; // == _Total - finish +FuriString** SetBatch_cmd = NULL; // Names of set batch cmd +uint16_t SetBatch_cmd_Total = 0; +uint16_t SetBatch_cmd_curr = 0; // == _Total - finish + +#define POWER_READ_PERIOD 501 // ms +uint16_t pwr_read_timer = 0; +int Current = 0; +int CurrentStart = 0; + +enum { ask_write_batch = 1, ask_save_batch, ask_skip_cmd, ask_return, ask_exit }; +uint8_t ask_question = 0; // 1 - Ask now - ask_* +uint8_t ask_question_answer = 0; // 0 - no, 1 - yes + +static bool ask_fill_screen_buf(void) { + if(ask_question == ask_write_batch) + strcpy(screen_buf, "RUN WRITE BATCH?"); + else if(ask_question == ask_save_batch) + strcpy(screen_buf, "SAVE AS WRITE BATCH?"); + else if(ask_question == ask_skip_cmd) + strcpy(screen_buf, "SKIP CMD?"); + else if(ask_question == ask_return) + strcpy(screen_buf, "RETURN?"); + else if(ask_question == ask_exit) + strcpy(screen_buf, "EXIT?"); + else + return false; + strcat(screen_buf, ask_question_answer ? " YES" : " NO"); + return true; +} + +//#define MIN(a, b) ((a= '0' && c <= '9') return true; + if(hex) { + c &= ~0x20; + if(c >= 'A' && c <= 'F') return true; + } else if(c == '-') + return true; + return false; +} + +// Return num bytes in array +static uint8_t ConvertHexToArray(char* hex, uint8_t* array, uint8_t maxlen) { + uint8_t len = 0; + while(maxlen) { + uint8_t ch = *hex++; + if(ch < ' ') break; + if(ch < '0') continue; + *array++ = (GetHexVal(ch) << 4) + GetHexVal(*hex++); + len++; + maxlen--; + } + return len; +} + +int32_t str_to_int(char* p) { + if(*(p + 1) == 'x') { // hex + return strtol(p + 2, NULL, 16); + } else + return strtol(p, NULL, 10); +} + +void str_rtrim(char* p) { + char* delim_col = strchr(p, '\r'); + if(delim_col) + *delim_col = '\0'; + else { + delim_col = strchr(p, '\n'); + if(delim_col) *delim_col = '\0'; + } +} + +static void add_to_str_hex_bytes(char* out, uint8_t* arr, int bytes) { + if(bytes <= 0) return; + out += strlen(out); + do { + snprintf(out, 3, "%02X", *arr++); + out += 2; + } while(--bytes); +} + +// skip leading zeros +static void add_to_str_hex_variable(char* out, uint8_t* arr, int size) { + if(size <= 0) return; + out += strlen(out); + arr += size - 1; + while(*arr == 0 && size > 1) { + arr--; + size--; + } + do { + snprintf(out, 3, "%02X", *arr--); + out += 2; + } while(--size); +} + +void Edit_insert_digit(char new) { + if(*Edit_pos == '-') return; + if(what_doing <= 1) { + if(strlen(Edit_start) < (what_doing == 0 && setup_cursor == 2 ? 3 : 5 * 2)) { + memmove(Edit_pos + 1, Edit_pos, strlen(Edit_pos) + 1); + *Edit_pos = new; + } + } else { + FuriString* fs = Log[view_Batch]; + FuriString* ns = furi_string_alloc(); + if(ns) { + uint16_t len = Edit_pos - (char*)furi_string_get_cstr(fs); + furi_string_set_n(ns, fs, 0, len); + furi_string_cat_printf(ns, "%c", new); + furi_string_cat_str(ns, Edit_pos); + Log[view_Batch] = ns; + Edit_pos = (char*)furi_string_get_cstr(ns); + Edit_start = Edit_pos + (Edit_start - (char*)furi_string_get_cstr(fs)); + Edit_pos += len; + furi_string_free(fs); + } + } +} + +int32_t get_payload_receive_field(uint8_t* var, uint8_t size) { + if(size <= 1) + return *var; + else if(size == 2) + return *(int16_t*)var; + else if(size == 3) + return (*(uint32_t*)var) & 0xFFFFFF; + else + return *(int32_t*)var; +} + +void free_Log() { + if(Log_Total) { + for(uint16_t i = 0; i < Log_Total; i++) + if(Log[i]) furi_string_free(Log[i]); + Log_Total = 0; + } + if(Log) { + free(Log); + Log = NULL; + } +} + +void free_store(void) { + if(Constants) { + furi_string_free(Constants); + Constants = NULL; + } + if(ReadDefault) { + furi_string_free(ReadDefault); + ReadDefault = NULL; + } + if(WriteDefault) { + furi_string_free(WriteDefault); + WriteDefault = NULL; + } + if(WriteStart) { + furi_string_free(WriteStart); + WriteDefault = NULL; + } + if(ListenFields) { + free(ListenFields); + ListenFields = NULL; + } + if(Read_cmd_Total) { + for(uint16_t i = 0; i < Read_cmd_Total; i++) furi_string_free(Read_cmd[i]); + Read_cmd_Total = 0; + } + if(Read_cmd) { + free(Read_cmd); + Read_cmd = NULL; + } + if(ReadBatch_cmd_Total) { + for(uint16_t i = 0; i < ReadBatch_cmd_Total; i++) furi_string_free(ReadBatch_cmd[i]); + ReadBatch_cmd_Total = 0; + } + if(ReadBatch_cmd) { + free(ReadBatch_cmd); + ReadBatch_cmd = NULL; + } + if(WriteBatch_cmd_Total) { + for(uint16_t i = 0; i < WriteBatch_cmd_Total; i++) furi_string_free(WriteBatch_cmd[i]); + WriteBatch_cmd_Total = 0; + } + if(WriteBatch_cmd) { + free(WriteBatch_cmd); + WriteBatch_cmd = NULL; + } + if(SetBatch_cmd_Total) { + for(uint16_t i = 0; i < SetBatch_cmd_Total; i++) furi_string_free(SetBatch_cmd[i]); + SetBatch_cmd_Total = 0; + } + if(SetBatch_cmd) { + free(SetBatch_cmd); + SetBatch_cmd = NULL; + } + free_Log(); +} + +void update_power(void) { + Current = furi_hal_power_get_battery_current(FuriHalPowerICFuelGauge) * 1000; +} + +void check_en_power_5V(void) { + if(!furi_hal_power_is_otg_enabled() && !furi_hal_power_is_charging()) { + FURI_LOG_D("PWR", "NO 5V, TURN ON"); + notification_message(APP->notification, &sequence_blink_yellow_100); + furi_delay_ms(10); + update_power(); + CurrentStart = Current; + furi_hal_power_enable_otg(); + NRF_BOARD_POWER_5V = true; + furi_delay_ms(100); + NRF_INITED = 0; + } +} + +static bool select_settings_file() { + DialogsApp* dialogs = furi_record_open("dialogs"); + bool result = false; + FuriString* path; + path = furi_string_alloc(); + furi_string_set(path, SCAN_APP_PATH_FOLDER); + DialogsFileBrowserOptions browser_options; + dialog_file_browser_set_basic_options(&browser_options, ".txt", NULL); + browser_options.hide_ext = false; + bool ret = dialog_file_browser_show(dialogs, path, path, &browser_options); + furi_record_close("dialogs"); + if(ret) { + if(!file_stream_open( + file_stream, furi_string_get_cstr(path), FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) { + FURI_LOG_D(TAG, "Cannot open file \"%s\"", furi_string_get_cstr(path)); + file_stream_close(file_stream); + } else { + FURI_LOG_D(TAG, "Open file \"%s\"", furi_string_get_cstr(path)); + strncpy( + file_name, + furi_string_get_cstr(path) + sizeof(SCAN_APP_PATH_FOLDER), + sizeof(file_name)); + result = true; + } + } + furi_string_free(path); + return result; +} + +static void prepare_nrf24(void) { + check_en_power_5V(); + if(!NRF_INITED || rw_type == rwt_listen || NRF_INITED == rwt_listen) { + FURI_LOG_D("NRF", "Prepare"); + uint8_t adrlen, *adr; + if(rw_type == rwt_listen) { + adrlen = listen_addr_len; + adr = listen_addr; + NRF_INITED = rwt_listen; + } else { + adrlen = addr_len; + adr = addr; + NRF_INITED = 1; + } + furi_hal_gpio_write(nrf24_CE_PIN, false); + nrf24_set_mac(REG_RX_ADDR_P0, adr, adrlen); + uint8_t tmp[5] = {0}; + nrf24_read_reg(nrf24_HANDLE, REG_RX_ADDR_P0, tmp, adrlen); + for(uint8_t i = 0; i < adrlen / 2; i++) { + uint8_t tb = tmp[i]; + tmp[i] = tmp[adrlen - i - 1]; + tmp[adrlen - i - 1] = tb; + } + NRF_ERROR = memcmp(adr, tmp, adrlen) != 0; + if(NRF_ERROR) { + NRF_INITED = 0; + return; + } + // EN_DYN_ACK(0x01) option for W_TX_PAYLOAD_NOACK cmd broke AA on some fake nRF24l01+, i.e. set it to 0 + nrf24_write_reg( + nrf24_HANDLE, + REG_FEATURE, + NRF_EN_DYN_ACK + + (NRF_DPL ? 4 : + 0)); // Dynamic Payload, Payload with ACK, W_TX_PAYLOAD_NOACK command + nrf24_write_reg(nrf24_HANDLE, REG_RF_CH, NRF_channel); + nrf24_write_reg( + nrf24_HANDLE, + REG_RF_SETUP, + (NRF_rate == 0 ? 0b00100000 : + NRF_rate == 1 ? 0 : + 0b00001000) | + 0b111); // +TX high power + nrf24_write_reg( + nrf24_HANDLE, + REG_CONFIG, + 0x70 | ((NRF_CRC == 1 ? 0b1000 : + NRF_CRC == 2 ? 0b1100 : + 0))); // Mask all interrupts + nrf24_write_reg( + nrf24_HANDLE, REG_SETUP_RETR, NRF_RETR); // Automatic Retransmission, ARD<<4 + ARC + nrf24_write_reg(nrf24_HANDLE, REG_EN_AA, 0x01); // Auto acknowledgement + nrf24_write_reg(nrf24_HANDLE, REG_DYNPD, NRF_DPL ? 0x3F : 0); // Enable dynamic payload reg + nrf24_write_reg(nrf24_HANDLE, RX_PW_P0, payload_size); + nrf24_set_maclen(nrf24_HANDLE, adrlen); + nrf24_set_mac(REG_TX_ADDR, adr, adrlen); + nrf24_write_reg(nrf24_HANDLE, REG_EN_RXADDR, 1); + //nrf24_set_idle(nrf24_HANDLE); + } + nrf24_flush_tx(nrf24_HANDLE); + nrf24_flush_rx(nrf24_HANDLE); + nrf24_write_reg(nrf24_HANDLE, REG_STATUS, MAX_RT | RX_DR | TX_DS); +} + +// true - ok +uint8_t nrf24_send_packet() { + if(furi_log_get_level() == FuriLogLevelDebug) { + char buf[65]; + buf[0] = 0; + add_to_str_hex_bytes(buf, payload, payload_size); + FURI_LOG_D(TAG, "SEND: %s", buf); + } + //nrf24_flush_tx(nrf24_HANDLE); + //nrf24_write_reg(nrf24_HANDLE, REG_STATUS, RX_DR | TX_DS | MAX_RT); + NRF_last_packet_send_st = nrf24_txpacket(nrf24_HANDLE, payload, payload_size, true); // ACK + if(NRF_last_packet_send_st) { + if((rw_type == rwt_read_cmd || rw_type == rwt_read_batch) && + send_status == sst_sending) { // Read + nrf24_set_rx_mode(nrf24_HANDLE); + send_status = sst_receiving; // receiving + } + } else + notification_message(APP->notification, &sequence_blink_red_100); + NRF_time = furi_get_tick(); + FURI_LOG_D( + TAG, + "Send packet: %d%s", + NRF_last_packet_send_st, + send_status == sst_receiving ? ", Receiving" : ""); + return NRF_last_packet_send_st; +} + +uint8_t nrf24_resend_read_packet() { + if(Log_Total && !cmd_array) { + FuriString* str = Log[Log_Total - 1]; + char* p = strstr(furi_string_get_cstr(str), ": "); + if(p) { + if(strncmp(p + 2, "0x", 2) == 0) p += 2; + furi_string_left(str, p - furi_string_get_cstr(str) + 2); + } + } + return nrf24_send_packet(); +} + +// true - new packet +bool nrf24_read_newpacket() { + bool found = false; + uint8_t packetsize; + uint8_t st = + nrf24_rxpacket(nrf24_HANDLE, payload_receive, &packetsize, NRF_DPL ? 0 : payload_size); + if(st & RX_DR) { + NRF_time = furi_get_tick(); + if(furi_log_get_level() == FuriLogLevelDebug) { + char buf[65]; + buf[0] = 0; + add_to_str_hex_bytes(buf, payload_receive, packetsize); + FURI_LOG_D(TAG, "READ(%X): %s", st, buf); + } + if(Log_Total) { + FuriString* str = Log[Log_Total - 1]; + uint8_t size = 1; + char* p = strchr((char*)furi_string_get_cstr(str), '*'); + if(p) { + p++; + if(*p == '=') + size = 0; // string + else { + size = *p - '0'; + if(size > 4) size = 0; + } + } + int32_t var = get_payload_receive_field(payload_receive, size); + //FURI_LOG_D(TAG, "VAR(%d): %ld", size, var); + if(size == 0) + furi_string_cat_printf(str, "%c", (char)var); + else { + char hex[9]; + hex[0] = '\0'; + add_to_str_hex_variable(hex, (uint8_t*)&var, size); + if((cmd_array && cmd_array_hex) || furi_string_end_with_str(str, "0x")) + furi_string_cat_str(str, hex); + else { + if(var >= 0 && var <= 9) + furi_string_cat_printf(str, "%ld", var); + else + furi_string_cat_printf(str, "%ld (%s)", var, hex); + } + } + if(cmd_array) { + if(--cmd_array_cnt) { + furi_string_cat_str(str, ","); + if(cmd_array_hex) furi_string_cat_str(str, "0x"); + payload[cmd_array_idx] += size; // next array element + NRF_repeat = -1; + send_status = sst_sending; // Will be send after delay_between_pkt + } else + send_status = sst_ok; + } else { + if(size == 0) { // string, until '\0' + if(var == 0) send_status = sst_ok; + } else + send_status = sst_ok; + } + } + //notification_message(APP->notification, &sequence_blink_white_100); + found = true; + } else if(st & 0x80) { // NRF24 hardware error + NRF_ERROR = 1; + NRF_INITED = 0; + } + return found; +} + +// Search in constatnt pull (Const1=n; Const2=n;...) +// VAR_EMPTY - not found +int32_t subs_constant(char* p, uint8_t len) { + char* c = (char*)furi_string_get_cstr(Constants); + while((c = strchr(c, *p))) { + if(strncmp(c, p, len) != 0) { + c++; + continue; + } + if(c == (char*)furi_string_get_cstr(Constants) || *(c - 1) == ';' || *(c - 1) <= ' ') { + c += len; + if(*c == '=') { + c++; + return str_to_int(c); + } + } else + c += len; + } + return VAR_EMPTY; +} + +// fill payload with default = p +// if var_n = VAR_EMPTY - skip filling var_* +bool fill_payload(char* p, uint8_t* idx_i, int32_t var_n) { + if(idx_i) *idx_i = 255; + uint8_t fld = 0; // field # + uint8_t idx = 0; // byte index + do { + int32_t b = 0; + char* end = strchr(p, ','); + if(*p >= '0' && *p <= '9') { // Number found + b = str_to_int(p); + } else if(*p == 'i' && *(p + 1) == ':') { // 'i:' array index + b = str_to_int(p + 2); + if(idx_i) *idx_i = idx; + } else if(*p == 'n' && *(p + 1) < '0') { // var_n + if(var_n != VAR_EMPTY) b = var_n; + } else if(*p >= 'A') { // constant found + 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)); + strcpy(ERR_STR, "No "); + strncpy(ERR_STR + strlen(ERR_STR), p, sizeof(ERR_STR) - 4); + FURI_LOG_D(TAG, "Constant not found: %s", p); + return false; + } + } else if(end == p) { + idx += payload_struct[fld]; + } else if(*p == '#') { // value in Hexadecimal, end string + break; + } else { + ERR = 2; + strcpy(ERR_STR, "char: "); + uint8_t l = strlen(ERR_STR); + ERR_STR[l] = *p; + ERR_STR[l + 1] = '\0'; + FURI_LOG_D(TAG, "Wrong format char(%c)", *p); + return false; + } + if(end != p) { + payload[idx++] = b; + if(payload_struct[fld] > 1) payload[idx++] = b >> 8; + if(payload_struct[fld] > 2) payload[idx++] = b >> 16; + if(payload_struct[fld] > 3) payload[idx++] = b >> 24; + } + if(++fld == payload_fields || idx >= sizeof(payload) || end == NULL) break; + p = end + 1; + } while(1); + return true; +} + +// Cmd: "name=payload" +bool Run_Read_cmd(FuriString* cmd) { + char* p = (char*)furi_string_get_cstr(cmd); + p = strchr(p, '='); + if(p == NULL) return false; + if(Log == NULL) + Log = malloc(sizeof(Log)); + else + Log = realloc(Log, sizeof(Log) * (Log_Total + 1)); + if(Log == NULL) { + ERR = 3; + strcpy(ERR_STR, "Memory low"); + FURI_LOG_D(TAG, ERR_STR); + return false; + } + FuriString* fs = furi_string_alloc(); + furi_string_set_strn( + fs, (char*)furi_string_get_cstr(cmd), p - (char*)furi_string_get_cstr(cmd)); + furi_string_cat_str(fs, ": "); + bool hexval; + if((hexval = *(p + strlen(p) - 1) == '#')) + furi_string_cat_str(fs, "0x"); // value in Hex format + Log[Log_Total++] = fs; + p++; + memset(payload, 0, sizeof(payload)); + if(ReadDefault && !fill_payload((char*)furi_string_get_cstr(ReadDefault), NULL, VAR_EMPTY)) + return false; + if(!fill_payload(p, &cmd_array_idx, VAR_EMPTY)) return false; + memset(payload_receive, 0, sizeof(payload_receive)); + cmd_array = false; + if(*(p - 2) == ']' && cmd_array_idx != 255) { // array + p = strchr(furi_string_get_cstr(cmd), '['); + if(p) { + cmd_array_cnt = str_to_int(p + 1); + if(cmd_array_cnt > 1) { + cmd_array_hex = hexval; + cmd_array = true; // array + } + } + } + prepare_nrf24(); + if(NRF_ERROR) return false; + what_doing = 2; + NRF_repeat = 0; + send_status = sst_sending; // Read - sending + nrf24_send_packet(); + return true; +} + +// run commands one by one, true - command running +bool Run_ReadBatch_cmd(FuriString* cmd) { + char* p; + if(cmd) { + p = strchr((char*)furi_string_get_cstr(cmd), ':'); + if(p == NULL) { + ERR = 5; + strcpy(ERR_STR, "WRONG FORMAT"); + return false; + } + p += 2; + ReadBatch_cmd_curr = NULL; + free_Log(); + } else { + if(ReadBatch_cmd_curr) + p = ReadBatch_cmd_curr; + else + return false; + } + char* end = strchr(p, ';'); + uint8_t len; + if(end) + len = end - p; + else { + str_rtrim(p); + len = strlen(p); + } + for(uint16_t i = 0; i < Read_cmd_Total; i++) { + FuriString* fs = Read_cmd[i]; + if(strncmp((char*)furi_string_get_cstr(fs), p, len) == 0) { + char c = *((char*)furi_string_get_cstr(fs) + len); + if(c != '=' && c != '*' && c != '[') continue; + if(end) + ReadBatch_cmd_curr = end + 1; + else + ReadBatch_cmd_curr = (char*)0xFFFFFFFF; + if(!Run_Read_cmd(fs)) break; + return true; + } + } + if(NRF_ERROR) return false; + if(ERR == 0) { + ERR = 4; + strcpy(ERR_STR, "NOT FOUND"); + FuriString* fs = furi_string_alloc(); + furi_string_set_strn(fs, p, len); + Log[Log_Total++] = fs; + FURI_LOG_D(TAG, "CMD %s: %s", ERR_STR, p); + } + view_Batch = Log_Total ? Log_Total - 1 : 0; + return false; +} + +void Prepare_Write_cmd(FuriString* cmd) { + free_Log(); + if(cmd == NULL) return; + char *end, *p = strchr((char*)furi_string_get_cstr(cmd), ':'); + if(p == NULL) { + ERR = 8; + strcpy(ERR_STR, "Wrong batch"); + FURI_LOG_D(TAG, ERR_STR); + return; + } + p += 2; + Log = malloc(sizeof(Log)); + do { + end = strchr(p, ';'); + uint8_t len; + if(end) { + len = end - p; + end++; + } else { + str_rtrim(p); + len = strlen(p); + } + FuriString* fs = furi_string_alloc(); + if(Log_Total) Log = realloc(Log, sizeof(Log) * (Log_Total + 1)); + if(Log == NULL) { + ERR = 3; + strcpy(ERR_STR, "Memory low"); + FURI_LOG_D(TAG, ERR_STR); + return; + } + furi_string_set_strn(fs, p, len); + Log[Log_Total++] = fs; + } while((p = end)); +} + +// Write / Set batch +bool Run_WriteBatch_cmd() { + if(Log_Total == 0) return false; + uint16_t cmd_curr = rw_type == rwt_write_batch ? WriteBatch_cmd_curr : SetBatch_cmd_curr; + if(cmd_curr == 0) { // first + prepare_nrf24(); + if(NRF_ERROR) return false; + if(rw_type == rwt_write_batch && WriteStart) { + if(!fill_payload((char*)furi_string_get_cstr(WriteStart), NULL, VAR_EMPTY)) + return false; + send_status = sst_sending; + if(!nrf24_send_packet()) return false; + } + } + char* p = (char*)furi_string_get_cstr(Log[cmd_curr]); + uint16_t len = furi_string_size(Log[cmd_curr]); + char* arr = NULL; + cmd_array = false; + int32_t new = 0; + for(uint16_t i = 0; i < len; i++) { + if(p[i] == '=') { + len = i; + char* p2 = p + i + 1; + if(*p2 == '{') { + arr = ++p2; // array + cmd_array = true; + } + new = str_to_int(p2); + break; + } + } + FURI_LOG_D( + TAG, "%cBatch: =%d, (%d)%s", rw_type == rwt_write_batch ? 'W' : 'S', (int)new, len, p); + char *w, *delim_col, i, size; + FuriString* str = furi_string_alloc(); + stream_rewind(file_stream); + while(stream_read_line(file_stream, str)) { + w = (char*)furi_string_get_cstr(str); + if(strncmp(w, SettingsFld_Write, sizeof(SettingsFld_Write) - 1) == 0) + w += sizeof(SettingsFld_Write); + else if(strncmp(w, SettingsFld_Set, sizeof(SettingsFld_Set) - 1) == 0) + w += sizeof(SettingsFld_Set); + else + continue; + delim_col = strchr(w, '='); + if(delim_col == NULL) continue; + size = 1; + if(*(delim_col - 2) == '*') { + if(len != delim_col - w - 2) continue; + size = *(delim_col - 1) - '0'; + new = new&(size == 1 ? 0xFF : size == 2 ? 0xFFFF : size == 3 ? 0xFFFFFF : 0xFFFFFFFF); + } else if(len != delim_col - w) + continue; + if(strncmp(p, w, len) != 0) continue; + delim_col++; + str_rtrim(delim_col); + cmd_array_cnt = 255; + do { + memset(payload, 0, sizeof(payload)); + if(WriteDefault && + !fill_payload((char*)furi_string_get_cstr(WriteDefault), NULL, new)) { + view_Batch = cmd_curr; + return false; + } + if(!fill_payload(delim_col, &cmd_array_idx, VAR_EMPTY)) { + view_Batch = cmd_curr; + return false; + } + if(cmd_array && cmd_array_idx != 255) { + if(cmd_array_cnt != 255) payload[cmd_array_idx] = cmd_array_cnt; + } else + cmd_array = false; + send_status = sst_sending; + NRF_repeat = 0; + i = 0; + do { + if(nrf24_send_packet()) break; + furi_delay_ms(delay_between_pkt); + } while(i++ < NRF_resend); + if(i < NRF_resend || i == 0) { // ok + if(cmd_array) { // array + for(; arr != NULL;) { + if(*arr == ',') break; + if(*arr == '}' || *arr < ' ') + arr = NULL; + else + arr++; + } + if(arr == NULL) { + send_status = sst_ok; + break; + } + arr++; + new = str_to_int(arr); + cmd_array_cnt = payload[cmd_array_idx] + size; + //furi_delay_ms(delay_between_pkt); // do it fast + continue; // send next array element + } else + send_status = sst_ok; + } + break; + } while(1); + if(send_status != sst_ok) { + send_status = sst_error; + view_Batch = cmd_curr; + return false; + } + return true; + } + ERR = 7; + strcpy(ERR_STR, "NOT FOUND!"); + send_status = sst_error; + view_Batch = cmd_curr; + return false; +} + +// Return 0 - success, otherwise an error +static uint8_t load_settings_file() { + uint8_t err = 0; + FURI_LOG_D(TAG, "Loading settings file"); + FuriString* str = furi_string_alloc(); + free_store(); + Info[0] = '\0'; + NRF_INITED = false; + while(stream_read_line(file_stream, str)) { + char* p = (char*)furi_string_get_cstr(str); + if(*p <= '!' || *p == ';') continue; + //char* delim_eq = strchr(p, '='); + char* delim_col = strchr(p, ':'); + if(delim_col == NULL) { // Constant found - no ':' + if(Constants == NULL) { + Constants = furi_string_alloc_set(str); + } else + furi_string_cat(Constants, str); + } else { + str_rtrim(p); + if(strncmp(p, SettingsFld_Rate, sizeof(SettingsFld_Rate) - 1) == 0) { + NRF_rate = str_to_int(p + sizeof(SettingsFld_Rate)); + } else if(strncmp(p, SettingsFld_Info, sizeof(SettingsFld_Info) - 1) == 0) { + strncpy(Info, p + sizeof(SettingsFld_Info), sizeof(Info) - 1); + } else if(strncmp(p, SettingsFld_Ch, sizeof(SettingsFld_Ch) - 1) == 0) { + NRF_channel = str_to_int(p + sizeof(SettingsFld_Ch)); + } else if(strncmp(p, SettingsFld_Address, sizeof(SettingsFld_Address) - 1) == 0) { + p += sizeof(SettingsFld_Address); + addr_len = ConvertHexToArray(p, addr, 5); + } else if(strncmp(p, SettingsFld_CRC, sizeof(SettingsFld_CRC) - 1) == 0) { + NRF_CRC = str_to_int(p + sizeof(SettingsFld_CRC)); + } else if(strncmp(p, SettingsFld_DPL, sizeof(SettingsFld_DPL) - 1) == 0) { + NRF_DPL = str_to_int(p + sizeof(SettingsFld_DPL)); + } else if(strncmp(p, SettingsFld_RETR, sizeof(SettingsFld_RETR) - 1) == 0) { + NRF_RETR = str_to_int(p + sizeof(SettingsFld_RETR)); + } else if(strncmp(p, SettingsFld_Resend, sizeof(SettingsFld_Resend) - 1) == 0) { + 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_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; + payload_size = 0; + do { + uint8_t b = str_to_int(p); + if(b < 1 || b > 4) { + FURI_LOG_D(TAG, "Wrong payload format (%d)", b); + err = 3; + break; + } + payload_struct[payload_fields++] = b; + payload_size += b; + if(payload_fields == sizeof(payload_struct) - 1) break; + if((p = strchr(p, ',')) == NULL) break; + p++; + } while(1); + FURI_LOG_D( + TAG, + "Payload fields %d: %d,%d,%d", + payload_fields, + payload_struct[0], + payload_struct[1], + payload_struct[2]); + } else if(strncmp(p, SettingsFld_ReadDefault, sizeof(SettingsFld_ReadDefault) - 1) == 0) { + ReadDefault = furi_string_alloc_set_str(p + sizeof(SettingsFld_ReadDefault)); + } else if(strncmp(p, SettingsFld_WriteStart, sizeof(SettingsFld_WriteStart) - 1) == 0) { + WriteStart = furi_string_alloc_set_str(p + sizeof(SettingsFld_WriteStart)); + } else if(strncmp(p, SettingsFld_WriteDefault, sizeof(SettingsFld_WriteDefault) - 1) == 0) { + WriteDefault = furi_string_alloc_set_str(p + sizeof(SettingsFld_WriteDefault)); + } else if(strncmp(p, SettingsFld_Read, sizeof(SettingsFld_Read) - 1) == 0) { + p += sizeof(SettingsFld_Read); + if(Read_cmd == NULL) + Read_cmd = malloc(sizeof(Read_cmd)); + else { + Read_cmd = realloc(Read_cmd, sizeof(Read_cmd) * (Read_cmd_Total + 1)); + } + if(Read_cmd == NULL) { + FURI_LOG_D(TAG, "Memory low, err 4"); + err = 4; + break; + } + Read_cmd[Read_cmd_Total++] = furi_string_alloc_set_str(p); + } else if(strncmp(p, SettingsFld_ReadBatch, sizeof(SettingsFld_ReadBatch) - 1) == 0) { + p += sizeof(SettingsFld_ReadBatch); + if(ReadBatch_cmd == NULL) + ReadBatch_cmd = malloc(sizeof(ReadBatch_cmd)); + else { + ReadBatch_cmd = + realloc(ReadBatch_cmd, sizeof(ReadBatch_cmd) * (ReadBatch_cmd_Total + 1)); + } + if(ReadBatch_cmd == NULL) { + FURI_LOG_D(TAG, "Memory low, err 5"); + err = 5; + break; + } + ReadBatch_cmd[ReadBatch_cmd_Total++] = furi_string_alloc_set_str(p); + } else if(strncmp(p, SettingsFld_WriteBatch, sizeof(SettingsFld_WriteBatch) - 1) == 0) { + p += sizeof(SettingsFld_WriteBatch); + if(WriteBatch_cmd == NULL) + WriteBatch_cmd = malloc(sizeof(WriteBatch_cmd)); + else { + WriteBatch_cmd = realloc( + WriteBatch_cmd, sizeof(WriteBatch_cmd) * (WriteBatch_cmd_Total + 1)); + } + if(WriteBatch_cmd == NULL) { + FURI_LOG_D(TAG, "Memory low, err 6"); + err = 6; + break; + } + WriteBatch_cmd[WriteBatch_cmd_Total++] = furi_string_alloc_set_str(p); + } else if(strncmp(p, SettingsFld_SetBatch, sizeof(SettingsFld_SetBatch) - 1) == 0) { + p += sizeof(SettingsFld_SetBatch); + if(SetBatch_cmd == NULL) + SetBatch_cmd = malloc(sizeof(SetBatch_cmd)); + else { + SetBatch_cmd = + realloc(SetBatch_cmd, sizeof(SetBatch_cmd) * (SetBatch_cmd_Total + 1)); + } + if(SetBatch_cmd == NULL) { + FURI_LOG_D(TAG, "Memory low, err 7"); + err = 7; + break; + } + SetBatch_cmd[SetBatch_cmd_Total++] = furi_string_alloc_set_str(p); + } else if(strncmp(p, SettingsFld_Listen, sizeof(SettingsFld_Listen) - 1) == 0) { + p += sizeof(SettingsFld_Listen); + char* p2 = strchr(p, '='); + if(p2) { + listen_addr_len = ConvertHexToArray(p, listen_addr, (p2 - p) / 2); + p2++; + uint8_t len = strlen(p2); + ListenFields = malloc(len + 1); + if(ListenFields) memcpy(ListenFields, p2, len); + } + } + } + } + furi_string_free(str); + return err; +} + +static void save_batch(void) { + FURI_LOG_D(TAG, "Save Batch"); + char *p, *p2; + stream_seek(file_stream, 0, StreamOffsetFromEnd); + FuriHalRtcDateTime dt; + furi_hal_rtc_get_datetime(&dt); + stream_write_format(file_stream, "\n%s ", SettingsFld_WriteBatch); + p = (char*)furi_string_get_cstr(ReadBatch_cmd[view_cmd[rwt_read_batch]]); + p2 = strchr(p, ':'); + if(p2 == NULL) p2 = p + strlen(p); + stream_write(file_stream, (uint8_t*)p, p2 - p); + stream_write_format( + file_stream, + " %02d.%02d.%02d %02d.%02d: ", + dt.day, + dt.month, + dt.year % 100, + dt.hour, + dt.minute); + for(uint16_t i = 0; i < Log_Total; i++) { + p = (char*)furi_string_get_cstr(Log[i]); + p2 = strchr(p, ':'); + if(p2 && *(p2 - 1) != '*') { // skip string + if(*(p2 - 1) == ']') { // array + char* p3 = strchr(p, '['); + if(p3) { + stream_write(file_stream, (uint8_t*)p, p3 - p - (*(p3 - 2) == '*' ? 2 : 0)); + stream_write_cstring(file_stream, "={"); + p = (p2 += 2); + do { + while(is_digit(p2, true) || *p2 == 'x') p2++; + stream_write(file_stream, (uint8_t*)p, p2 - p); + char c = *p2; + if(c == '\0') break; + if(c != ',') { + p2 = strchr(p2, ','); + if(p2 == NULL) break; + } + stream_write_char(file_stream, ','); + p = ++p2; + } while(1); + stream_write_char(file_stream, '}'); + } + } else { + stream_write(file_stream, (uint8_t*)p, p2 - p - (*(p2 - 2) == '*' ? 2 : 0)); + stream_write_char(file_stream, '='); + p2 += 2; + p = strchr(p2, ' '); + if(p == NULL) p = p2 + strlen(p2); + stream_write(file_stream, (uint8_t*)p2, p - p2); + } + if(i < Log_Total - 1) stream_write_char(file_stream, ';'); + } + } +} + +static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) { + furi_assert(event_queue); + PluginEvent event = {.type = EventTypeKey, .input = *input_event}; + furi_message_queue_put(event_queue, &event, FuriWaitForever); +} + +void display_remove_asterisk(char* fsp, uint8_t vx) { + char* p2 = strchr(fsp, '*'); + if(p2) { // remove '*' or '*n' + int pos = p2 - fsp; + if((pos -= vx) < 0) pos = 0; + char c = *(p2 + 1); + if(*(screen_buf + pos)) + memmove( + screen_buf + pos, + screen_buf + pos + (c == ':' || c == '=' ? 1 : 2), + FONT_5x7_SCREEN_WIDTH + 1 + 2 - pos); + } +} + +void render_display_list( + Canvas* const canvas, + FuriString*** fsa, + char delim, + uint16_t view_pos, + uint16_t max_i) { + uint16_t page = view_pos & ~7; + char *p, *end; + uint16_t y, len; + for(uint8_t i = 0; i < 8 && page + i < max_i; i++) { + y = 14 + i * 7; + p = (char*)furi_string_get_cstr((*fsa)[page + i]); + end = strchr(p, delim); + if(end) { + len = MIN(end - p, view_x); + len = MIN(end - p - len, FONT_5x7_SCREEN_WIDTH); + strncpy(screen_buf, p + view_x, len); + screen_buf[len] = '\0'; + display_remove_asterisk(p, MIN(end - p, view_x)); + canvas_draw_str(canvas, 5, y, screen_buf); + } + if((view_pos & 7) == i) { + canvas_draw_str(canvas, 0, y, ">"); + canvas_draw_str(canvas, -1, y, ">"); + } + } +} + +void display_edit_ttf_font(Canvas* const canvas, uint8_t start_x, uint8_t start_y) { + screen_buf[0] = *Edit_pos; + screen_buf[1] = '\0'; + int n = canvas_string_width(canvas, screen_buf); + int len = Edit_pos - Edit_start; + memcpy(screen_buf, Edit_start, len); + screen_buf[len] = '\0'; + int x = start_x + canvas_string_width(canvas, screen_buf); + int len2 = strlen(Edit_pos); + memcpy(screen_buf + len, Edit_pos, len2); + screen_buf[len + len2] = '\0'; + canvas_draw_str(canvas, start_x, start_y, screen_buf); + start_y += 1; + canvas_draw_line( + canvas, x + (len ? 1 : 0), start_y, x + n + (*Edit_pos == '1' && len ? 1 : 0), start_y); +} + +void display_add_status(void) { + if(NRF_ERROR) + strcat(screen_buf, "nRF24 ERROR!"); + else if(ERR) + snprintf(screen_buf, sizeof(screen_buf), "ERROR %s", ERR_STR); + else if(send_status == sst_error) + strcat(screen_buf, "NO ACK!"); + else if(send_status == sst_timeout) + strcat(screen_buf, "TIMEOUT!"); + else if(send_status == sst_none) + ; + else if(send_status == sst_sending) + strcat(screen_buf, "sending"); + else if(send_status == sst_receiving) + strcat(screen_buf, "receiving"); + else if( + send_status == sst_ok && + (rw_type == rwt_read_cmd || + (rw_type == rwt_read_batch && (uint32_t)ReadBatch_cmd_curr == 0xFFFFFFFF) || + (rw_type == rwt_set_batch && SetBatch_cmd_curr == Log_Total) || + (rw_type == rwt_write_batch && WriteBatch_cmd_curr == Log_Total))) + strcat(screen_buf, "OK"); + else + strcat(screen_buf, "working"); +} + +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, 5) != FuriStatusOk) return; + + //canvas_draw_frame(canvas, 0, 0, 128, 64); // border around the edge of the screen + if(what_doing == 0) { + canvas_set_font(canvas, FontSecondary); // 8x10 font, 6 lines + snprintf(screen_buf, sizeof(screen_buf), "%s: %s", addr_len ? "File" : "Open", file_name); + canvas_draw_str(canvas, 8, 10, screen_buf); + if(addr_len) { + if(Edit) { + if(setup_cursor == 1) + display_edit_ttf_font(canvas, 45, 20); + else if(setup_cursor == 2) + display_edit_ttf_font(canvas, 55, 30); + } + if(!Edit || setup_cursor != 1) { + screen_buf[0] = '\0'; + add_to_str_hex_bytes(screen_buf, addr, addr_len); + canvas_draw_str(canvas, 45, 20, screen_buf); + } + if(!Edit || setup_cursor != 2) { + snprintf(screen_buf, sizeof(screen_buf), "%d", NRF_channel); + canvas_draw_str(canvas, 55, 30, screen_buf); + } + canvas_draw_str(canvas, 8, 20, "Address:"); + snprintf(screen_buf, sizeof(screen_buf), "Rate: %d, Ch:", NRF_rate); + canvas_draw_str(canvas, 8, 30, screen_buf); + snprintf( + screen_buf, + sizeof(screen_buf), + "RB: %d, R: %d, WB: %d", + ReadBatch_cmd_Total, + Read_cmd_Total, + WriteBatch_cmd_Total); + canvas_draw_str(canvas, 8, 40, screen_buf); + canvas_draw_str(canvas, 0, 64, Info); + canvas_draw_str(canvas, 0, 10 + setup_cursor * 10, ">"); + } else { + snprintf(screen_buf, sizeof(screen_buf), "Ver. %s, vad7", VERSION); + canvas_draw_str(canvas, 10, 60, screen_buf); + canvas_draw_str(canvas, 0, 10, ">"); + } + } else if(what_doing == 1) { + if(rw_type == rwt_listen) { + canvas_set_font(canvas, FontSecondary); // 8x10 font, 6 lines + canvas_draw_str(canvas, 0, 10, "Listen mode"); + canvas_draw_str(canvas, 0, 25, "Address:"); + if(Edit) + display_edit_ttf_font(canvas, 40, 25); + else if(listen_addr_len) { + screen_buf[0] = '\0'; + add_to_str_hex_bytes(screen_buf, listen_addr, listen_addr_len); + canvas_draw_str(canvas, 40, 25, screen_buf); + } + snprintf( + screen_buf, + sizeof(screen_buf), + "I: %d +(%d) mA", + Current - CurrentStart, + CurrentStart); + canvas_draw_str(canvas, 0, 60, screen_buf); + } else { + canvas_set_font(canvas, FontBatteryPercent); // 5x7 font, 9 lines, 25 cols + if(rw_type == rwt_read_batch) { + canvas_draw_str(canvas, 0, 7, "Read Batch:"); + render_display_list( + canvas, &ReadBatch_cmd, ':', view_cmd[rw_type], ReadBatch_cmd_Total); + } else if(rw_type == rwt_read_cmd) { + canvas_draw_str(canvas, 0, 7, "Read Command:"); + render_display_list(canvas, &Read_cmd, '=', view_cmd[rw_type], Read_cmd_Total); + } else if(rw_type == rwt_write_batch) { + if(!ask_fill_screen_buf()) strcpy(screen_buf, "Write Batch:"); + canvas_draw_str(canvas, 0, 7, screen_buf); + render_display_list( + canvas, &WriteBatch_cmd, ':', view_cmd[rw_type], WriteBatch_cmd_Total); + } else if(rw_type == rwt_set_batch) { + strcpy(screen_buf, "Set: "); + display_add_status(); + canvas_draw_str(canvas, 0, 7, screen_buf); + render_display_list( + canvas, &SetBatch_cmd, ':', view_cmd[rw_type], SetBatch_cmd_Total); + } + } + } else { // what_doing == 2 + if(rw_type == rwt_listen) { + canvas_set_font(canvas, FontSecondary); // 8x10 font, 6 lines + strcpy(screen_buf, "Listen: "); + if(NRF_ERROR) + strcat(screen_buf, "nRF24 ERROR!"); + else if(ListenNew) { + snprintf( + screen_buf + strlen(screen_buf), + 16, + "%02d:%02d:%02d", + ListenLastTime.hour, + ListenLastTime.minute, + ListenLastTime.second); + if(ListenPrev) + snprintf( + screen_buf + strlen(screen_buf), 16, " (%lu)", ListenLast - ListenPrev); + } else + strcat(screen_buf, "receiving"); + snprintf(screen_buf + strlen(screen_buf), 16, " %dmA", Current - CurrentStart); + canvas_draw_str(canvas, 0, 10, screen_buf); + if(ListenFields) { + char *p2, *p = ListenFields; + uint8_t hex, len, *pld = payload_receive; + for(uint8_t i = 0; i < 5 && *p; i++) { + hex = false; + p2 = strchr(p, ','); + if(p2 == NULL) p2 = p + strlen(p); + if(*(p2 - 1) == '#') hex = true; + memcpy(screen_buf, p, len = p2 - p); + strcpy(screen_buf + len, ": "); + if(ListenNew) { + len = payload_struct[i]; + int32_t n = get_payload_receive_field(pld, len); + if(hex) { + strcat(screen_buf, "0x"); + add_to_str_hex_variable(screen_buf, pld, len); + } else { + snprintf(screen_buf + strlen(screen_buf), 20, "%ld", n); + if(n > 9) { + strcat(screen_buf, " ("); + add_to_str_hex_variable(screen_buf, pld, len); + strcat(screen_buf, ")"); + } + } + pld += len; + } + canvas_draw_str(canvas, 0, 20 + i * 10, screen_buf); + if(*p2 == '\0') break; + p = p2 + 1; + } + } + } else if(rw_type == rwt_read_cmd) { // Read command + canvas_set_font(canvas, FontSecondary); // 8x10 font, 6 lines + if(!ask_fill_screen_buf()) { + strcpy(screen_buf, "Read "); + strcat(screen_buf, ReadRepeat ? "rep: " : "cmd: "); + } + display_add_status(); + canvas_draw_str(canvas, 0, 10, screen_buf); + if(Log_Total) { + char* p = (char*)furi_string_get_cstr(Log[Log_Total - 1]); + uint8_t vx = MIN(view_x, strlen(p)); + strncpy(screen_buf, p + vx, 30); + display_remove_asterisk(p, vx); + canvas_draw_str(canvas, 0, 15 + 10, screen_buf); + } + } else if(rw_type == rwt_set_batch) { + canvas_set_font(canvas, FontBatteryPercent); // 5x7 font, 9 lines, 25 cols + strcpy(screen_buf, "Set: "); + display_add_status(); + canvas_draw_str(canvas, 0, 7, screen_buf); + render_display_list(canvas, &SetBatch_cmd, ':', view_cmd[rw_type], SetBatch_cmd_Total); + } else { // rwt_read_batch, rwt_write_batch + canvas_set_font(canvas, FontBatteryPercent); // 5x7 font, 9 lines, 25 cols + if(!ask_fill_screen_buf()) { + strcpy(screen_buf, rw_type == rwt_read_batch ? "Read Batch: " : "Write: "); + if(rw_type == rwt_read_batch || send_status != sst_none) { + display_add_status(); + } else if(rw_type == rwt_write_batch) { + char* p = + (char*)furi_string_get_cstr(WriteBatch_cmd[view_cmd[rwt_write_batch]]); + char* end = strchr(p, ':'); + if(end) { + uint8_t len = end - p; + uint8_t lenb = strlen(screen_buf); + end = screen_buf + lenb; + lenb = FONT_5x7_SCREEN_WIDTH - lenb; + if(len > lenb) { + if(view_x < len) { + strncpy(end, p + view_x, len = MIN(lenb, len - view_x)); + end[len] = '\0'; + } + } else { + strncpy(end, p, len); + end[len] = '\0'; + } + } + } + } + canvas_draw_str(canvas, 0, 7, screen_buf); + if(Log_Total) { + char* p; + uint16_t y, page = view_Batch & ~7; + uint8_t vx; + for(uint8_t i = 0; i < 8 && page + i < Log_Total; i++) { + p = (char*)furi_string_get_cstr(Log[page + i]); + y = 14 + i * 7; + vx = MIN(view_x, strlen(p)); + if((view_Batch & 7) == i) { + canvas_draw_str(canvas, 0, y, ">"); + canvas_draw_str(canvas, -1, y, ">"); + if(Edit) { + int n = Edit_pos - p - vx - (FONT_5x7_SCREEN_WIDTH - 4); + if(n > 0) vx += n; // fix out of screen + int x = 6 + (Edit_pos - p - vx) * 5; + canvas_draw_line(canvas, x - 1, y, x - 1, y - 1); + canvas_draw_line(canvas, x - 1, y, n = x + 1 * 5, y); + canvas_draw_line(canvas, n, y, n, y - 1); + } + } + strncpy(screen_buf, p + vx, FONT_5x7_SCREEN_WIDTH + 2); + screen_buf[FONT_5x7_SCREEN_WIDTH + 2] = '\0'; + display_remove_asterisk(p, vx); + canvas_draw_str(canvas, 6, y, screen_buf); + } + } + } + } + furi_mutex_release(plugin_state->mutex); +} + +void work_timer_callback(void* ctx) { + if(ctx == NULL) return; + if(rw_type == rwt_listen && (pwr_read_timer += WORK_PERIOD) >= POWER_READ_PERIOD) { + pwr_read_timer = 0; + update_power(); + } + if(what_doing == 2) { + const PluginState* plugin_state = ctx; + if(furi_mutex_acquire(plugin_state->mutex, 0) != FuriStatusOk) return; + if(rw_type == rwt_write_batch || rw_type == rwt_set_batch) { + uint16_t* cmd_curr = rw_type == rwt_set_batch ? &SetBatch_cmd_curr : + &WriteBatch_cmd_curr; + if(ERR == 0 && furi_get_tick() - NRF_time >= delay_between_pkt) { + if(send_status == sst_ok) { + if(ERR == 0 && *cmd_curr < Log_Total) { + if(++(*cmd_curr) < Log_Total) + Run_WriteBatch_cmd(); + else { // finished ok + if(rw_type == rwt_set_batch) what_doing = 1; + Edited = false; + } + } + } else if(send_status == sst_sending) { + if(NRF_repeat++ < NRF_resend) + nrf24_send_packet(); + else { + view_Batch = *cmd_curr; + send_status = sst_error; // error NO_ACK + } + } + } + if((ERR || send_status == sst_error) && rw_type == rwt_set_batch) { + what_doing = 1; + } + // ReadBatch or ReadCmd + } else if(send_status == sst_sending) { // sending + if(furi_get_tick() - NRF_time > delay_between_pkt) { + if(NRF_repeat++ < NRF_resend) { + nrf24_resend_read_packet(); + } else + send_status = sst_error; // error NO_ACK + } + } else if(send_status == sst_receiving) { // receiving + for(uint8_t i = 0; i < 3; i++) { + if(nrf24_read_newpacket()) { + if(rw_type == rwt_listen) { + ListenPrev = ListenLast; + furi_hal_rtc_get_datetime(&ListenLastTime); + ListenLast = furi_hal_rtc_datetime_to_timestamp(&ListenLastTime); + ListenNew = true; + } else if(send_status != sst_receiving) + break; + } else { + if(rw_type != rwt_listen && furi_get_tick() - NRF_time > NRF_READ_TIMEOUT) { + if(NRF_repeat++ < NRF_resend) { + send_status = sst_sending; + nrf24_resend_read_packet(); + } else { + FURI_LOG_D(TAG, "TIMEOUT: %lu", furi_get_tick() - NRF_time); + send_status = sst_timeout; + } + } + break; + } + } + } else if(send_status == sst_ok) { + if(rw_type == rwt_read_batch) { + if((uint32_t)ReadBatch_cmd_curr != 0xFFFFFFFF && ERR == 0 && + furi_get_tick() - NRF_time >= delay_between_pkt) { + Run_ReadBatch_cmd(NULL); + } + } + } + furi_mutex_release(plugin_state->mutex); + } +} + +void next_rw_type(int8_t add) { + do { + rw_type += add; + if(rw_type >= rwt_max) { + if(add > 0) + rw_type = 0; + else + rw_type = rwt_max - 1; + } + if(rw_type == rwt_set_batch && SetBatch_cmd_Total) break; + if(rw_type == rwt_read_batch && ReadBatch_cmd_Total) break; + if(rw_type == rwt_read_cmd && Read_cmd_Total) break; + if(rw_type == rwt_write_batch && WriteBatch_cmd_Total) break; + } while(rw_type != rwt_listen); + send_status = sst_none; +} + +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); + if((view_cmd[rw_type] += add) >= max) view_cmd[rw_type] = add > 0 ? 0 : max - 1; +} + +int32_t nrf24batch_app(void* p) { + UNUSED(p); + APP = malloc(sizeof(nRF24Batch)); + FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent)); + APP->plugin_state = malloc(sizeof(PluginState)); + APP->plugin_state->mutex = furi_mutex_alloc(FuriMutexTypeNormal); + if(!APP->plugin_state->mutex) { + furi_message_queue_free(event_queue); + FURI_LOG_E(TAG, "cannot create mutex"); + free(APP->plugin_state); + return 255; + } + // Set system callbacks + ViewPort* view_port = view_port_alloc(); + view_port_draw_callback_set(view_port, render_callback, APP->plugin_state); + view_port_input_callback_set(view_port, input_callback, event_queue); + + // Open GUI and register view_port + APP->gui = furi_record_open(RECORD_GUI); + gui_add_view_port(APP->gui, view_port, GuiLayerFullscreen); + APP->notification = furi_record_open(RECORD_NOTIFICATION); + APP->storage = furi_record_open(RECORD_STORAGE); + storage_common_mkdir(APP->storage, SCAN_APP_PATH_FOLDER); + file_stream = file_stream_alloc(APP->storage); + FuriTimer* work_timer = + furi_timer_alloc(work_timer_callback, FuriTimerTypePeriodic, APP->plugin_state); + furi_timer_start(work_timer, WORK_PERIOD); + nrf24_init(); + check_en_power_5V(); + + PluginEvent event; + for(bool processing = true; processing;) { + FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); + furi_mutex_acquire(APP->plugin_state->mutex, FuriWaitForever); + + static FuriLogLevel FuriLogLevel = FuriLogLevelDefault; + if(furi_log_get_level() != FuriLogLevel) { + 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)(ReadCmdRepeatPeriod * 1000)) { + ERR = 0; + free_Log(); + Run_Read_cmd(Read_cmd[view_cmd[rwt_read_cmd]]); + notification_message(APP->notification, &sequence_blink_blue_100); + } + + if(event_status == FuriStatusOk) { + // press events + if(event.type == EventTypeKey) { + switch(event.input.key) { + case InputKeyUp: + if(event.input.type == InputTypeShort || event.input.type == InputTypeRepeat) { + if(!ask_question) { + if(Edit) { + char c = *Edit_pos; + if(Edit_hex) { + if(c == '9') + *Edit_pos = 'A'; + else if(c < 'F' || c < '9') + *Edit_pos = c + 1; + } else { + if(c == '-') + *Edit_pos = '0'; + else if(c < '9') + *Edit_pos = c + 1; + else { + c = *(Edit_pos - 1); + if(Edit_pos > Edit_start && c < '9' && c >= '0') { + *Edit_pos = '0'; + (*(Edit_pos - 1)) = c + 1; + } + } + } + } else if(what_doing == 0) { + if(addr_len) { + if(setup_cursor > 0) + setup_cursor--; + else + setup_cursor = 2; + } + } else if(what_doing == 1) + next_view_cmd(-1); + else if(what_doing == 2) + if(view_Batch) view_Batch--; + } + } + break; + case InputKeyDown: + if(event.input.type == InputTypeShort || event.input.type == InputTypeRepeat) { + if(!ask_question) { + if(Edit) { + if(*Edit_pos != '-') { + if(Edit_hex && *Edit_pos == 'A') + (*Edit_pos) = '9'; + else if(*Edit_pos > '0') + (*Edit_pos)--; + else if(!Edit_hex) { + if(Edit_pos > Edit_start) { + if(*(Edit_pos - 1) > '0' && *(Edit_pos - 1) <= '9') { + *Edit_pos = '9'; + (*(Edit_pos - 1))--; + } + } else + Edit_insert_digit('-'); // negative + } + } + } else if(what_doing == 0) { + if(addr_len) { + if(setup_cursor < 2) + setup_cursor++; + else + setup_cursor = 0; + } + } else if(what_doing == 1) + next_view_cmd(+1); + else if(what_doing == 2) + if(view_Batch < Log_Total - 1) view_Batch++; + } + } + break; + case InputKeyLeft: + if(event.input.type == InputTypeShort || event.input.type == InputTypeRepeat) { + if(ask_question) { + if(event.input.type == InputTypeShort) ask_question_answer ^= 1; + } else if(Edit) { + if(Edit_pos > Edit_start) { + if(is_digit(Edit_pos - 1, Edit_hex)) + Edit_pos--; + else if(*(Edit_pos - 1) == 'x' && *(Edit_pos - 3) == ',') + Edit_pos -= 4; + else if(*(Edit_pos - 1) == ',') + Edit_pos -= 2; + } + } else if(what_doing == 0) { + 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--; + } else if(event.input.type == InputTypeLong) { + if(!ask_question && view_x == 0 && what_doing == 2 && + (rw_type == rwt_write_batch || rw_type == rwt_read_batch) && + Log_Total && Log[view_Batch] != NULL) { + ask_question = ask_skip_cmd; + ask_question_answer = 1; + } + } + break; + case InputKeyRight: + if(event.input.type == InputTypeShort || event.input.type == InputTypeRepeat) { + if(ask_question) { + ask_question_answer ^= 1; + } else if(Edit) { + if(is_digit(Edit_pos + 1, Edit_hex)) + Edit_pos++; + else if(*(Edit_pos + 1) == ',') { + Edit_pos += 2; + if(*(Edit_pos + 1) == 'x') Edit_pos += 2; + } + } else if(what_doing == 0) { + 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++; + } + break; + case InputKeyOk: + if(event.input.type == InputTypeShort) { + if(ask_question) { + if(ask_question_answer) { + if(ask_question == ask_save_batch) { + save_batch(); + } else if(ask_question == ask_write_batch) { + if(WriteBatch_cmd_Total) { + if(what_doing == 1) { + Prepare_Write_cmd( + WriteBatch_cmd[view_cmd[rwt_write_batch]]); + send_status = sst_none; + Edited = false; + view_x = 0; + view_Batch = 0; + } + if(Log_Total) { + ERR = 0; + WriteBatch_cmd_curr = 0; + Run_WriteBatch_cmd(); + what_doing = 2; + } + } + } else if(ask_question == ask_skip_cmd) { + if(rw_type == rwt_write_batch || rw_type == rwt_read_batch) { + furi_string_free(Log[view_Batch]); + if(view_Batch < Log_Total - 1) + memmove( + &Log[view_Batch], + &Log[view_Batch + 1], + sizeof(Log) * (Log_Total - view_Batch - 1)); + else + view_Batch--; + Log_Total--; + } + } else if(ask_question == ask_exit) { + processing = false; + } else if(ask_question == ask_return) { + if(what_doing == 2) { + ERR = 0; + send_status = sst_none; + Edited = false; + what_doing--; + } + } + } + ask_question = 0; + } else if(Edit) { // insert digit + Edit_insert_digit('0'); + } else if(what_doing == 0) { + if(setup_cursor == 0) { // open file + file_stream_close(file_stream); + if(select_settings_file()) { + uint8_t err = load_settings_file(); + if(err) + snprintf( + file_name, sizeof(file_name), "LOAD ERROR #%d", err); + } + } else if(setup_cursor == 1) { // change address + char* ebuf = (char*)payload; + ebuf[0] = '\0'; + add_to_str_hex_bytes(ebuf, addr, addr_len); + Edit_hex = true; + Edit_pos = ebuf + strlen(ebuf) - 1; + Edit_start = ebuf; + Edit = 1; + NRF_INITED = 0; + } else if(setup_cursor == 2) { // change channel + char* ebuf = (char*)payload; + snprintf(ebuf, sizeof(payload), "%d", NRF_channel); + Edit_hex = false; + Edit_pos = ebuf + strlen(ebuf) - 1; + Edit_start = ebuf; + Edit = 1; + NRF_INITED = 0; + } + } else if(what_doing == 1) { + if(rw_type == rwt_set_batch) { + if(SetBatch_cmd_Total) { + ERR = 0; + send_status = sst_none; + Prepare_Write_cmd(SetBatch_cmd[view_cmd[rwt_set_batch]]); + if(!ERR) { + SetBatch_cmd_curr = 0; + Run_WriteBatch_cmd(); + what_doing = 2; + } + Edited = false; + } + } else if(rw_type == rwt_read_batch) { + if(ReadBatch_cmd_Total) { + ERR = 0; + Run_ReadBatch_cmd(ReadBatch_cmd[view_cmd[rwt_read_batch]]); + view_x = 0; + view_Batch = 0; + what_doing = 2; + } + } else if(rw_type == rwt_read_cmd) { + if(Read_cmd_Total) { + ERR = 0; + free_Log(); + Run_Read_cmd(Read_cmd[view_cmd[rwt_read_cmd]]); + view_x = 0; + what_doing = 2; + } + } else if(rw_type == rwt_write_batch) { + if(WriteBatch_cmd_Total) { + ERR = 0; + Prepare_Write_cmd(WriteBatch_cmd[view_cmd[rwt_write_batch]]); + send_status = sst_none; + Edited = false; + view_x = 0; + view_Batch = 0; + what_doing = 2; + } + } else if(rw_type == rwt_listen) { + if(listen_addr_len) { + free_Log(); + prepare_nrf24(); + if(!NRF_ERROR) { + nrf24_set_rx_mode(nrf24_HANDLE); + ListenNew = false; + send_status = sst_receiving; // receiving + } + what_doing = 2; + } + } + } else if(what_doing == 2) { + if(rw_type == rwt_read_cmd) { + ERR = 0; + free_Log(); + Run_Read_cmd(Read_cmd[view_cmd[rwt_read_cmd]]); + } else if(Log_Total) { + if(rw_type == rwt_read_batch) { + ask_question = ask_save_batch; + ask_question_answer = 0; + } else if(rw_type == rwt_write_batch) { + ask_question = ask_write_batch; + ask_question_answer = 0; + } + } + } + } else if(event.input.type == InputTypeLong) { + if(Edit) { // delete + if(what_doing <= 1) { + if(strlen(Edit_start) > 1) { + memmove(Edit_pos, Edit_pos + 1, strlen(Edit_pos)); + if(*Edit_pos == '\0') Edit_pos--; + } + } else { + FuriString* fs = Log[view_Batch]; + if(is_digit(Edit_pos + 1, Edit_hex) || + (Edit_pos > Edit_start && is_digit(Edit_pos - 1, Edit_hex))) { + memmove(Edit_pos, Edit_pos + 1, strlen(Edit_pos)); + if(*Edit_pos == '\0') Edit_pos--; + furi_string_left(fs, furi_string_size(fs) - 1); + } + } + } else if(what_doing == 1) { + if(rw_type == rwt_listen) { + if(listen_addr_len) { + char* ebuf = (char*)payload; + ebuf[0] = '\0'; + add_to_str_hex_bytes(ebuf, listen_addr, listen_addr_len); + Edit_hex = true; + Edit_pos = ebuf + strlen(ebuf) - 1; + Edit_start = ebuf; + Edit = 1; + NRF_INITED = 0; + } + } else if(rw_type == rwt_read_batch) { + if(ReadBatch_cmd_Total) { + ERR = 0; + Run_ReadBatch_cmd(ReadBatch_cmd[view_cmd[rwt_read_batch]]); + view_x = 0; + view_Batch = 0; + what_doing = 2; + } + } else if(rw_type == rwt_write_batch) { + ask_question = ask_write_batch; + ask_question_answer = 0; + } + } else if(what_doing == 2) { + if(rw_type == rwt_read_cmd) { + ReadRepeat = !ReadRepeat; + } else if(Log_Total) { + if(rw_type == rwt_write_batch) { + if(!Edit) { + Edit = 0; + Edit_hex = 0; + char* s = (char*)furi_string_get_cstr(Log[view_Batch]); + char* p = strchr(s, '='); + if(p) { + p++; + if(*p == '{') p++; // array + if(*(p + 1) == 'x') { + p += 2; + Edit_hex = 1; // hex + } + if(is_digit(p, Edit_hex)) { + Edit_start = p; + while(is_digit(p, Edit_hex)) p++; + Edit_pos = p - 1; + Edited = true; + Edit = 1; + } + } + } + } else if(rw_type == rwt_read_batch) { + ask_question = ask_save_batch; + ask_question_answer = 0; + } + } + } + } + break; + case InputKeyBack: + if(event.input.type == InputTypeLong) { + if(what_doing == 2 && Edited) { + if(!ask_question) ask_question_answer = 1; + ask_question = ask_exit; + } else + processing = false; + } else if(event.input.type == InputTypeShort) { + if(ask_question) + ask_question = 0; + else if(Edit) { + if(what_doing == 0) { + if(setup_cursor == 1) { + addr_len = ConvertHexToArray((char*)payload, addr, 5); + } else if(setup_cursor == 2) { + NRF_channel = str_to_int((char*)payload); + if(NRF_channel > MAX_CHANNEL) NRF_channel = MAX_CHANNEL; + } + } else if(what_doing == 1 && rw_type == rwt_listen) { + listen_addr_len = + ConvertHexToArray((char*)payload, listen_addr, 5); + } + Edit = 0; + } else { + if(what_doing == 2 && Edited) { + ask_question = ask_return; + ask_question_answer = 1; + } else if(what_doing != 0) { + if(what_doing) what_doing--; + if(what_doing == 0) rw_type = rwt_read_batch; + if(what_doing <= 1) view_x = 0; + ERR = 0; + send_status = sst_none; + } + } + } + break; + default: + break; + } + } + } + + view_port_update(view_port); + furi_mutex_release(APP->plugin_state->mutex); + } + nrf24_set_idle(nrf24_HANDLE); + nrf24_deinit(); + if(NRF_BOARD_POWER_5V) furi_hal_power_disable_otg(); + + view_port_enabled_set(view_port, false); + gui_remove_view_port(APP->gui, view_port); + furi_record_close(RECORD_GUI); + furi_record_close(RECORD_NOTIFICATION); + furi_record_close(RECORD_STORAGE); + if(file_stream) { + file_stream_close(file_stream); + stream_free(file_stream); + } + view_port_free(view_port); + furi_message_queue_free(event_queue); + free_store(); + furi_timer_stop(work_timer); + furi_timer_free(work_timer); + furi_mutex_free(APP->plugin_state->mutex); + free(APP->plugin_state); + free(APP); + return 0; +} diff --git a/nrf24batch.h b/nrf24batch.h new file mode 100644 index 00000000000..02db0a40240 --- /dev/null +++ b/nrf24batch.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef enum { + EventTypeTick, + EventTypeKey, +} EventType; + +typedef struct { + EventType type; + InputEvent input; +} PluginEvent; + +typedef struct { + FuriMutex* mutex; +} PluginState; + +typedef struct { + Gui* gui; + Storage* storage; + NotificationApp* notification; + PluginState* plugin_state; +} nRF24Batch; diff --git a/nrf24batch_10px.png b/nrf24batch_10px.png new file mode 100644 index 0000000000000000000000000000000000000000..348b35eca7599d1c72a7b1efea9fd7f263e4606f GIT binary patch literal 1771 zcmcIlO>f*p7x-sRO- zS0zchJlO8D=?T@&96%@6B`l63J-Ivmxb=!1apOvRMP zOl`6P(2{h0y(uu+XSE!&ahiw9U%&jS$SDn#+fJlM#U`7i+s7rlb-Xhq$NR*m%K8oY zdJ_Oa#%e4#*)*?$CRFCU0gT0CO_Ar2dOuV)L_v8J?aG_HWU{B4i0Ha5d%kMKu7f@Q z9of`PQ`23|u#n*ewi_6>+%ZF;gS$|f)O8VP+H5vcXO_y#v1a(buj!^{ zng|f6I?8L@puAe^82YRtWm?oJ&t<`gV}4MF3P@e7AuE=&dDZ#^j%f`pG(*+JnmS+< zoej;hCAzA&4xvh`_p!v)@Tg$g9;^64N!ZpQ%j>nSSTW%>uO|En+LnL+MyFy@;}*Nuj;5(R4_$zX z$a<&{(PT!I_Hp_c_s*wtK|7l;AU&h`3s}XIdWK83F$Slf8ZPZg;wyZ3w)FEg{uxSd zZ6y<&j~VQonj#jXi7jT)6z%{0df4wSGaHa*(aoy0;U*q04Y|>U31f>wFfsDno`rl9 z!qiLj7!jJ7)btGECGMi`H0=~Dh_tgS&b2!ap z0w+mt(BBwd`-Gwau&+ngqv~uO^Yk#kNGO$cD{`nQ-o0Att`WFvA{_gdY i=ihk$!R+PXOVW$?Uc1=*arGZ@91XU1`aj;h``Nz$VJy}F literal 0 HcmV?d00001