From 56701d6ef6a1fdffd008aae3df79594e8e629dae Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Sat, 11 Apr 2026 00:26:47 +0300 Subject: [PATCH] ... --- F1:F103/AS3935-lightning/as3935.bin | Bin 11864 -> 17764 bytes F1:F103/AS3935-lightning/as3935.c | 83 +++++++++++++- F1:F103/AS3935-lightning/as3935.creator.user | 2 +- F1:F103/AS3935-lightning/as3935.h | 16 ++- F1:F103/AS3935-lightning/commproto.cpp | 109 ++++++++++++++++++- F1:F103/AS3935-lightning/hardware.h | 12 ++ F1:F103/AS3935-lightning/main.c | 11 +- F1:F103/AS3935-lightning/version.inc | 4 +- 8 files changed, 220 insertions(+), 17 deletions(-) diff --git a/F1:F103/AS3935-lightning/as3935.bin b/F1:F103/AS3935-lightning/as3935.bin index d8a2f69c47e2929c4afa01b0c5338cf4c99423eb..69e28a7c2c233ea15ba7cca92a32fbf4a1ce6789 100755 GIT binary patch delta 8242 zcmb_g4Rlk-m7b>`EdM)*A6Yix8JS<(U@-rJ;MhcfMS$=VngWT0E&K$wWGtB&1breQ zf&87&J_0OkLr1?Z95YbI z_q4?ajBd~StCc>Wb7&`4{jH5PuHfc#+_}bA6sPc!=BZAoxWMdA>4s{8s5B*+Lff^b zrtP7f%D^IJYlG3%wA15CxSOI>mlf4Id7k3Pw>kYK+MSBBjZO|@m6&sQPdIWvV zK-EgP1());YsB!Fzt7C>n3*D&akf37HM(STRQcw%mm_VjR&IZRHr12iQ|4)JaCr)! zB2Vp0!`RXQuM~~0B*qpijV?9gyx@qRG#fqgysBWZ|Ey)#(wS?zIM=4dTub%SXr?P= z7nIN#)%HYxZ5acCm?mYa4I&|Ocvmmw0`K-F+|@)v9O#XP_^1Bm=sVndIA&PqZ;oY7Td2(gnV(Y z(UfVL4|m^)8J+4k*3%qYiyWihsl7=&7Z7`TjAM{G5Ur1iBB^##kwp>FOeXqGk8!6V zAR=uER@GP^;oMDy$-4(geQfh_#pU0An(~1uol!V5n*^i%y0$_JKKoT zxZSuDo#=Zy)~E1?gL!O4HF3K_&X2JyKhpigz!ESpHj)ibM6!Wunhs6E}dxY+uvvb3KwCIm!0BJhOy; znNMYo3^0=rnd>mN88b~(=EH$z`dQf#(;!b(!D>d|RJZgMox!%B0tVK_R17{>Dzj}! zCur}?2c|05pXes1GTH%Fl#!{bBU7a^lOJm3UU&ah1l6WOoO~uw9?0? zr8sb{`bUwfSQ}FzI}wfI{x~PLKGcb#m2tDoEW4MORJ}C*={k1ifXz`6Y2`?VJRR z`7$;}_ESCR9ww&_=PZEqSCH08^VHR9UndEimOfCQ6=|h9c=k0^Ct_&YOAMaP_*zbw zvxK+HO543fT1%6_6*XCo0a3P-B9f_mV@Bm zEHea@;NJlMI&cN}SIh^>HVA7h`^_)2?@OY2gRqYpDqmxH0sP)FL;G&+8VkjL0{k2B zyP?1X1zwldLY*Vc&jV2ghzn&I&QSLn@9z@Zu58Ds8fJEl#R0yWnOzeZwH1gmkfPL} zm`6v6bQoz42le3!^U44z(Ob)xhJ#DOT;P>ni+N=`MNninr~8dtaZ&MYG86wM^D|{y zYdBckz22NMPH#1C<%*1(@jvgoo9iP-)YCYkJX^2m8}E0CsaMvRZwLkzTweXBQbcjh z%4OQpWb2dkH1up<+3vN{19wi>Ict-h zuyCa_WEWc-3X57B=-KynCp{jI1EljbV4emuk9mg1=uF|@vYxrtY>rDscRIEHNAZ2TGu=N1-(#K0{%m{?cP7xQjUpt% zdjfyxohW4Iib7WW&pUK;fRqCUx)H>Va6&^^l;$T7E3F=ytI+)teN7%x>vo>R&M6HzDccv=XkSu_tXT zr>;>E{zhX?#%mlWN*_M*jJTf}RTw;0;}~U;(aIS-E-am^#Ba3IWlL%~(wSa}8iosw z$91GLwU91xJ`Q$|i!(I23`|aMI?|a|c$}1UDcf2b=;e=I`V#XrS3UM0XYaDk_Y}@( zX&6z~vNpjVMb-mJF9p=(;f$>fO;DZ&<^Od(jQ!pYEv+4`5`&I_Rn3M-A=dsEqvECjI?g)2S zx&)8?SP9qS5mNk30#fR_M@RstHyQ29km8;ZWetHf>Db+dkj4=sv$;_h#uCjRKsP~S zd709A$u!E5R*XfofU=PiYZpnMj+&xq>ymDddOFpMp#KiE4>U=7YV>GsnPeYrR*!)5 zm!$KfJ&ClJO6`*t>Lzk2l1(=@^K*)wA*YmPmVnKX2{(T({aiOzF+E56t!{qWo^eET z1oTVLsd3V3{V(T(*>)mAPPf2aS*s>7}`ex6inwoUEn2!LPzJo|F9{#7lc)lzF2t5~v0DxW6w+ zY$46VQJU^`NR}*}syEmimUd_5s_C>QNx#baOuYcpZIG(77o}3JDitlzY3Y3Si`)Wf z;h1UMg2w7GE4kDfz)_LY((fNV!CjW@V}sn~Ml1gsmspI^WFslQ+;~4{H2279NK@$6 z1nfTxU}=oO$rVd)7}mp!wy^Y#VG5pnjt*&5ZZ3CPGUjHQy=M;~?>j8#ExRn|g$^Xn z>2L?Ow*1u7V(*W@+1P1^(_q~CYZ`$})Hp+~x%t51mzpu*C{+}xzkBK;oL zKR&)c`skcz8HwX%p*-QPR^egl>#aJbo}Lz5i`u~Z>4Z9jqf4~rY@rEzt~cmo z*PmZ3Nk>n5*>E;41-+r&wD+GQy$R^mAP^dZD3^qT7f5rwhl9tDuA>6QRd!X2SkO2m z!PO)d2P0hRu*flxV-$^nd@1a2!+RD{7IB}ShbvWzBH?ZZQfDqwY902)ivf;3&k}q_ zdumyxiPk6^-b{E`*}H_KW%TGOKpTs(hhAN<=j<&FYE;G0o@mI8YNB}yL{E^uB%nKy zUg9*cn4%PAliB@DhJ?h3$$Xedz_$HZP&1S5kR#2}ch8<-_!$W_lyX`3ZQSeorqidp z7rGL}IOYG+Px-HKEZRX2SAKB_Incu$uaI@ikMIOvUs&7&l(RQ=EacOZh~`hCEx&g}lkn78pQ^`bQ1r5+G#xhY3`E~5j!II@$D2rduhJMP6Qi$f(gUac? zitH(&J0z%B3TMI1XabMdh!1!aH)us{5EnP-{|1dv)X>b>n6Ket)KF0>(a2SgZg=@| z!8W|ecD%mZh?=Ho#myyB1!R|V6RI#W+D*fn?+tdCSdqn*~d)$BAFqzZayZ)v2L zRzXoNgWq2T2lbvg|4HbFI{!lG0p~?l!~1*R&VH;K%KKZ9-o6_C*Elae`vbgBVWI!( z2ZjFdP|maCY5zdyb8tY?JL%8|&@Zo#=M?{r-<>D?M6sev+Bk8!swbEqmQGHbps4MT z{x~szYEST3SQDp+6mrGqaIO!2qDfOHE$04Fa!qoI$IGM=68KMVll>^=?tQYi$$o@k z?Z6H(tO1zBu#bQpWY~Ma-i*n;&ak(Ey~eO!$Q@wVAz=F%b`01)hP?{xMTTt>!Fn0! z1t&7_QwZ*6*bZPGhFu0$&#)?B&ok_0U~YzO2IgXz5?l?#egw`L!>Smz0@yZ&%>pNY z6Un{BU@IBe3WXI+a6YhdhEatUh82Q)j$wBow~=8JfNcP`*4Jczh9P5stOxfvkaY|h z0c0)Z0%~wiF)Rt(D$0q0W++?1y8p-9>!%NmPHf)ALLejAzl+Bl5sXeMYDXf~+v(3E|g_%7a^XF!)h z?|}&3pygFIYpu&|bweTJd26+^&f(^rTlgw_rQmkh9hEMAi?f!mvbx;-^jUnh-9bo& z-BnXn?v%gQoxIb*FE3p=pD!%n9Zt7^LHYdj0)Fl4(v|uAi~@em>QWJ0Q2`Z$EjrL` zb(GuUdEV{pGn&tDt462IVXLj&8T~T1s2?%k==e%2bqNy?td2?>@3J{u&f1ACp5pwZ z!l_fIZ<$Ppf)FV`Unklf?s8{^jj;KkVXLjJt8w!(R_=UmOND(0)#kFfc@ubQ(+V+% z!^)hmwz{@a@2L#s`AO3!^N3HKLv9sL=4p3b?PgmolPRxr+p23wCG zK{G)MK&wC-L2i&2^e*Tm=rZUk=+B@4XhaFdg64u2gDjv5&;igvRC&#NU`~TBfqbA2 zP&X(W@9tds_6BVP71q;mNB%zLz-Y)N`V$O(9gP3GqHoP5ADj7{2c>5cCp70^Sf}u&K-9_=c2#I#hf0f?tE80v zik;dZv0nXGb-!I9>I6&Zr(z?7SSF@UoG0gqVg^-}$FHoIDQy#bA$Gt~JQd!;c3gRSW+)_}_-EfqyLY zY;af^lB1z--nQR}g@%=9_(V?)$w%NH4oXYkG7QOM@JFHl8UEK$;As?yA2GMKap=$tZ!dAu6E|+f^a~G!t}2p%HXi!8 z2Rkz~Fkt8@3HPD3TzGIP9uD+V^_6TiJRTtq?H_s(9n9)eJStA^8ra>hQ3DxIEbN7# zNqQnw-Jd1WbohysJM_9jtsg|_EzNa^O-0iF5=_g8!4wg8TJRwWUKf?GZ8Q2PzyNUA`!?{_@99# zt~rQk1TIG+Sn&cCsQPh%B`a-kl7+<0N>u~zkv#irl^IT7o{7~r;api^ni@Zq6MJgv zsZJJ%<#HloJW1&&yJ31PQCVB9O-yXwNUH~`iTD_ZfOl4Ty_$Vcf2gbr(~j`zTZp*N z!M0hNH79cHNy{T!#!&AfI11|cYDS1JKJ|T^Anzuh%@i=;`}reVw1jlHuq>CD(>h+n z$Md|S>^?Y%%G8y@n;#FSri;F}ewqk27+I}X(&f7P(+{|kOZ}^Mm$y_DGm$KRbb!6uU)q;Ct zib$0yuX0Q&wwB=8{tQ#?b{$_@9W!nDh0cW~zs0U?*`?>+h#nD`WX^^csf)eW&_-Q} zYYl@`FGF4%GRe9d-=s5au`x|&62EIYNsBsGH+Ciwan#U?NsQ*w*EiuCk%@1HeXnJd zb};HZAQaMDGi=1!jQg%V$6j{Y=_l-*)5MIe&D&qYN{oTYJ^`n4L;tINqGSw|Zl4WI z%$`QYM|q2&%Spue)C+inQMpqtq>r#?TiaUSDe&BUdTd<{-M`czb8A()ob30l4Xr;} zP3ipaQkvV$RLAzT^;PmZK6G&zoB>_VA8+1HHGf-S7SD5DJZ|9imY0#+4 z%-Gq|nok>-`GV?hFNn+$7xkS%p|z95kKMWk4|n#`N7?(Gqp|KF^Lvuh5ijh>mFdV1 z*apNN*oP5shwVcAMcBQFJ77x@x5M@#z8}_x*ah33^zs`(n~m`6r3wrGZbou#Tc^Fh zaz|@f(_$F-qgBziCPG_SO*XF6o?0DOwod!mswSk0@mkCAO32(RnDjn}?h3c1!H4iq z@TnRDjo6#`?41{-j5^=S9bM|LYCCnk>}*ugf99cd_FhcCFi4W69?~#YW 3) return FALSE; @@ -74,6 +82,14 @@ int as3935_tuncap(uint8_t n){ return as3935_write(TUN_DISP, t.u8); } +int as3935_get_tuncap(uint8_t *n){ + t_tun_disp t; + if(!as3935_read(TUN_DISP, &t.u8)) return FALSE; + *n = t.TUN_CAP; + return TRUE; +} + +#if 0 // set gain int as3935_gain(uint8_t n){ if(n > 0x1f) return FALSE; @@ -82,22 +98,34 @@ int as3935_gain(uint8_t n){ g.AFE_GB = n; return as3935_write(AFE_GAIN, g.u8); } +#endif +#include "usb_dev.h" +#include "strfunc.h" // starting calibration int as3935_calib_rco(){ t_tun_disp t; + USB_sendstr("1\n"); if(!as3935_read(TUN_DISP, &t.u8)) return FALSE; + USB_sendstr("2\n"); if(!as3935_write(CALIB_RCO, DIRECT_COMMAND)) return FALSE; + USB_sendstr("3\n"); t.DISP_LCO = t.DISP_TRCO = 0; t.DISP_SRCO = 1; if(!as3935_write(TUN_DISP, t.u8)) return FALSE; + USB_sendstr("4\n"); uint32_t Tstart = Tms; - while(Tms - Tstart < 5) IWDG->KR = IWDG_REFRESH; // sleep for 5ms + while(Tms - Tstart < 3) IWDG->KR = IWDG_REFRESH; // sleep for ~2ms t.DISP_SRCO = 0; + USB_sendstr("5\n"); if(!as3935_write(TUN_DISP, t.u8)) return FALSE; + while(Tms - Tstart < 300) IWDG->KR = IWDG_REFRESH; // sleep for ~2ms t_calib srco, trco; + USB_sendstr("6\n"); if(!as3935_read(CALIB_TRCO, &trco.u8)) return FALSE; + USB_sendstr(uhex2str(trco.u8)); newline(); if(!as3935_read(CALIB_SRCO, &srco.u8)) return FALSE; + USB_sendstr(uhex2str(srco.u8)); newline(); if(!srco.CALIB_DONE || !trco.CALIB_DONE) return FALSE; return TRUE; } @@ -112,13 +140,20 @@ int as3935_wakeup(){ } // set amplifier gain -int as3935_set_gain(uint8_t g){ +int as3935_gain(uint8_t g){ if(g > 0x1f) return FALSE; t_afe_gain a = {0}; a.AFE_GB = g; return as3935_write(AFE_GAIN, a.u8); } +int as3935_get_gain(uint8_t *n){ + t_afe_gain g; + if(!as3935_read(AFE_GAIN, &g.u8)) return FALSE; + *n = g.AFE_GB; + return TRUE; +} + // watchdog threshold int as3935_wdthres(uint8_t t){ if(t > 0x0f) return FALSE; @@ -128,6 +163,13 @@ int as3935_wdthres(uint8_t t){ return as3935_write(THRESHOLD, thres.u8); } +int as3935_get_wdthres(uint8_t *n){ + t_threshold thres; + if(!as3935_read(THRESHOLD, &thres.u8)) return FALSE; + *n = thres.WDTH; + return TRUE; +} + // noice floor level int as3935_nflev(uint8_t l){ if(l > 7) return FALSE; @@ -137,6 +179,13 @@ int as3935_nflev(uint8_t l){ return as3935_write(THRESHOLD, thres.u8); } +int as3935_get_nflev(uint8_t *n){ + t_threshold thres; + if(!as3935_read(THRESHOLD, &thres.u8)) return FALSE; + *n = thres.NF_LEV; + return TRUE; +} + // spike rejection int as3935_srej(uint8_t s){ if(s > 0xf) return FALSE; @@ -146,6 +195,13 @@ int as3935_srej(uint8_t s){ return as3935_write(LIGHTNING_REG, lr.u8); } +int as3935_get_srej(uint8_t *n){ + t_lightning_reg lr; + if(!as3935_read(LIGHTNING_REG, &lr.u8)) return FALSE; + *n = lr.SREJ; + return TRUE; +} + // minimal lighting number int as3935_minnumlig(uint8_t n){ if(n > 3) return FALSE; @@ -155,6 +211,13 @@ int as3935_minnumlig(uint8_t n){ return as3935_write(LIGHTNING_REG, lr.u8); } +int as3935_get_minnumlig(uint8_t *n){ + t_lightning_reg lr; + if(!as3935_read(LIGHTNING_REG, &lr.u8)) return FALSE; + *n = lr.MIN_NUM_LIG; + return TRUE; +} + // clear amount of lightnings for last 15 min int as3935_clearstat(){ t_lightning_reg lr; @@ -173,7 +236,7 @@ int as3935_intcode(uint8_t *code){ } // should interrupt react on disturbers? -int as3935_mask_disturber(uint8_t m){ +int as3935_maskdist(uint8_t m){ if(m > 1) return FALSE; t_int_mask_ant i; if(!as3935_read(INT_MASK_ANT, &i.u8)) return FALSE; @@ -181,6 +244,13 @@ int as3935_mask_disturber(uint8_t m){ return as3935_write(INT_MASK_ANT, i.u8); } +int as3935_get_maskdist(uint8_t *n){ + t_int_mask_ant i; + if(!as3935_read(INT_MASK_ANT, &i.u8)) return FALSE; + *n = i.MASK_DIST; + return TRUE; +} + // set Fdiv of antenna LCO int as3935_lco_fdiv(uint8_t d){ if(d > 3) return FALSE; @@ -190,6 +260,13 @@ int as3935_lco_fdiv(uint8_t d){ return as3935_write(INT_MASK_ANT, i.u8); } +int as3935_get_lco_fdiv(uint8_t *n){ + t_int_mask_ant i; + if(!as3935_read(INT_MASK_ANT, &i.u8)) return FALSE; + *n = i.LCO_FDIV; + return TRUE; +} + // calculate last lightning energy int as3935_energy(uint32_t *E){ if(!E) return FALSE; diff --git a/F1:F103/AS3935-lightning/as3935.creator.user b/F1:F103/AS3935-lightning/as3935.creator.user index 438cf16..22f7fa6 100644 --- a/F1:F103/AS3935-lightning/as3935.creator.user +++ b/F1:F103/AS3935-lightning/as3935.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/F1:F103/AS3935-lightning/as3935.h b/F1:F103/AS3935-lightning/as3935.h index 00e5038..876971c 100644 --- a/F1:F103/AS3935-lightning/as3935.h +++ b/F1:F103/AS3935-lightning/as3935.h @@ -121,23 +121,29 @@ typedef union{ // distance out of range #define DIST_OUT_OF_RANGE (0x3f) -int as3935_open(const char *path, uint8_t id); -int as3935_getter(uint8_t reg, uint8_t *data); -int as3935_setter(uint8_t reg, uint8_t data); int as3935_displco(uint8_t n); +int as3935_get_displco(uint8_t *n); int as3935_tuncap(uint8_t n); +int as3935_get_tuncap(uint8_t *n); int as3935_gain(uint8_t n); +int as3935_get_gain(uint8_t *n); int as3935_wakeup(); int as3935_calib_rco(); -int as3935_set_gain(uint8_t g); +//int as3935_set_gain(uint8_t g); int as3935_wdthres(uint8_t t); +int as3935_get_wdthres(uint8_t *t); int as3935_nflev(uint8_t l); +int as3935_get_nflev(uint8_t *l); int as3935_srej(uint8_t s); +int as3935_get_srej(uint8_t *s); int as3935_minnumlig(uint8_t n); +int as3935_get_minnumlig(uint8_t *n); int as3935_clearstat(); int as3935_intcode(uint8_t *code); -int as3935_mask_disturber(uint8_t m); +int as3935_maskdist(uint8_t m); +int as3935_get_maskdist(uint8_t *m); int as3935_lco_fdiv(uint8_t d); +int as3935_get_lco_fdiv(uint8_t *d); int as3935_energy(uint32_t *E); int as3935_distance(uint8_t *d); int as3935_resetdef(); diff --git a/F1:F103/AS3935-lightning/commproto.cpp b/F1:F103/AS3935-lightning/commproto.cpp index 4017970..0810a3e 100644 --- a/F1:F103/AS3935-lightning/commproto.cpp +++ b/F1:F103/AS3935-lightning/commproto.cpp @@ -22,6 +22,7 @@ extern "C"{ #include #include "adc.h" +#include "as3935.h" #include "commproto.h" #include "hardware.h" #include "spi.h" @@ -43,12 +44,27 @@ static uint8_t curbuf[MAXSTRLEN]; // list of all commands and handlers #define COMMAND_TABLE \ + COMMAND(clearstat, "clear amount of lightnings for last 15 min") \ + COMMAND(displco, "display on LCO: 0- nothing, 1- TRCO, 2- SRCO, 3- LCO") \ + COMMAND(distance, "distance to lightning, km") \ + COMMAND(energy, "energy of last lightning") \ + COMMAND(gain, "change sensor's gain (0..1f)") \ COMMAND(help, "show this help") \ + COMMAND(intcode, "last interrupt code") \ + COMMAND(lco_fdiv, "set Fdiv of antenna LCO") \ + COMMAND(maskdist, "mask (1) or unmask (0) disturber") \ COMMAND(mcutemp, "get MCU temperature (degC*10)") \ COMMAND(mcureset, "reset MCU") \ - COMMAND(SPI, "transfer SPI data: SPI=data (hex)") \ + COMMAND(minnumlig, "ninimal lightnings number (0..2)") \ + COMMAND(nflev, "noice floor level (0..7)") \ + COMMAND(resetdef, "reset sensor to defaults") \ + COMMAND(SPI, "transfer SPI data: SPIx=data (hex)") \ + COMMAND(srej, "spike rejection (0..15)") \ COMMAND(time, "show current time (ms)") \ - COMMAND(vdd, "get approx Vdd value (V*100)") + COMMAND(tuncap, "set 'tune capasitors' to given value") \ + COMMAND(vdd, "get approx Vdd value (V*100)") \ + COMMAND(wakeup, "wake-up given sensor and make its calibration") \ + COMMAND(wdthres, "watchdog threshold (0..15)" ) typedef struct { const char *name; @@ -106,7 +122,6 @@ static char *splitargs(char *args, int32_t *parno){ return next; } -#if 0 /** * @brief argsvals - split `args` into `parno` and setter's value * @param args - rest of string after command @@ -125,7 +140,6 @@ static bool argsvals(char *args, int32_t *parno, int32_t *parval){ } return false; } -#endif static errcodes_t cmd_time(const char *cmd, char _U_ *args){ CMDEQ(); @@ -177,6 +191,91 @@ static errcodes_t cmd_help(const char _U_ *cmd, char _U_ *args){ return ERR_AMOUNT; } +static errcodes_t senscmd8(int32_t CHno, int (*cmd)(uint8_t), int32_t arg){ + if(CHno < 0 || CHno >= SENSORS_AMOUNT) return ERR_BADPAR; + uint8_t par = static_cast(arg); + CS(CHno); + int ans = cmd(par); + CS_OFF(); + if(ans) return ERR_OK; + return ERR_CANTRUN; +} + +static errcodes_t getta(const char *cmd, int32_t CHno, int (*fn)(uint8_t*)){ + if(CHno < 0 || CHno >= SENSORS_AMOUNT) return ERR_BADPAR; + uint8_t par; + CS(CHno); + int ans = fn(&par); + CS_OFF(); + if(!ans) return ERR_CANTRUN; + CMDEQP(CHno); SEND(u2str(par)); SEND("\n"); + return ERR_AMOUNT; +} + +static errcodes_t senscmd(int32_t CHno, int (*cmd)()){ + if(CHno < 0 || CHno >= SENSORS_AMOUNT) return ERR_BADPAR; + CS(CHno); + int ans = cmd(); + CS_OFF(); + if(ans) return ERR_OK; + return ERR_CANTRUN; +} + +static errcodes_t cmd_displco(const char *cmd, char *args){ + int32_t CHno, val; + if(!argsvals(args, &CHno, &val)) return getta(cmd, CHno, as3935_get_displco); + errcodes_t ret = senscmd8(CHno, as3935_displco, val); + if(ret == ERR_OK) DISPLCO[CHno] = val; + return ret; +} + +#define AS3935_FN8(nm) \ +static errcodes_t cmd_ ## nm(const char* cmd, char* args){ \ + int32_t CHno = -1, val; \ + if(!argsvals(args, &CHno, &val)) return getta(cmd, CHno, as3935_get_ ## nm); \ + return senscmd8(CHno, as3935_ ## nm, val);} + +#define AS3935_FN(nm) \ +static errcodes_t cmd_ ## nm(const char*, char* args){ \ + int32_t CHno = -1; \ + splitargs(args, &CHno); \ + return senscmd(CHno, as3935_ ## nm);} + +AS3935_FN8(tuncap) +AS3935_FN8(gain) +AS3935_FN8(wdthres) +AS3935_FN8(nflev) +AS3935_FN8(srej) +AS3935_FN8(minnumlig) +AS3935_FN8(maskdist) +AS3935_FN8(lco_fdiv) +AS3935_FN(wakeup) +AS3935_FN(clearstat) +AS3935_FN(resetdef) + +#define AS3935_GU8(nm) \ +static errcodes_t cmd_ ## nm(const char* cmd, char* args){ \ + int32_t CHno = -1; uint8_t par;\ + splitargs(args, &CHno); \ + if(CHno < 0 || CHno >= SENSORS_AMOUNT) return ERR_BADPAR; \ + CS(CHno); int ans = as3935_ ## nm(&par); CS_OFF(); \ + if(!ans) return ERR_CANTRUN; \ + CMDEQP(CHno); SEND(u2str(par)); SEND("\n"); \ + return ERR_AMOUNT; } + +AS3935_GU8(intcode) +AS3935_GU8(distance) + +static errcodes_t cmd_energy(const char* cmd, char* args){ + int32_t CHno = -1; uint32_t par; + splitargs(args, &CHno); + if(CHno < 0 || CHno >= SENSORS_AMOUNT) return ERR_BADPAR; + CS(CHno); int ans = as3935_energy(&par); CS_OFF(); + if(!ans) return ERR_CANTRUN; + CMDEQP(CHno); SEND(u2str(par)); SEND("\n"); + return ERR_AMOUNT; +} + /** * @brief parse_hex_data - data parsing in case of `hex + text` input format * @param input - input string @@ -224,7 +323,7 @@ static errcodes_t cmd_SPI(const char _U_ *cmd, char *args){ int32_t CHno; char *setter = splitargs(args, &CHno); if(!setter) return ERR_BADVAL; - if(CHno < 0 || CHno > 1) return ERR_BADPAR; + if(CHno < 0 || CHno >= SENSORS_AMOUNT) return ERR_BADPAR; int len = parse_hex_data(setter, curbuf, MAXSTRLEN); if(len <= 0) return ERR_BADVAL; CS(CHno); diff --git a/F1:F103/AS3935-lightning/hardware.h b/F1:F103/AS3935-lightning/hardware.h index f89ba38..9ac5a8b 100644 --- a/F1:F103/AS3935-lightning/hardware.h +++ b/F1:F103/AS3935-lightning/hardware.h @@ -20,6 +20,9 @@ #include +// amount of connected sensors +#define SENSORS_AMOUNT 2 + // LED0 - PC13 (bluepill), blinking each second #define LED0_port GPIOC #define LED0_pin (1<<13) @@ -41,5 +44,14 @@ // INT pins: PA0/PA1 #define CHK_INT(x) ((GPIOA->IDR & (1<KR = IWDG_REFRESH; // refresh watchdog if(Tms - lastT > 499){ @@ -57,7 +65,8 @@ int main(){ const char *ans = parse_cmd(USB_sendstr, inbuff); if(ans) USB_sendstr(ans); } - for(int ch = 0; ch < 2; ++ch){ + for(int ch = 0; ch < SENSORS_AMOUNT; ++ch){ + if(DISPLCO[ch] == DISPLCO_NOTHING) continue; // don't check IRQ in if it used as clock output if(CHK_INT(ch)){ if(oldint[ch] == 0){ oldint[ch] = 1; diff --git a/F1:F103/AS3935-lightning/version.inc b/F1:F103/AS3935-lightning/version.inc index 6f740fe..34c03ee 100644 --- a/F1:F103/AS3935-lightning/version.inc +++ b/F1:F103/AS3935-lightning/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "14" -#define BUILD_DATE "2026-04-08" +#define BUILD_NUMBER "25" +#define BUILD_DATE "2026-04-11"