From 1242b8f9ff8b580252d15a00b5e46f4bbe2ccaaa Mon Sep 17 00:00:00 2001 From: eddyem Date: Thu, 18 Jul 2019 21:05:10 +0300 Subject: [PATCH] add trigger settings --- F1-nolib/chronometer/GPS.c | 2 +- F1-nolib/chronometer/GPS.h | 3 +- F1-nolib/chronometer/Readme.md | 1 + F1-nolib/chronometer/chrono.bin | Bin 12300 -> 14360 bytes F1-nolib/chronometer/flash.c | 18 +++++- F1-nolib/chronometer/flash.h | 7 ++- F1-nolib/chronometer/hardware.c | 99 ++++++++++++++++++++++++------ F1-nolib/chronometer/hardware.h | 23 +++++-- F1-nolib/chronometer/main.c | 32 +++++----- F1-nolib/chronometer/str.c | 103 +++++++++++++++++++++++++++++++- F1-nolib/chronometer/str.h | 13 ++++ F1-nolib/chronometer/time.c | 13 ++-- 12 files changed, 258 insertions(+), 56 deletions(-) diff --git a/F1-nolib/chronometer/GPS.c b/F1-nolib/chronometer/GPS.c index ad6cb66..65f218b 100644 --- a/F1-nolib/chronometer/GPS.c +++ b/F1-nolib/chronometer/GPS.c @@ -29,7 +29,7 @@ #define GPS_endline() do{usart_send(GPS_USART, "\r\n"); transmit_tbuf(GPS_USART); }while(0) #define GPS_send_string(str) do{usart_send(GPS_USART, str);}while(0) -gps_status GPS_status = GPS_WAIT; +gps_status GPS_status = GPS_NOTFOUND; int need2startseq = 1; static uint8_t hex(uint8_t n){ diff --git a/F1-nolib/chronometer/GPS.h b/F1-nolib/chronometer/GPS.h index 2feeef2..8545af5 100644 --- a/F1-nolib/chronometer/GPS.h +++ b/F1-nolib/chronometer/GPS.h @@ -28,7 +28,8 @@ extern int need2startseq; typedef enum{ - GPS_WAIT // wait for satellites + GPS_NOTFOUND // default status before first RMC message + ,GPS_WAIT // wait for satellites ,GPS_NOT_VALID // time known, but not valid ,GPS_VALID } gps_status; diff --git a/F1-nolib/chronometer/Readme.md b/F1-nolib/chronometer/Readme.md index 3bf8cfb..3c64c24 100644 --- a/F1-nolib/chronometer/Readme.md +++ b/F1-nolib/chronometer/Readme.md @@ -16,3 +16,4 @@ Chronometer for downhill competitions - PA14 - TRIG1 - button1/laser/etc (EXTI) - PA15 - USB pullup +- PB0,1,2 - free for other functions diff --git a/F1-nolib/chronometer/chrono.bin b/F1-nolib/chronometer/chrono.bin index 8577c2ea73439a997dd3e6596c01567e188c248b..c5f312d392a02c31e4b0ca9e79ef75d1aea14cdb 100755 GIT binary patch literal 14360 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 +#include "hardware.h" #define FLASH_BLOCK_SIZE (1024) #define FLASH_SIZE_REG ((uint32_t)0x1FFFF7E0) #define FLASH_SIZE *((uint16_t*)FLASH_SIZE_REG) -typedef struct{ +typedef struct __attribute__((packed)){ uint16_t userconf_sz; // "magick number" uint32_t dist_min; // minimal distance for LIDAR uint32_t dist_max; // maximal -//- + uint8_t trig_pullups; // trigger pullups: each bit ==0 to set OFF, ==1 to set ON pullup with given number + uint8_t trigstate; // level in `triggered` state + int32_t trigpause[TRIGGERS_AMOUNT]; // pause (ms) for false shots } user_conf; extern user_conf the_conf; void get_userconf(); int store_userconf(); + #ifdef EBUG void dump_userconf(); void addNrecs(int N); diff --git a/F1-nolib/chronometer/hardware.c b/F1-nolib/chronometer/hardware.c index 61f6630..49e5a9a 100644 --- a/F1-nolib/chronometer/hardware.c +++ b/F1-nolib/chronometer/hardware.c @@ -23,29 +23,66 @@ #include "adc.h" #include "hardware.h" +#include "flash.h" #include "time.h" #include "usart.h" +#include // memcpy + +// ports of triggers +GPIO_TypeDef *trigport[TRIGGERS_AMOUNT] = {GPIOA, GPIOA, GPIOA}; +// pins of triggers: PA13, PA14, PA4 +uint16_t trigpin[TRIGGERS_AMOUNT] = {1<<13, 1<<14, 1<<4}; +// value of pin in `triggered` state +uint8_t trigstate[TRIGGERS_AMOUNT]; +// time of triggers shot +trigtime shottime[TRIGGERS_AMOUNT]; +// Tms value when they shot +static uint32_t shotms[TRIGGERS_AMOUNT]; +// if trigger[N] shots, the bit N will be 1 +uint8_t trigger_shot = 0; + static inline void gpio_setup(){ // Enable clocks to the GPIO subsystems (PB for ADC), turn on AFIO clocking to disable SWD/JTAG RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN; // turn off SWJ/JTAG AFIO->MAPR = AFIO_MAPR_SWJ_CFG_DISABLE; - // pullups: PA1 - PPS, PA13/PA14 - buttons - GPIOA->ODR = (1<<12)|(1<<13)|(1<<14)|(1<<15); + // pullups: PA1 - PPS, PA15 - USB pullup + GPIOA->ODR = (1<<12)|(1<<15); // Set leds (PB8) as opendrain output GPIOB->CRH = CRH(8, CNF_ODOUTPUT|MODE_SLOW) | CRH(9, CNF_ODOUTPUT|MODE_SLOW); // PPS pin (PA1) - input with weak pullup GPIOA->CRL = CRL(1, CNF_PUDINPUT|MODE_INPUT); - // Set buttons (PA13/14) as inputs with weak pullups, USB pullup (PA15) - opendrain output - GPIOA->CRH = CRH(13, CNF_PUDINPUT|MODE_INPUT) | CRH(14, CNF_PUDINPUT|MODE_INPUT) | - CRH(15, CNF_ODOUTPUT|MODE_SLOW); + // Set USB pullup (PA15) - opendrain output + GPIOA->CRH = CRH(15, CNF_ODOUTPUT|MODE_SLOW); + // ---------------------> config-depengent block, interrupts & pullup inputs: + GPIOA->CRH |= CRH(13, CNF_PUDINPUT|MODE_INPUT) | CRH(14, CNF_PUDINPUT|MODE_INPUT); + GPIOA->CRL |= CRL(4, CNF_PUDINPUT|MODE_INPUT); + // <--------------------- // EXTI: all three EXTI are on PA -> AFIO_EXTICRx = 0 // interrupt on pulse front: buttons - 1->0, PPS - 0->1 - EXTI->IMR = EXTI_IMR_MR1 | EXTI_IMR_MR13 | EXTI_IMR_MR14; // unmask + EXTI->IMR = EXTI_IMR_MR1; EXTI->RTSR = EXTI_RTSR_TR1; // rising trigger - EXTI->FTSR = EXTI_FTSR_TR13 | EXTI_FTSR_TR14; // falling trigger + // PA4/PA13/PA14 - buttons + for(int i = 0; i < TRIGGERS_AMOUNT; ++i){ + uint16_t pin = trigpin[i]; + // fill trigstate array + uint8_t trgs = (the_conf.trigstate & (1<ODR |= pin; + EXTI->IMR |= pin; + if(trgs){ // triggered @1 -> rising interrupt + EXTI->RTSR |= pin; + }else{ // falling interrupt + EXTI->FTSR |= pin; + } + } + // ---------------------> config-depengent block, interrupts & pullup inputs: + // !!! change AFIO_EXTICRx if some triggers not @GPIOA + NVIC_EnableIRQ(EXTI4_IRQn); NVIC_EnableIRQ(EXTI15_10_IRQn); + // <--------------------- NVIC_EnableIRQ(EXTI1_IRQn); } @@ -94,25 +131,49 @@ void exti1_isr(){ // PPS - PA1 EXTI->PR = EXTI_PR_PR1; } +static trigtime trgtm; +static void savetrigtime(){ + trgtm.millis = Timer; + memcpy(&trgtm.Time, ¤t_time, sizeof(curtime)); +} + +static void fillshotms(int i){ + if(i < 0 || i > TRIGGERS_AMOUNT) return; + if(shotms[i] - Tms > (uint32_t)the_conf.trigpause[i]){ + shotms[i] = Tms; + memcpy(&shottime[i], &trgtm, sizeof(trigtime)); + trigger_shot |= 1<PR = EXTI_PR_PR4; +} + void exti15_10_isr(){ // PA13 - button0, PA14 - button1 + savetrigtime(); if(EXTI->PR & EXTI_PR_PR13){ - /* - if(trigger_ms[0] == DIDNT_TRIGGERED){ // prevent bounce - trigger_ms[0] = Timer; - memcpy(&trigger_time[0], ¤t_time, sizeof(curtime)); - } - */ + fillshotms(0); DBG("exti13"); EXTI->PR = EXTI_PR_PR13; } if(EXTI->PR & EXTI_PR_PR14){ - /* - if(trigger_ms[3] == DIDNT_TRIGGERED){ // prevent bounce - trigger_ms[3] = Timer; - memcpy(&trigger_time[3], ¤t_time, sizeof(curtime)); - } - */ + fillshotms(1); DBG("exti14"); EXTI->PR = EXTI_PR_PR14; } } + +/** + * @brief gettrig - get trigger state + * @return 1 if trigger active or 0 + */ +uint8_t gettrig(uint8_t N){ + if(N >= TRIGGERS_AMOUNT) return 0; + uint8_t curval = (trigport[N]->IDR & trigpin[N]) ? 1 : 0; + if(curval == trigstate[N]) return 1; + else return 0; +} diff --git a/F1-nolib/chronometer/hardware.h b/F1-nolib/chronometer/hardware.h index 00a3842..d392e39 100644 --- a/F1-nolib/chronometer/hardware.h +++ b/F1-nolib/chronometer/hardware.h @@ -25,6 +25,7 @@ #define __HARDWARE_H__ #include "stm32f1.h" +#include "time.h" // onboard LEDs - PB8/PB9 #define LED0_port GPIOB @@ -36,10 +37,14 @@ #define PPS_port GPIOA #define PPS_pin (1<<1) -// Buttons' state: PA13 (0)/PA14 (1) -#define GET_BTN0() ((GPIOA->IDR & (1<<13)) ? 0 : 1) -#define GET_BTN1() ((GPIOA->IDR & (1<<14)) ? 0 : 1) -#define GET_PPS() ((GPIOA->IDR & (1<<1)) ? 1 : 0) +// PPS and triggers state +// amount of triggers, should be less than 9 +#define TRIGGERS_AMOUNT (3) +extern GPIO_TypeDef *trigport[TRIGGERS_AMOUNT]; +extern uint16_t trigpin[TRIGGERS_AMOUNT]; +extern uint8_t trigstate[TRIGGERS_AMOUNT]; +uint8_t gettrig(uint8_t N); +#define GET_PPS() ((GPIOA->IDR & (1<<1)) ? 1 : 0) // USB pullup - PA15 #define USBPU_port GPIOA @@ -58,6 +63,16 @@ #define GPS_USART (2) #define LIDAR_USART (3) +typedef struct{ + uint32_t millis; + curtime Time; +} trigtime; + +// time of triggers shot +extern trigtime shottime[TRIGGERS_AMOUNT]; +// if trigger[N] shots, the bit N will be 1 +extern uint8_t trigger_shot; + void hw_setup(); #endif // __HARDWARE_H__ diff --git a/F1-nolib/chronometer/main.c b/F1-nolib/chronometer/main.c index cd68b43..f479409 100644 --- a/F1-nolib/chronometer/main.c +++ b/F1-nolib/chronometer/main.c @@ -71,7 +71,7 @@ void iwdg_setup(){ #ifdef EBUG char *parse_cmd(char *buf){ int32_t N; - static char btns[] = "BTN0=0, BTN1=0, PPS=0\n"; + static char btns[] = "BTN0=0, BTN1=0, BTN2=0, PPS=0\n"; switch(*buf){ case '0': LED_off(); @@ -80,9 +80,10 @@ char *parse_cmd(char *buf){ LED_on(); break; case 'b': - btns[5] = GET_BTN0() + '0'; - btns[13] = GET_BTN1() + '0'; - btns[20] = GET_PPS() + '0'; + btns[5] = gettrig(0) + '0'; + btns[13] = gettrig(1) + '0'; + btns[21] = gettrig(2) + '0'; + btns[28] = GET_PPS() + '0'; return btns; break; case 'C': @@ -177,11 +178,14 @@ int main(void){ uint32_t lastT = 0; sysreset(); StartHSE(); - hw_setup(); LED1_off(); USBPU_OFF(); - usarts_setup(); SysTick_Config(SYSTICK_DEFCONF); // function SysTick_Config decrements argument! + // read data stored in flash + get_userconf(); + // !!! hw_setup() should be the first in setup stage + hw_setup(); + usarts_setup(); SEND("Chronometer version " VERSION ".\n"); if(RCC->CSR & RCC_CSR_IWDGRSTF){ // watchdog reset occured SEND("WDGRESET=1\n"); @@ -194,17 +198,6 @@ int main(void){ USB_setup(); iwdg_setup(); USBPU_ON(); - // read data stored in flash -#ifdef EBUG - SEND("Old config:\n"); - dump_userconf(); -#endif - //writeatend(); - get_userconf(); -#ifdef EBUG - SEND("New config:\n"); - dump_userconf(); -#endif while (1){ IWDG->KR = IWDG_REFRESH; // refresh watchdog @@ -227,6 +220,7 @@ int main(void){ transmit_tbuf(GPS_USART); transmit_tbuf(LIDAR_USART); } + if(trigger_shot) show_trigger_shot(trigger_shot); usb_proc(); int r = 0; char *txt; @@ -258,6 +252,10 @@ 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 f22cc17..7d89339 100644 --- a/F1-nolib/chronometer/str.c +++ b/F1-nolib/chronometer/str.c @@ -22,6 +22,9 @@ #include "usart.h" #include "usb.h" +// flag to show new GPS message over USB +uint8_t showGPSstr = 0; + /** * @brief cmpstr - the same as strncmp * @param s1,s2 - strings to compare @@ -30,9 +33,14 @@ */ int cmpstr(const char *s1, const char *s2, int n){ int ret = 0; - do{ + while(--n){ ret = *s1 - *s2; - }while(*s1++ && *s2++ && --n); + if(ret == 0 && *s1 && *s2){ + ++s1; ++s2; + continue; + } + break; + } return ret; } @@ -49,6 +57,23 @@ char *getchr(const char *str, char symbol){ return NULL; } +/** + * @brief showuserconf - show configuration over USB + */ +static void showuserconf(){ + USB_send("\nCONFIG:\nDISTMIN="); USB_send(u2str(the_conf.dist_min)); + USB_send("\nDISTMAX="); USB_send(u2str(the_conf.dist_max)); + USB_send("\nPULLUPS="); USB_send(u2str(the_conf.trig_pullups)); + USB_send("\nTRIGLVL="); USB_send(u2str(the_conf.trigstate)); + USB_send("\nTRIGPAUSE={"); + for(int i = 0; i < TRIGGERS_AMOUNT; ++i){ + if(i) USB_send(", "); + USB_send(u2str(the_conf.trigpause[i])); + } + USB_send("}"); + USB_send("\nENDCONFIG\n"); +} + /** * @brief parse_USBCMD - parsing of string buffer got by USB * @param cmd - buffer with commands @@ -61,12 +86,19 @@ int parse_USBCMD(char *cmd){ uint8_t succeed = 0; int32_t N; if(!cmd || !*cmd) return 0; + IWDG->KR = IWDG_REFRESH; if(*cmd == '?'){ // help USB_send("Commands:\n" CMD_DISTMIN " - min distance threshold (cm)\n" CMD_DISTMAX " - max distance threshold (cm)\n" + CMD_GPSSTR " - current GPS data string\n" + CMD_PULLUP "NS - triggers pullups state (N - trigger No, S - 0/1 for off/on)\n" + CMD_SHOWCONF " - show current configuration\n" CMD_PRINTTIME " - print time\n" CMD_STORECONF " - store new configuration in flash\n" + CMD_TRIGLVL "NS - working trigger N level S\n" + CMD_TRGPAUSE "NP - pause (P, ms) after trigger N shots\n" + CMD_TRGTIME "N - show last trigger N time\n" ); }else if(CMP(cmd, CMD_PRINTTIME) == 0){ USB_send(get_time(¤t_time, get_millis())); @@ -98,10 +130,77 @@ int parse_USBCMD(char *cmd){ succeed = 1; } } + }else if(CMP(cmd, CMD_GPSSTR) == 0){ // show GPS status string + showGPSstr = 1; + return 0; + }else if(CMP(cmd, CMD_PULLUP) == 0){ + DBG("Pullups"); + cmd += sizeof(CMD_PULLUP) - 1; + uint8_t Nt = *cmd++ - '0'; + if(Nt > TRIGGERS_AMOUNT - 1) goto bad_number; + uint8_t state = *cmd -'0'; + if(state > 1) goto bad_number; + uint8_t oldval = the_conf.trig_pullups; + if(!state) the_conf.trig_pullups = oldval & ~(1< TRIGGERS_AMOUNT - 1) goto bad_number; + uint8_t state = *cmd -'0'; + if(state > 1) goto bad_number; + uint8_t oldval = the_conf.trigstate; + if(!state) the_conf.trigstate = oldval & ~(1< TRIGGERS_AMOUNT - 1) goto bad_number; + if(getnum(cmd, &N)) goto bad_number; + if(N < 0 || N > 10000) goto bad_number; + if(the_conf.trigpause[Nt] != N) conf_modified = 1; + the_conf.trigpause[Nt] = N; + succeed = 1; + }else if(CMP(cmd, CMD_TRGTIME) == 0){ + DBG("Trigger time"); + cmd += sizeof(CMD_TRGTIME) - 1; + uint8_t Nt = *cmd++ - '0'; + if(Nt > TRIGGERS_AMOUNT - 1) goto bad_number; + show_trigger_shot((uint8_t)1<KR = IWDG_REFRESH; if(succeed) USB_send("Success!\n"); return 0; bad_number: USB_send("Error: bad number!\n"); return 0; } + +/** + * @brief show_trigger_shot - print on USB message about last trigger shot time + * @param tshot - each bit consists information about trigger + */ +void show_trigger_shot(uint8_t tshot){ + uint8_t X = 1; + for(int i = 0; i < TRIGGERS_AMOUNT && tshot; ++i, X <<= 1){ + IWDG->KR = IWDG_REFRESH; + if(tshot & X) tshot &= ~X; + else continue; + if(trigger_shot & X) trigger_shot &= ~X; + USB_send("TRIG"); + USB_send(u2str(i)); + USB_send("="); + USB_send(get_time(&shottime[i].Time, shottime[i].millis)); + USB_send("\n"); + } +} diff --git a/F1-nolib/chronometer/str.h b/F1-nolib/chronometer/str.h index 95d86ea..7f06f47 100644 --- a/F1-nolib/chronometer/str.h +++ b/F1-nolib/chronometer/str.h @@ -19,6 +19,9 @@ #ifndef STR_H__ #define STR_H__ +#include "stm32f1.h" +#include "hardware.h" + // usb commands // lower and upper limits to capture #define CMD_DISTMIN "distmin" @@ -29,8 +32,18 @@ #define CMD_ADC2MAX "adc2max" #define CMD_PRINTTIME "time" #define CMD_STORECONF "store" +#define CMD_GPSSTR "gpsstring" +#define CMD_PULLUP "pullup" +#define CMD_SHOWCONF "showconf" +#define CMD_TRIGLVL "triglevel" +#define CMD_TRGPAUSE "trigpause" +#define CMD_TRGTIME "trigtime" + +extern uint8_t showGPSstr; int cmpstr(const char *s1, const char *s2, int n); char *getchr(const char *str, char symbol); int parse_USBCMD(char *cmd); +void show_trigger_shot(uint8_t trigger_shot); + #endif // STR_H__ diff --git a/F1-nolib/chronometer/time.c b/F1-nolib/chronometer/time.c index 64908ba..1eef0c3 100644 --- a/F1-nolib/chronometer/time.c +++ b/F1-nolib/chronometer/time.c @@ -72,15 +72,8 @@ void time_increment(){ char *get_time(curtime *Tm, uint32_t T){ static char buf[64]; char *bstart = &buf[5], *bptr = bstart; - /* - void putint(int i){ // put integer from 0 to 99 into buffer with leading zeros - if(i > 9){ - *bptr++ = i/10 + '0'; - i = i%10; - }else *bptr++ = '0'; - *bptr++ = i + '0'; - }*/ int S = 0; + if(T > 999) return "Wrong time"; if(Tm->S < 60 && Tm->M < 60 && Tm->H < 24) S = Tm->S + Tm->H*3600 + Tm->M*60; // seconds from day beginning if(!S) *(--bstart) = '0'; @@ -107,6 +100,10 @@ char *get_time(curtime *Tm, uint32_t T){ strcpy(bptr, " need PPS sync"); bptr += 14; } + if(GPS_status == GPS_NOTFOUND){ + strcpy(bptr, " GPS not found"); + bptr += 14; + } *bptr++ = '\n'; *bptr = 0; return bstart;