From 57ad2340911f08d3eb2a695fea33e3ef80db65dc Mon Sep 17 00:00:00 2001 From: eddyem Date: Sat, 20 Jul 2019 20:20:40 +0300 Subject: [PATCH] add GPS full cold start command --- F1-nolib/chronometer/GPS.c | 10 ++++++++++ F1-nolib/chronometer/GPS.h | 1 + F1-nolib/chronometer/adc.h | 4 ++++ F1-nolib/chronometer/chrono.bin | Bin 15396 -> 15396 bytes F1-nolib/chronometer/flash.c | 19 ++++++++++--------- F1-nolib/chronometer/main.c | 21 ++++++++++++++------- F1-nolib/chronometer/str.c | 5 +++++ F1-nolib/chronometer/str.h | 1 + F1-nolib/chronometer/usb.c | 4 ++-- F1-nolib/chronometer/usb.h | 2 +- F1-nolib/chronometer/usb_lib.c | 5 ++++- 11 files changed, 52 insertions(+), 20 deletions(-) diff --git a/F1-nolib/chronometer/GPS.c b/F1-nolib/chronometer/GPS.c index 65f218b..b3f44a7 100644 --- a/F1-nolib/chronometer/GPS.c +++ b/F1-nolib/chronometer/GPS.c @@ -24,6 +24,7 @@ #include "time.h" #include "usart.h" #include "str.h" +#include "usb.h" #include // memcpy #define GPS_endline() do{usart_send(GPS_USART, "\r\n"); transmit_tbuf(GPS_USART); }while(0) @@ -128,6 +129,11 @@ void GPS_send_start_seq(){ need2startseq = 0; } +// send "full cold start" command to clear all almanach & location data +void GPS_send_FullColdStart(){ + write_with_checksum("PMTK104"); +} + /** * Parse answer from GPS module * @@ -160,6 +166,10 @@ void GPS_parse_answer(const char *buf){ if(!checksum_true(buf)){ return; // wrong checksum } + if(showGPSstr){ + showGPSstr = 0; + USB_send(buf); + } buf += 7; // skip header if(*buf == ','){ // time unknown GPS_status = GPS_WAIT; diff --git a/F1-nolib/chronometer/GPS.h b/F1-nolib/chronometer/GPS.h index 8545af5..33cf025 100644 --- a/F1-nolib/chronometer/GPS.h +++ b/F1-nolib/chronometer/GPS.h @@ -38,5 +38,6 @@ extern gps_status GPS_status; void GPS_parse_answer(const char *string); void GPS_send_start_seq(); +void GPS_send_FullColdStart(); #endif // __GPS_H__ diff --git a/F1-nolib/chronometer/adc.h b/F1-nolib/chronometer/adc.h index 1cab310..08d253b 100644 --- a/F1-nolib/chronometer/adc.h +++ b/F1-nolib/chronometer/adc.h @@ -21,6 +21,10 @@ #define NUMBER_OF_ADC_CHANNELS (3) +// interval of trigger's shot (>min && p8|s1gnt4W1Qcnf#Go+{6bj7Ls_le|)3j<$)$v8!PGZ%0 zyxJf2I@MNdt);CkiURsxUCPjQ+F3faYl5vab?nrCL$$tM9VEF4B=0*{v|XLG=B+ib zcFz7k=j^l3K09f1wmDs-p72@&QKbV?egfnte@uq~W3%z|vHxuIV;>JGevtot1XoYE z%{yKsk1l!AZ*LQ-&$Ec?IN--l{vCY1o~Ygid0ZF-+w&{CooODU1g(wi$%gk8f03Ulpx9wL*>Y7G- z+Vm!y-d-#wHE{>Ks#JBH#dL~I|L z<1f>wuYF3wK5dwYZw=A181UZ^PQ~WNILe6X6HK(Rl&JiIS~GJVC+_fb;t7AD^Se$W zemG3>p6#m{d|&srHP4Z1dl#1VLnMngD-MV~ZJ?^}QoF6YEh+Y}?`VjK_YW}}-n`A4 zYGazOL$g$9*W_wAaUT3{@b{ahHa`(-gJo=C;6#G+ zAUIXQN#GcR2PGb1$O%mZH5HT&R7R)>)TH39)topDx<$bP&;`MBpr?Y)4(5W^1xa?! zY*JL`F_?)sF4&%?ytY;`$Igkl&`EFwl||G;%l_9p9?H?dbc?}D48)j-1I(by=Kxv&4!|>jR=^g3s|`kb z0DA%F>{R?aj{11uzrCceyzl$;0`ohTct6e1_-WmnCZl-Bt?t}vy4ANEx0H%ELR8d- zpImLYf3QnAp>nXfBjUy=!j5N~pX9j)9_ldN)GVXh1ykiJ94=#&NlVRO1)A1%)Q9jqW?wTi-^cNT#<5VLv4h)El5gR)V!IB zFJOtzKue|~nAoH)+|s+=vL2dC15EZC$esv1XL;$$=&Fm$ZeDTdT>~F==*_O`!t?|` zofzk*vCos~9#O0{jiOfsk6 zoihe=sxhY#TRkOFQIIc6v8?&*Wt#Q$WrD3L_Q!aS-XO8Afyw(B{cwl<$`XBXpWa+j zz4%7~SUVB`PPF z54c;TvEXcy9=Oa~mY9h6f^^>7tY3tQ(yR0COjNhqGzAl_MWj=py;>p&_SSHeHw{_Y zhU{Y*%rc#2{0B(DjP=(Z_^`x<(gMN{FhbD)#jk;DfFA^Y3HVnSRiHn?`1y$wCl&)I z01s%rxv&ODoqXm5z2~sB7RtN8u{NeV4juVddb5ds)>~OFIt7 zSyP>pI_n19j=BNzRBVl=Ij)&x-D62};DPhA`WA)i)^>?vR9jLVNta2lgoWRUMiL9h zG3*j;1W%%=@k`(yA$#nbO5C@A@Tak+m@$Z2G75h(#uOnX`7wwtNW!}0yh&8-@E4f# z&AgdxHD*%rUB4b!zS*c#ApE=hG_%CPN^2_2U(^s)pGNp5`F_|>mjpf~XRKj z@>QZnaZ!Gi*%>hdW=wbvfqra8`+t4^Idd8ho_#XvDJF4abR5DPP@5}9BQ|h5I!VDS znT`tJ{n4;^MF)AA6O!=$$Q(s5y_&ipx+T52nyEwuQ)QLw(s`K<2gZVqE~VlnDQWhS z&SJC`RQyKLVyWN-ltn7MEy_|-bffP!?{9%YFXdSnKa=EmK+klT?Out6CIWasA>clM z1(3yFh&e#Y4@H>SbjU9$U!Le-AW^2@k%Z{+slUYCmRMs$#n%z*aw8Q#I;@rzHb^Qf z_!8XU?U#K%#d$oZG$?f9IVg^ZGq?qI;QD=3Veo1FKw*2bAW=N!}_C<;`&0;V1kl z?{qo7d;C=_zPJ?oB$Lc}!#{0=(gDwuX zawAK{CajO~bKUSOL~cl8b2r}s$+l? zfTk%wl)*iqJpgvyzsAU}{FbRmOk~bB(9ZxjLjO*$^c{Ex&<^m)b#hKg0ugA8&G%px z9|dXZ_;FoO5B{yMbbRo;~bK5Zr5rp#Oy z+XwsRV2MD{LjdOh{HW%vsb36W_04!QoG_yX$;KDhxXmRtB0htsAKz4X?o}eL1pZEl z+ZOV5quH-SJHu@Y`z8k1QY#0R?C0KNtLTwszuHf9-1gKarlA|A8;J`B^Y=4_KM&Ja z*;og+L_9Xkc33&k0CTo{WF<7Mcg=}-ILP*1IWPknY-=yd8u!bSZwO5F67l(=8t-kH zOP1O9kC9JeJQh4V#L2VGO$K2J&Gp7XLz8`g4H%o&i3TNaRvvKlJQNi;wbQawcvW3C z?&VnpPEK?wIDM`s@w8Sy*<;ja_vM+xzO}+Nb-HW&;gjmeofG;Z@*6$s{D?kIXK!^? zKWkMvQXNG1taYyKtap)<>i6{#U1pbp%`-rnG6#%}X;mw&ZCz~Exwf6q(dox~GWBCT zT78Cx=$69rW$%;7{GWw4cq8+RJ*xa156S-kGdy8=%u4LkHrLka@`ioI;YCiZ{&Jtw zYi|wv-XB`z^m(JSkJi|%n$~gl-?jdtHQDBAomcaS?GN8_^$*xuyic_L+&b62-%E8( z)(5MTTh;bPs|xO(_Zn}~;wM_4H%;^KU!gg3**#sijIMfox?Qe;r}tlPwbsNH#oNiv zkKB)^Rcj(zyQ(`a!i~`h#g*2FZ42N)QT#k>N!<^9(RJ&?rLKXwFsi6g%SLa>My*{W z-|H!7Rw-Y5ueVODDVC*c?n?VS6PR@LA0f@EQ9$~nuxYe5>3VBwO%AAqU$M!VpLadu zWX&DWjIGf_)+k&at(_|3`0-pA^Dq`N+(wKCFtW60L3(&lmM#GX03u)yAg_X`t_#zm z6BNz+KD%57ouUBf;+m zsg98E+u;jdL#CnZFJ6T%(#m+O8yWUVy`klP`GzDw_%Z%p#jN}>;7 zpG>w}`s5!`Nd>b04oO|KrPok4rR;havs8+)O7Ybc#ks+HZYmzyaf zuEEq7rKoD=ZlAG{01==%gtiXS?a=>BIG>Z5wF2CAfQ^7%01tp| zp5jhFj$kYX-JO=}h~Ne)x?d{%EytafgfSCM>dy|7-fv>q?`+Kzf0h{X%^MDR*$YZw z><0KNgszFN2&&>g=Pp~gd`0uJ6?_rDeBqNVy!qFQ7xPt17q{>YBZ3u6`I+^N-Cq>H zLWRX8^G7}ASUzGS{ITR}MkBNO6|-8vtnRqGZ8eH??=St7W;8T4!u^U-n4e5wvzn~MhEgGO>WjkB qsacVQl#oIyT$!4az$$zgq>;`0F%T5@go@WU-D#!ebW%f7Io13%GK@&?GmHyJv3eUySI67vkTQBW@!;pJO)^F570e-REL6!MSAG}AM(z1SGGzlp}fS()rZ)l$$DQ*Lj4M;Iw_Mhz4{in|VrjJa;!?FMHTD%`) zhU80ghh2e)T?8nOATAV=*I-7%O$$r7bzzB4VxQBX=tNy7i^$W`IZD3-F>ZtyhMbpH zhNmktk=Tkr!^Y>rfo9+4Xf%#-E_g!K@~>K=_!w>3SeFufWqtC z`24A(JfkO^N&nz3a!vSZ1Crf#Pe3F(lw?4HG8z~mwa9F$rdK>$R;4?(yLUX9ZgEZ; zKn`XumuN5<%IGup*ylDg2B&v}-&DVWGs+l??2xl_c07M}r*$V;#FV)FPg`DnR6Ww>Lzc;U6ZR0e%&sY-_>@)W49$2rZk~DpST~>)TlfiHSIN1Wur$1 zQ&qU+LdSZuIVj5voHl{mi@}<7#EWLcz2u&Ky5sK0%U%A5!NM4uQnawQ-vY{Ky%p4k z4b zz&Mr70GjpWcRKAD)O8VZ3C%;MfzYN?+JQ_h(9#?m0J-LbtlR*26|fm#1$+)TL6Wml zZH~6&Uznwy9n2KxxL64z%Xvloy~!$>l$>#_oJq);&kkgAb9S%~FadGb)6|d)SkK}9dYkOQQlggt@nN1+x9%C+VL)o92r5` zj755g>)Z=m(U067`yT7yCLvG{vt&o;7{;>Au69t(ouH{E7nHdw%xwqzUqpH`@Ozk> z6eB4K&*Dz9H6j1LO6XY9-*F>KP9}`TpOE-OZCpHbjEa!qiMpiO9n~F3Z{m{HW!=DJ zeqttGPu3=CUFG33K?%a#n-Rnnhs&sAAc+IXR*>X}i$O9h{6UC;Fbs* zu`aUZz6UG|Y(qLaLX2v=xypa)AkKj_X68Tdv~l%~uilpWdcpkKIQ1yZrVx%CBf$du^$q%xAFF z)GYbgs+#R{L(V%Rd#?xgOTp7p=F$G7HU(+=KWH>0S49c#;-W^)d&QV*GRv zKUWp)6ay%q99J_#44~rb8OYW(0GjpU>3~zx0!f?s+|6lwq1^}Y0)n8U0DKJe=g@AX zG@u3W*OMntX2S_N3iLieJ75V!G}`(^^CDj~L77tPT-4zUVVVqU%%)5F3oPc7R zK?AVqD5b&a56BCu-7+EYM3@XuHYZ(!liLF&QV+D($=c+_&{Ys7J;`~+LLeB@TkpwrSfkxomeuY?xcNeCh5q#NX^)LIwfP6=8MJs;D zaqojY6QtmwpvjU5{2sw%0gK$eetRdoz6DRd18@?Q!rTFZ?)C)Ov3Yz1;yJ6ICKb#iq;U8sO=OffOVujVKUz1zxm)0@;`L4y@=UU^-)$n=n(& zsic?1`jzep9Y6;oMqU)PW8aAUL&6~72b3bNGL|-V zY5NE$z~RM=X~9*H39>>3yb`ifRCwFhCo2|uSa1L+< z;0GXZKAYb4Dj>>_$Srg_#Kpz(#fb(8wERF^EJ~b%)K!SP6{Vj5h`S56%T0(Id|W9i zT#hR2m>JxJxSsx=0mt27zXh-ta0oDvd@(3Pns>}kt`AyjAA9ankCdyPQhD#+Lm+6R z!d9{8_aFSavU0shia#4G-}{NF)S_9FXOVBx(_j;4N8f^|43SOlnpQIn);}$ZxOGw3 zx6Gtseh)gHvY0 zi&><=CSy5Lm;e(1e#iqvGahax26!ugp1yi$zjFccL&Y(m0tSF$BXoFSkRRG^XnUYV z|3cj|#LJ=Dv?PK=DV4n0cjhc!dgc%d~C4ZJD{fpa`atFsyqCy&&LR!)Q`+UGvL1EJfM z>&!r10IGPM$p(6g8IN0Qt2y_|8IK5o@1vK31?>|jPn>F*aw(X-`%;kGJgi#?T;fMG z&vHm{BLFW~WZ z+Fs)6?=1c;arAT;O?@5i5{E;@kR{oXTAy!AX-4|dKFK!3Jrukws*VR$x}d?L=4jE0 zF20OKoF-&p`}z{azQ(q`+vW>?mh#T5=4?aQr`Iy~Sz>`G zl%aRM4H}QRn1plk=L|hRs?65B!+hTN+vfe|zxyt)DlpvdjW1;^1=?8P3}~P9B3*T} z#5vxO;FahS>}qFuCx-vv(AJn`EW5-?b#gmnQ9J3q7z@~rGH^bYAoALHI#3m{6%Ofe=cNbo@Yu6;wog|VGXpe zCG_d{@o9Qd|22}Cn>O>e{o2omXz^<-9aX9ot++ycSN8wFOkaoMYv|~AL-dykNe>x2 zX?AV|XSV@%0Tf3P#hus+`X|T>xmoGiAT0%$0CfO2UMBS|xk9Vi6;5{$9*K0q+Q4cJ#f9yPv3_EmgLBF4WR?j5lOOAsQ@ zm&_+zNzdV6>8Ch;Lj81R<)UAa3nTZFmQnm$`^vF&`jl$2a`a1yCNP9P!SJIX!swhh h%EEa4m|^iWR|Jg6!ZAC^<}uEGc;HjM|4)Vn{2R&4%vk^c diff --git a/F1-nolib/chronometer/flash.c b/F1-nolib/chronometer/flash.c index 580c3c3..34353ea 100644 --- a/F1-nolib/chronometer/flash.c +++ b/F1-nolib/chronometer/flash.c @@ -35,13 +35,14 @@ */ #include "stm32f1.h" -#include // memcpy +#include "adc.h" #include "flash.h" #include "lidar.h" #ifdef EBUG #include "usart.h" #endif +#include // memcpy extern uint32_t _edata, _etext, _sdata; static int maxnum = FLASH_BLOCK_SIZE / sizeof(user_conf); @@ -52,14 +53,14 @@ typedef struct{ } flash_storage; #define USERCONF_INITIALIZER { \ - .userconf_sz = sizeof(user_conf) \ - ,.dist_min = LIDAR_MIN_DIST \ - ,.dist_max = LIDAR_MAX_DIST \ - ,.trig_pullups = 0xff \ - ,.trigstate = 0 \ - ,.trigpause = {400, 400, 400} \ - ,.ADC_min = 1024 \ - ,.ADC_max = 3072 \ + .userconf_sz = sizeof(user_conf) \ + ,.dist_min = LIDAR_MIN_DIST \ + ,.dist_max = LIDAR_MAX_DIST \ + ,.trig_pullups = 0xff \ + ,.trigstate = 0 \ + ,.trigpause = {400, 400, 400, 300, 300} \ + ,.ADC_min = ADC_MIN_VAL \ + ,.ADC_max = ADC_MAX_VAL \ } __attribute__((section(".myvars"))) static const flash_storage Flash_Storage = { diff --git a/F1-nolib/chronometer/main.c b/F1-nolib/chronometer/main.c index 1c4fef0..7723301 100644 --- a/F1-nolib/chronometer/main.c +++ b/F1-nolib/chronometer/main.c @@ -86,6 +86,10 @@ char *parse_cmd(char *buf){ btns[28] = GET_PPS() + '0'; return btns; break; + case 'c': + DBG("Send cold start"); + GPS_send_FullColdStart(); + break; case 'C': if(getnum(&buf[1], &N)){ SEND("Need a number!\n"); @@ -137,6 +141,7 @@ char *parse_cmd(char *buf){ return "0/1 - turn on/off LED1\n" "'b' - get buttons's state\n" + "'c' - send cold start\n" "'d' - dump current user conf\n" "'p' - toggle USB pullup\n" "'C' - store userconf for N times\n" @@ -179,11 +184,17 @@ void linecoding_handler(usb_LineCoding __attribute__((unused)) *lc){ // get/set DBG("linecoding_handler"); }*/ -void clstate_handler(uint16_t __attribute__((unused)) val){ // lesser bits of val: DTR|RTS +void clstate_handler(uint16_t __attribute__((unused)) val){ // lesser bits of val: RTS|DTR USB_send("Chronometer version " VERSION ".\n"); #ifdef EBUG - if(val & 1) DBG("RTS set"); - if(val & 2) DBG("DTR set"); + if(val & 2){ + DBG("RTS set"); + USB_send("RTS set\n"); + } + if(val & 1){ + DBG("DTR set"); + USB_send("DTR set\n"); + } #endif } @@ -272,10 +283,6 @@ int main(void){ r = usart_getline(GPS_USART, &txt); if(r){ txt[r] = 0; - if(showGPSstr){ - showGPSstr = 0; - USB_send(txt); - } GPS_parse_answer(txt); } } diff --git a/F1-nolib/chronometer/str.c b/F1-nolib/chronometer/str.c index 1e511ba..d48ce5e 100644 --- a/F1-nolib/chronometer/str.c +++ b/F1-nolib/chronometer/str.c @@ -18,6 +18,7 @@ #include "adc.h" #include "flash.h" +#include "GPS.h" #include "str.h" #include "time.h" #include "usart.h" @@ -107,6 +108,7 @@ int parse_USBCMD(char *cmd){ CMD_GETADCVAL " - get ADC value\n" CMD_DISTMIN " - min distance threshold (cm)\n" CMD_DISTMAX " - max distance threshold (cm)\n" + CMD_GPSRESTART " - send Full Cold Restart to GPS\n" CMD_GPSSTR " - current GPS data string\n" CMD_LEDS "S - turn leds on/off (1/0)\n" CMD_GETMCUTEMP " - MCU temperature\n" @@ -246,6 +248,9 @@ int parse_USBCMD(char *cmd){ the_conf.ADC_min = (int16_t) N; succeed = 1; } + }else if(CMP(cmd, CMD_GPSRESTART) == 0){ + USB_send("Send full cold restart to GPS\n"); + GPS_send_FullColdStart(); }else return 1; IWDG->KR = IWDG_REFRESH; if(succeed) USB_send("Success!\n"); diff --git a/F1-nolib/chronometer/str.h b/F1-nolib/chronometer/str.h index 5cc21ae..a577328 100644 --- a/F1-nolib/chronometer/str.h +++ b/F1-nolib/chronometer/str.h @@ -40,6 +40,7 @@ #define CMD_GETMCUTEMP "mcutemp" #define CMD_GETADCVAL "adcval" #define CMD_LEDS "leds" +#define CMD_GPSRESTART "gpsrestart" extern uint8_t showGPSstr; diff --git a/F1-nolib/chronometer/usb.c b/F1-nolib/chronometer/usb.c index f9ad6db..09730c5 100644 --- a/F1-nolib/chronometer/usb.c +++ b/F1-nolib/chronometer/usb.c @@ -101,13 +101,13 @@ void usb_proc(){ } } -void USB_send(char *buf){ +void USB_send(const char *buf){ if(!USB_configured()){ DBG("USB not configured"); return; } uint16_t l = 0, ctr = 0; - char *p = buf; + const char *p = buf; while(*p++) ++l; while(l){ uint16_t s = (l > USB_TXBUFSZ) ? USB_TXBUFSZ : l; diff --git a/F1-nolib/chronometer/usb.h b/F1-nolib/chronometer/usb.h index 0d5831a..75d22b4 100644 --- a/F1-nolib/chronometer/usb.h +++ b/F1-nolib/chronometer/usb.h @@ -30,7 +30,7 @@ void USB_setup(); void usb_proc(); -void USB_send(char *buf); +void USB_send(const char *buf); int USB_receive(char *buf, int bufsize); int USB_configured(); diff --git a/F1-nolib/chronometer/usb_lib.c b/F1-nolib/chronometer/usb_lib.c index c45f3f2..0597aed 100644 --- a/F1-nolib/chronometer/usb_lib.c +++ b/F1-nolib/chronometer/usb_lib.c @@ -296,7 +296,10 @@ static uint16_t EP0_Handler(ep_t ep){ default: break; } - if(!dev2host) EP_WriteIRQ(0, (uint8_t *)0, 0); // write acknowledgement + // SET_CONTROL_LINE_STATE don't work! Need something to fix the BUG! + //if(!dev2host) + if(setup_packet.bRequest != GET_LINE_CODING) + EP_WriteIRQ(0, (uint8_t *)0, 0); // write acknowledgement epstatus = SET_VALID_RX(epstatus); epstatus = SET_VALID_TX(epstatus); break;