From 1c4c7d96365b53e667c66162d4b0faf5e07449c0 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Fri, 10 Sep 2021 12:06:01 +0300 Subject: [PATCH] usbcan_relay: add standalone buttons reactions --- F0-nolib/CANbus_stepper/src/canstepper.bin | Bin F0-nolib/Chiller/chiller.bin | Bin F0-nolib/F0_testbrd/pl2303.bin | Bin F0-nolib/QuadEncoder/encoder.bin | Bin F0-nolib/Servo/servo.bin | Bin F0-nolib/Socket_fans/sockfans.bin | Bin F0-nolib/TM1637/tm1637.bin | Bin F0-nolib/USBHID/usbhid.bin | Bin F0-nolib/USB_pl2303_snippet/usb.bin | Bin F0-nolib/blink/blink.bin | Bin F0-nolib/canbus/src/canbus.bin | Bin F0-nolib/htu21d_nucleo/usart.bin | Bin F0-nolib/inc/F0 | 2 +- F0-nolib/inc/cm/core_cmFunc.h | 2 +- F0-nolib/morze/morze.bin | Bin F0-nolib/pl2303/pl2303.bin | Bin F0-nolib/tsys01_nucleo/tsys01.bin | Bin F0-nolib/uart_blink/uartblink.bin | Bin F0-nolib/uart_blink_dma/uartblink.bin | Bin F0-nolib/uart_nucleo/usart.bin | Bin F0-nolib/usbcan/can.c | 31 +- F0-nolib/usbcan/main.c | 33 +- F0-nolib/usbcan/usbcan.bin | Bin 11956 -> 11592 bytes F0-nolib/usbcan_relay/Readme.md | 10 + F0-nolib/usbcan_relay/buttons.c | 9 + F0-nolib/usbcan_relay/buttons.h | 1 + F0-nolib/usbcan_relay/can.c | 12 +- F0-nolib/usbcan_relay/canproto.c | 22 +- F0-nolib/usbcan_relay/canproto.h | 2 +- F0-nolib/usbcan_relay/custom_buttons.c | 67 ++++ F0-nolib/usbcan_relay/custom_buttons.h | 25 ++ F0-nolib/usbcan_relay/hardware.h | 4 + F0-nolib/usbcan_relay/main.c | 29 +- F0-nolib/usbcan_relay/usbcan.bin | Bin 15448 -> 15292 bytes F0/blink/blink.bin | Bin F0/uart/uart.bin | Bin F1-nolib/BMP180/BMP180.bin | Bin F1-nolib/BMP280/BMP280.bin | Bin F1-nolib/CDC_ACM/cdcacm.bin | Bin F1-nolib/DHT22_DHT11/DHT22.bin | Bin F1-nolib/DS18/DS18.bin | Bin F1-nolib/F1_testbrd/pl2303.bin | Bin F1-nolib/I2Cscan/I2Cscan.bin | Bin F1-nolib/LED_Screen/LEDscreen.bin | Bin F1-nolib/LED_Screen/genlist | 0 F1-nolib/LED_Screen/scrtest/scrtest | Bin F1-nolib/MAX7219_screen/MAX7219.bin | Bin F1-nolib/PL2303/pl2303.bin | Bin F1-nolib/RGB_LED_Screen/RGBLEDscreen.bin | Bin F1-nolib/RGB_LED_Screen/getrand | 0 F1-nolib/RGB_LED_Screen/proto.c | 302 +----------------- F1-nolib/SI7005_HTU21D/si7005.bin | Bin F1-nolib/SPI/SPI.bin | Bin F1-nolib/SevenCDCs/cdcacmcore.bin | Bin F1-nolib/Tetris/TETRIS.bin | Bin F1-nolib/Tetris/getrand | 0 F1-nolib/Tetris/main.c | 194 +---------- F1-nolib/USB_HID/usbhid103.bin | Bin F1-nolib/chronometer/chrono.bin | Bin F1-nolib/chronometer_v2/chrono.bin | Bin F1-nolib/chronometer_v3/chrono.bin | Bin F1-nolib/inc/cm/core_cmFunc.h | 2 +- F1-nolib/led_blink/blink.bin | Bin F1-nolib/pl2303_snippet/pl2303.bin | Bin F1-nolib/pl2303_snippet_naked/pl2303.bin | Bin F1-nolib/pwmdmatest/pwmtest.bin | Bin F1-nolib/pwmtest/pwmtest.bin | Bin F1-nolib/uart/uart.bin | Bin F1-nolib/ws2815/ws2815.bin | Bin F1/1_wire/onewire.bin | Bin F1/2.8TFT/dma_gpio.bin | Bin F1/DMA_GPIO/dma_gpio.bin | Bin F1/GPIO_TIM/tim_gpio.bin | Bin F1/GPS+ultrasonic/timelapse.bin | Bin F1/GPS/GPS.bin | Bin F1/Jeep_generator/jeep_generator.bin | Bin F1/Timelapse_keyboard/timelapse.bin | Bin .../timelapse.bin | Bin F1/USBCDC_template/usb_cdc_simple.bin | Bin F1/canon_lens/canon_lens.bin | Bin F1/distance_meters/ultrasonic.bin | Bin F1/hid_mouse_keyboard/usbhid.bin | Bin F1/keyboard_snippet/keyboard.bin | Bin F1/matrix_keyboard/matrkeyb.bin | Bin F1/nokia5110/nokia5110.bin | Bin F1/simple_cdc/usb_cdc_simple.bin | Bin F1/stepper_motion/usb_cdc_simple.bin | Bin F1/ultrasonic/ultrasonic.bin | Bin F303-nolib/blink/blink.bin | Bin F303-nolib/usart1/usart1.bin | Bin F303-nolib/usarts/usart.bin | Bin 91 files changed, 200 insertions(+), 547 deletions(-) mode change 100755 => 100644 F0-nolib/CANbus_stepper/src/canstepper.bin mode change 100755 => 100644 F0-nolib/Chiller/chiller.bin mode change 100755 => 100644 F0-nolib/F0_testbrd/pl2303.bin mode change 100755 => 100644 F0-nolib/QuadEncoder/encoder.bin mode change 100755 => 100644 F0-nolib/Servo/servo.bin mode change 100755 => 100644 F0-nolib/Socket_fans/sockfans.bin mode change 100755 => 100644 F0-nolib/TM1637/tm1637.bin mode change 100755 => 100644 F0-nolib/USBHID/usbhid.bin mode change 100755 => 100644 F0-nolib/USB_pl2303_snippet/usb.bin mode change 100644 => 100755 F0-nolib/blink/blink.bin mode change 100755 => 100644 F0-nolib/canbus/src/canbus.bin mode change 100755 => 100644 F0-nolib/htu21d_nucleo/usart.bin mode change 100755 => 100644 F0-nolib/morze/morze.bin mode change 100755 => 100644 F0-nolib/pl2303/pl2303.bin mode change 100755 => 100644 F0-nolib/tsys01_nucleo/tsys01.bin mode change 100755 => 100644 F0-nolib/uart_blink/uartblink.bin mode change 100755 => 100644 F0-nolib/uart_blink_dma/uartblink.bin mode change 100755 => 100644 F0-nolib/uart_nucleo/usart.bin create mode 100644 F0-nolib/usbcan_relay/custom_buttons.c create mode 100644 F0-nolib/usbcan_relay/custom_buttons.h mode change 100755 => 100644 F0/blink/blink.bin mode change 100755 => 100644 F0/uart/uart.bin mode change 100755 => 100644 F1-nolib/BMP180/BMP180.bin mode change 100755 => 100644 F1-nolib/BMP280/BMP280.bin mode change 100755 => 100644 F1-nolib/CDC_ACM/cdcacm.bin mode change 100755 => 100644 F1-nolib/DHT22_DHT11/DHT22.bin mode change 100755 => 100644 F1-nolib/DS18/DS18.bin mode change 100755 => 100644 F1-nolib/F1_testbrd/pl2303.bin mode change 100755 => 100644 F1-nolib/I2Cscan/I2Cscan.bin mode change 100755 => 100644 F1-nolib/LED_Screen/LEDscreen.bin mode change 100755 => 100644 F1-nolib/LED_Screen/genlist mode change 100755 => 100644 F1-nolib/LED_Screen/scrtest/scrtest mode change 100755 => 100644 F1-nolib/MAX7219_screen/MAX7219.bin mode change 100755 => 100644 F1-nolib/PL2303/pl2303.bin mode change 100755 => 100644 F1-nolib/RGB_LED_Screen/RGBLEDscreen.bin mode change 100755 => 100644 F1-nolib/RGB_LED_Screen/getrand mode change 100644 => 120000 F1-nolib/RGB_LED_Screen/proto.c mode change 100755 => 100644 F1-nolib/SI7005_HTU21D/si7005.bin mode change 100755 => 100644 F1-nolib/SPI/SPI.bin mode change 100755 => 100644 F1-nolib/SevenCDCs/cdcacmcore.bin mode change 100755 => 100644 F1-nolib/Tetris/TETRIS.bin mode change 100755 => 100644 F1-nolib/Tetris/getrand mode change 100644 => 120000 F1-nolib/Tetris/main.c mode change 100755 => 100644 F1-nolib/USB_HID/usbhid103.bin mode change 100644 => 100755 F1-nolib/chronometer/chrono.bin mode change 100755 => 100644 F1-nolib/chronometer_v2/chrono.bin mode change 100755 => 100644 F1-nolib/chronometer_v3/chrono.bin mode change 100755 => 100644 F1-nolib/led_blink/blink.bin mode change 100755 => 100644 F1-nolib/pl2303_snippet/pl2303.bin mode change 100755 => 100644 F1-nolib/pl2303_snippet_naked/pl2303.bin mode change 100755 => 100644 F1-nolib/pwmdmatest/pwmtest.bin mode change 100755 => 100644 F1-nolib/pwmtest/pwmtest.bin mode change 100755 => 100644 F1-nolib/uart/uart.bin mode change 100755 => 100644 F1-nolib/ws2815/ws2815.bin mode change 100755 => 100644 F1/1_wire/onewire.bin mode change 100755 => 100644 F1/2.8TFT/dma_gpio.bin mode change 100755 => 100644 F1/DMA_GPIO/dma_gpio.bin mode change 100755 => 100644 F1/GPIO_TIM/tim_gpio.bin mode change 100755 => 100644 F1/GPS+ultrasonic/timelapse.bin mode change 100755 => 100644 F1/GPS/GPS.bin mode change 100755 => 100644 F1/Jeep_generator/jeep_generator.bin mode change 100755 => 100644 F1/Timelapse_keyboard/timelapse.bin mode change 100755 => 100644 F1/Timelapse_keyboard_only_lasers/timelapse.bin mode change 100755 => 100644 F1/USBCDC_template/usb_cdc_simple.bin mode change 100755 => 100644 F1/canon_lens/canon_lens.bin mode change 100755 => 100644 F1/distance_meters/ultrasonic.bin mode change 100755 => 100644 F1/hid_mouse_keyboard/usbhid.bin mode change 100755 => 100644 F1/keyboard_snippet/keyboard.bin mode change 100755 => 100644 F1/matrix_keyboard/matrkeyb.bin mode change 100755 => 100644 F1/nokia5110/nokia5110.bin mode change 100755 => 100644 F1/simple_cdc/usb_cdc_simple.bin mode change 100755 => 100644 F1/stepper_motion/usb_cdc_simple.bin mode change 100755 => 100644 F1/ultrasonic/ultrasonic.bin mode change 100755 => 100644 F303-nolib/blink/blink.bin mode change 100755 => 100644 F303-nolib/usart1/usart1.bin mode change 100755 => 100644 F303-nolib/usarts/usart.bin diff --git a/F0-nolib/CANbus_stepper/src/canstepper.bin b/F0-nolib/CANbus_stepper/src/canstepper.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/Chiller/chiller.bin b/F0-nolib/Chiller/chiller.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/F0_testbrd/pl2303.bin b/F0-nolib/F0_testbrd/pl2303.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/QuadEncoder/encoder.bin b/F0-nolib/QuadEncoder/encoder.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/Servo/servo.bin b/F0-nolib/Servo/servo.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/Socket_fans/sockfans.bin b/F0-nolib/Socket_fans/sockfans.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/TM1637/tm1637.bin b/F0-nolib/TM1637/tm1637.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/USBHID/usbhid.bin b/F0-nolib/USBHID/usbhid.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/USB_pl2303_snippet/usb.bin b/F0-nolib/USB_pl2303_snippet/usb.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/blink/blink.bin b/F0-nolib/blink/blink.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/canbus/src/canbus.bin b/F0-nolib/canbus/src/canbus.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/htu21d_nucleo/usart.bin b/F0-nolib/htu21d_nucleo/usart.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/inc/F0 b/F0-nolib/inc/F0 index ba957c0..0be4819 120000 --- a/F0-nolib/inc/F0 +++ b/F0-nolib/inc/F0 @@ -1 +1 @@ -/home/eddy/Yandex.Disk/Projects/stm32samples/F0-nolib/inc/Fx \ No newline at end of file +Fx \ No newline at end of file diff --git a/F0-nolib/inc/cm/core_cmFunc.h b/F0-nolib/inc/cm/core_cmFunc.h index a1bd88c..bdc54e6 100644 --- a/F0-nolib/inc/cm/core_cmFunc.h +++ b/F0-nolib/inc/cm/core_cmFunc.h @@ -453,7 +453,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void) */ __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) { - __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp"); + __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack)); } diff --git a/F0-nolib/morze/morze.bin b/F0-nolib/morze/morze.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/pl2303/pl2303.bin b/F0-nolib/pl2303/pl2303.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/tsys01_nucleo/tsys01.bin b/F0-nolib/tsys01_nucleo/tsys01.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/uart_blink/uartblink.bin b/F0-nolib/uart_blink/uartblink.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/uart_blink_dma/uartblink.bin b/F0-nolib/uart_blink_dma/uartblink.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/uart_nucleo/usart.bin b/F0-nolib/uart_nucleo/usart.bin old mode 100755 new mode 100644 diff --git a/F0-nolib/usbcan/can.c b/F0-nolib/usbcan/can.c index 3e1868d..173f917 100644 --- a/F0-nolib/usbcan/can.c +++ b/F0-nolib/usbcan/can.c @@ -48,14 +48,25 @@ CAN_status CAN_get_status(){ #ifdef EBUG if(st == CAN_FIFO_OVERRUN) MSG("fifo 0 overrun\n"); #endif - if(st == CAN_FIFO_OVERRUN) can_status = CAN_READY; + if(st == CAN_FIFO_OVERRUN){ + SEND("FIFO overrun\n"); + can_status = CAN_READY; + } return st; } // push next message into buffer; return 1 if buffer overfull static int CAN_messagebuf_push(CAN_message *msg){ //MSG("Try to push\n"); - if(first_free_idx == first_nonfree_idx) return 1; // no free space +#ifdef EBUG + SEND("push\n"); +#endif + if(first_free_idx == first_nonfree_idx){ +#ifdef EBUG + SEND("INBUF OVERFULL\n"); +#endif + return 1; // no free space + } if(first_nonfree_idx < 0) first_nonfree_idx = 0; // first message in empty buffer memcpy(&messages[first_free_idx++], msg, sizeof(CAN_message)); // need to roll? @@ -155,7 +166,7 @@ void CAN_setup(uint16_t speed){ CAN->sFilterRegister[0].FR1 = (1<<21)|(1<<5); // all odd IDs CAN->FFA1R = 2; // filter 1 for FIFO1, filter 0 - for FIFO0 CAN->sFilterRegister[1].FR1 = (1<<21); // all even IDs - CAN->FMR &=~ CAN_FMR_FINIT; /* (12) */ + CAN->FMR &= ~CAN_FMR_FINIT; /* (12) */ CAN->IER |= CAN_IER_ERRIE | CAN_IER_FOVIE0 | CAN_IER_FOVIE1; /* (13) */ /* Configure IT */ @@ -202,8 +213,8 @@ void can_proc(){ case 7: errmsg = "(set by software)"; break; } SEND(errmsg); SEND(" error\n"); - if(CAN->ESR & CAN_ESR_BOFF) SEND("Bus off"); - if(CAN->ESR & CAN_ESR_EPVF) SEND("Passive error limit"); + if(CAN->ESR & CAN_ESR_BOFF) SEND("Bus off "); + if(CAN->ESR & CAN_ESR_EPVF) SEND("Passive error limit "); if(CAN->ESR & CAN_ESR_EWGF) SEND("Error counter limit"); NL(); // request abort for all mailboxes @@ -287,6 +298,9 @@ static void can_process_fifo(uint8_t fifo_num){ LED_on(LED1); // Turn on LED1 - message received CAN_FIFOMailBox_TypeDef *box = &CAN->sFIFOMailBox[fifo_num]; volatile uint32_t *RFxR = (fifo_num) ? &CAN->RF1R : &CAN->RF0R; +#ifdef EBUG + printu(*RFxR & CAN_RF0R_FMP0); SEND(" messages in FIFO\n"); +#endif // read all while(*RFxR & CAN_RF0R_FMP0){ // amount of messages pending // CAN_RDTxR: (16-31) - timestamp, (8-15) - filter match index, (0-3) - data length @@ -334,6 +348,13 @@ static void can_process_fifo(uint8_t fifo_num){ } void cec_can_isr(){ + /* + if(CAN->RF0R & CAN_RF0R_FOVR0){ + can_process_fifo(0); + } + if(CAN->RF1R & CAN_RF1R_FOVR1){ + can_process_fifo(1); + }*/ if(CAN->RF0R & CAN_RF0R_FOVR0){ // FIFO overrun CAN->RF0R &= ~CAN_RF0R_FOVR0; can_status = CAN_FIFO_OVERRUN; diff --git a/F0-nolib/usbcan/main.c b/F0-nolib/usbcan/main.c index 8a6decc..e1bea7e 100644 --- a/F0-nolib/usbcan/main.c +++ b/F0-nolib/usbcan/main.c @@ -76,7 +76,9 @@ int main(void){ USB_setup(); CAN_setup(100); RCC->CSR |= RCC_CSR_RMVF; // remove reset flags +#ifndef EBUG iwdg_setup(); +#endif while (1){ IWDG->KR = IWDG_REFRESH; // refresh watchdog @@ -90,22 +92,23 @@ int main(void){ SEND("CAN bus fifo overrun occured!\n"); sendbuf(); } - can_mesg = CAN_messagebuf_pop(); - if(can_mesg && isgood(can_mesg->ID)){ - LED_on(LED0); - lastT = Tms; - if(!lastT) lastT = 1; - if(ShowMsgs){ // new data in buff - IWDG->KR = IWDG_REFRESH; - len = can_mesg->length; - printu(Tms); - SEND(" #"); - printuhex(can_mesg->ID); - for(ctr = 0; ctr < len; ++ctr){ - SEND(" "); - printuhex(can_mesg->data[ctr]); + while((can_mesg = CAN_messagebuf_pop())){ + if(can_mesg && isgood(can_mesg->ID)){ + LED_on(LED0); + lastT = Tms; + if(!lastT) lastT = 1; + if(ShowMsgs){ // new data in buff + IWDG->KR = IWDG_REFRESH; + len = can_mesg->length; + printu(Tms); + SEND(" #"); + printuhex(can_mesg->ID); + for(ctr = 0; ctr < len; ++ctr){ + SEND(" "); + printuhex(can_mesg->data[ctr]); + } + newline(); sendbuf(); } - newline(); sendbuf(); } } if((txt = get_USB())){ diff --git a/F0-nolib/usbcan/usbcan.bin b/F0-nolib/usbcan/usbcan.bin index cb484e6c56abbef9cedb046d0b3456d88db8b31d..707e7c5bd83373e08cb76279bf9fb76ce8122b2e 100755 GIT binary patch delta 6866 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 z6?iQhevent){ k->lastTms = Tms; + lastUnsleep = Tms; } } } @@ -79,3 +82,9 @@ keyevent keystate(uint8_t k, uint32_t *T){ if(T) *T = allkeys[k].lastTms; return evt; } + +// getter of keyevent for allkeys[] +keyevent keyevt(uint8_t k){ + if(k >= BTNSNO) return EVT_NONE; + return allkeys[k].event; +} diff --git a/F0-nolib/usbcan_relay/buttons.h b/F0-nolib/usbcan_relay/buttons.h index 7906e72..79c5c47 100644 --- a/F0-nolib/usbcan_relay/buttons.h +++ b/F0-nolib/usbcan_relay/buttons.h @@ -37,6 +37,7 @@ extern uint32_t lastUnsleep; // last keys activity time void process_keys(); keyevent keystate(uint8_t k, uint32_t *T); +keyevent keyevt(uint8_t k); #define BUTTONS_H__ #endif // BUTTONS_H__ diff --git a/F0-nolib/usbcan_relay/can.c b/F0-nolib/usbcan_relay/can.c index a51641c..24bc8d5 100644 --- a/F0-nolib/usbcan_relay/can.c +++ b/F0-nolib/usbcan_relay/can.c @@ -27,7 +27,7 @@ static CAN_message messages[CAN_INMESSAGE_SIZE]; static uint8_t first_free_idx = 0; // index of first empty cell static int8_t first_nonfree_idx = -1; // index of first data cell -static uint16_t oldspeed = 100; // speed of last init +static uint16_t oldspeed = DEFAULT_CAN_SPEED; // speed of last init #ifdef EBUG static uint32_t last_err_code = 0; @@ -42,10 +42,6 @@ static CAN_message *flood_msg = NULL; // == loc_flood_msg - to flood CAN_status CAN_get_status(){ CAN_status st = can_status; - // give overrun message only once -#ifdef EBUG - if(st == CAN_FIFO_OVERRUN) MSG("fifo 0 overrun\n"); -#endif if(st == CAN_FIFO_OVERRUN) can_status = CAN_READY; return st; } @@ -214,9 +210,7 @@ CAN_status can_send(uint8_t *msg, uint8_t len, uint16_t target_id){ if(CAN->TSR & (CAN_TSR_TME)){ mailbox = (CAN->TSR & CAN_TSR_CODE) >> 24; }else{ // no free mailboxes -#ifdef EBUG - MSG("No free mailboxes"); NL(); -#endif + //SEND("No free mailboxes"); NL(); return CAN_BUSY; } #ifdef EBUG @@ -313,7 +307,7 @@ static void can_process_fifo(uint8_t fifo_num){ } } if(msg.ID == CANID) parseCANcommand(&msg); - else if(CAN_messagebuf_push(&msg)) return; // error: buffer is full, try later + if(CAN_messagebuf_push(&msg)) return; // error: buffer is full, try later *RFxR |= CAN_RF0R_RFOM0; // release fifo for access to next message } //if(*RFxR & CAN_RF0R_FULL0) *RFxR &= ~CAN_RF0R_FULL0; diff --git a/F0-nolib/usbcan_relay/canproto.c b/F0-nolib/usbcan_relay/canproto.c index cc0d1c5..46ab9c2 100644 --- a/F0-nolib/usbcan_relay/canproto.c +++ b/F0-nolib/usbcan_relay/canproto.c @@ -36,7 +36,7 @@ * CAN_CMD_LED: data[1] = LEDs state (bits 0..3 for LEDs number 0..3) * CAN_CMD_MCU: data[2,3] = int16_t MCUT*10, data[4,5] = uint16_t Vdd*100 (LITTLE endian!) * CAN_CMD_PWM: data[1..3] = pwm value for each channel (0..2) - * CAN_CMD_RELAY: data[0] = (bits 0 & 1) - state of relay N] + * CAN_CMD_RELAY: data[1] = (bits 0 & 1) - state of relay N] * CAN_CMD_TMS: data[4..7] = Tms (LITTLE endian!) */ @@ -56,13 +56,19 @@ TRUE_INLINE uint8_t ADCget(uint8_t values[8]){ TRUE_INLINE void BTNSget(uint8_t values[8]){ uint32_t T; - for(uint8_t i = 0; i < BTNSNO; ++i){ + uint8_t start = 0, stop = BTNSNO; + if(values[1] < BTNSNO){ // check only one button + start = values[1]; stop = start + 1; + } + for(uint8_t i = start; i < stop; ++i){ values[1] = i; values[2] = keystate(i, &T); values[3] = 0; *((uint32_t*)&values[4]) = T; - int N = 1000; - while(CAN_BUSY == can_send(values, 8, OUTPID)) if(--N == 0) break; + T = Tms; + while(CAN_BUSY == can_send(values, 8, OUTPID)){ + if(Tms - T > 5) break; + } } } @@ -141,22 +147,24 @@ void parseCANcommand(CAN_message *msg){ len = ADCget(outpdata); break; case CAN_CMD_BTNS: + if(msg->length == 2) outpdata[1] = msg->data[1]; // check only one button + else outpdata[1] = BTNSNO; BTNSget(outpdata); return; break; case CAN_CMD_LED: - if(setter) LEDSset(msg->data); + if(setter && msg->length > 1) LEDSset(msg->data); len = LEDSget(outpdata); break; case CAN_CMD_MCU: len = MCUget(outpdata); break; case CAN_CMD_PWM: - if(setter) PWMset(msg->data); + if(setter && msg->length > 3) PWMset(msg->data); len = PWMget(outpdata); break; case CAN_CMD_RELAY: - if(setter) Rset(msg->data); + if(setter && msg->length > 1) Rset(msg->data); len = Rget(outpdata); break; case CAN_CMD_TMS: diff --git a/F0-nolib/usbcan_relay/canproto.h b/F0-nolib/usbcan_relay/canproto.h index 2de8898..433f100 100644 --- a/F0-nolib/usbcan_relay/canproto.h +++ b/F0-nolib/usbcan_relay/canproto.h @@ -40,7 +40,7 @@ typedef enum{ } CAN_commands; // output messages identifier -#define OUTPID (CANID + 0x100) +#define OUTPID (CANID) void parseCANcommand(CAN_message *msg); diff --git a/F0-nolib/usbcan_relay/custom_buttons.c b/F0-nolib/usbcan_relay/custom_buttons.c new file mode 100644 index 0000000..8a4b241 --- /dev/null +++ b/F0-nolib/usbcan_relay/custom_buttons.c @@ -0,0 +1,67 @@ +/* + * This file is part of the canrelay project. + * Copyright 2021 Edward V. Emelianov . + * + * 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 . + */ + +// custom standalone buttons reaction + +#include +#include "buttons.h" +#include "custom_buttons.h" +#include "hardware.h" + + +/* + * check buttons, on long press of button: + * 1 - switch relay1 + * 2 - switch relay2 + * 3 - work with PWM out 0 (when btn3 pressed, btn1 increased & btn2 decreased PWM width) + * press once btn2/3 to change PWM @1, hold to change @25 (repeat as many times as need) + */ +void custom_buttons_process(){ + static uint32_t lastT = 0; + static uint8_t pwmval = 127; + static uint8_t trig = 0; // == 1 if given btn3 was off + if(lastUnsleep == lastT) return; // no buttons activity + lastT = lastUnsleep; + if(keyevt(3) == EVT_HOLD){ // PWM + if(keyevt(2) == EVT_HOLD){ // decrease PWM by 25 + if(pwmval > 25) pwmval -= 25; + else pwmval = 0; + }else if(keyevt(2) == EVT_PRESS){ // decrease PWM by 1 + if(pwmval > 0) --pwmval; + }else if(keyevt(1) == EVT_HOLD){ // increase PWM by 25 + if(pwmval < 230) pwmval += 25; + else pwmval = 255; + }else if(keyevt(1) == EVT_PRESS){ + if(pwmval < 254) ++pwmval; + } + if(trig == 0){ // first hold after release + if(TIM1->CCR1) TIM1->CCR1 = 0; // turn off if was ON + else{ + TIM1->CCR1 = pwmval; + trig = 1; + } + }else TIM1->CCR1 = pwmval; + return; + }else trig = 0; + if(keyevt(1) == EVT_HOLD){ // relay1 + Relay_TGL(0); + } + if(keyevt(2) == EVT_HOLD){ // relay2 + Relay_TGL(1); + } +} diff --git a/F0-nolib/usbcan_relay/custom_buttons.h b/F0-nolib/usbcan_relay/custom_buttons.h new file mode 100644 index 0000000..426f10f --- /dev/null +++ b/F0-nolib/usbcan_relay/custom_buttons.h @@ -0,0 +1,25 @@ +/* + * This file is part of the canrelay project. + * Copyright 2021 Edward V. Emelianov . + * + * 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 . + */ + +#pragma once +#ifndef CUSTOM_BUTTONS_H__ +#define CUSTOM_BUTTONS_H__ + +void custom_buttons_process(); + +#endif // CUSTOM_BUTTONS_H__ diff --git a/F0-nolib/usbcan_relay/hardware.h b/F0-nolib/usbcan_relay/hardware.h index 00f5dd3..0fce465 100644 --- a/F0-nolib/usbcan_relay/hardware.h +++ b/F0-nolib/usbcan_relay/hardware.h @@ -22,6 +22,9 @@ #include +// default CAN bus speed in kbaud +#define DEFAULT_CAN_SPEED (250) + #define SYSMEM03x 0x1FFFEC00 #define SYSMEM04x 0x1FFFC400 #define SYSMEM05x 0x1FFFEC00 @@ -55,6 +58,7 @@ extern GPIO_TypeDef *R_ports[RelaysNO]; extern const uint32_t R_pins[RelaysNO]; #define Relay_ON(x) do{pin_set(R_ports[x], R_pins[x]);}while(0) #define Relay_OFF(x) do{pin_clear(R_ports[x], R_pins[x]);}while(0) +#define Relay_TGL(x) do{pin_toggle(R_ports[x], R_pins[x]);}while(0) #define Relay_chk(x) (pin_read(R_ports[x], R_pins[x])) // Buttons amount diff --git a/F0-nolib/usbcan_relay/main.c b/F0-nolib/usbcan_relay/main.c index 4d6343e..4fbb590 100644 --- a/F0-nolib/usbcan_relay/main.c +++ b/F0-nolib/usbcan_relay/main.c @@ -19,6 +19,7 @@ #include "adc.h" #include "buttons.h" #include "can.h" +#include "custom_buttons.h" #include "hardware.h" #include "proto.h" #include "usb.h" @@ -74,32 +75,34 @@ int main(void){ adc_setup(); tim1_setup(); USB_setup(); - CAN_setup(100); + CAN_setup(DEFAULT_CAN_SPEED); RCC->CSR |= RCC_CSR_RMVF; // remove reset flags iwdg_setup(); while (1){ IWDG->KR = IWDG_REFRESH; // refresh watchdog process_keys(); + custom_buttons_process(); can_proc(); usb_proc(); if(CAN_get_status() == CAN_FIFO_OVERRUN){ SEND("CAN bus fifo overrun occured!\n"); sendbuf(); } - can_mesg = CAN_messagebuf_pop(); - if(can_mesg && isgood(can_mesg->ID)){ - if(ShowMsgs){ // new data in buff - IWDG->KR = IWDG_REFRESH; - len = can_mesg->length; - printu(Tms); - SEND(" #"); - printuhex(can_mesg->ID); - for(ctr = 0; ctr < len; ++ctr){ - SEND(" "); - printuhex(can_mesg->data[ctr]); + while((can_mesg = CAN_messagebuf_pop())){ + if(can_mesg && isgood(can_mesg->ID)){ + if(ShowMsgs){ // new data in buff + IWDG->KR = IWDG_REFRESH; + len = can_mesg->length; + printu(Tms); + SEND(" #"); + printuhex(can_mesg->ID); + for(ctr = 0; ctr < len; ++ctr){ + SEND(" "); + printuhex(can_mesg->data[ctr]); + } + newline(); sendbuf(); } - newline(); sendbuf(); } } if((txt = get_USB())){ diff --git a/F0-nolib/usbcan_relay/usbcan.bin b/F0-nolib/usbcan_relay/usbcan.bin index 84068e39d435722b489293619d33235ab7c5d449..299e9c7f3dfdbae2c1ef3ff045a8e08ddaa16aeb 100755 GIT binary patch delta 9967 zcmcI~3wTpiw(vg5Nt-^Pr76%PrJN)!eWa!73(7+XC*|0j6AH8_edupWiymyzAdW_7 zoD&3wBFq(tkJ2)VigQ8XS_7T&GE_UhMuj_`IN;v`YI*hez%k+@eV@B_dWt&VIQM?v z|NZ^GmA%hiYp=cb+H0-7_TKIBp13~|r6B5|T%>&f;1>Y9rx*osu#}BQe4M ze@Oo6AZufg_N|=VuihC&P$q7M(?6ToV{suwg*xA6P^Sa^rsIb4Y3anF?vyyxT&8N# z+6+Eb(R2PwL>>7jTJ<+St*W-R(6PNQ)98Z&q)u(2V|rQxQ60V$uP~vm4tnqdEh<3Q zq`1^?q;AILe@kUiy+7*zT$Ll_k0y2<56d${ogXu+nF?kp)7M$(D&kDMf#2M*o6Zw6 z_$LBK0xuZ%1a>iI{yw9@oy#F}8)M{;GJBaE?lER2iYd%4&v8<7i9H&AGM~53;GIoR z4-z?9qB>`Wh;odgwurQm1%IOd9&BKcRV7w2EMsu1g^tjPKQRI35VId7CFT=3pZBOT zYHy3lF?>X{)%q?;wJmg6QlQoslk?F>gxTPU?we@&OU~(!RM2APYu#pkH$#{oV@^u7 z5o(n4_E|OHLefG4QO7`;uK+v-0P9Zm6d-M4r#dU4$A3*dYbtJ5XQ_KsTsP{z#d9N~ zMx@95dNObNO0j?=4!1D{Tq~1c*~{3tc946c|5kFkD!bf&A88h<7-Nf{o-NMg^j-&J z^wtIT(v%2OJc}$eqw}z-e+%qm)-cmKgNH+PDJIm8>dLmhyY-C*Mr&0Ck!1?2^H63h zuX9-4R=z#@571_HYkr~`3ZYQt&?#8GjbL3SC^lN+Nkr*j53RucAlFNO- z`2y-Y;a?X0WaA%4O3G2_*vP?kXfg^tJ6Z@|NAQ;lf47b1!}s$eFRnAjq}qvvQMq$^ za=8PjuNrV8Ie>d|B#modR~KD;Iu*+H=-kr=D9=TwpN^$a=*|%ox_QK3t}VN@VdO(8 z89LlH@>fX*W!=cz5}pOJA^Qt2Ak+;a;^ll3%EK@-5#Un*5|(oxKnj4*2eK!s?6NG6 z9t7M%Xv+ei{GVxO3Is~*L|M_I#uaa-kSg@&L6S>#Cw8g06!$Rb?H%BZM@cjrxn4e& z)`-3QZbz>>g^QnW@Fbe2a{6_+RljbxLtn3pw36mTt_En0VhzyNxZC)oX!RMNsf~|y zw7FwA_|}kTeCEA;lAyv(ByLhGO(bpslY?oVfPq7u%b5=uhUxB%e(*OPC_h0IOmRr% z)!C=eT2Xbx>WQ|Z-lKh6o$csk_0tT>R2>;g-&}D3srrb8C^t%+hq6#%iyZ!ytjhXM zjOyq+ah!RXISAhMASY-ujlA05FRAiT@clj#ELyz)QLPNJv@si98!E_`<{{oAhfj}G zF<*Gd_Jba^-@=oAvJZaS+6@|ORFBp)K7b1b_(pUvJ%LS2Pxd-eTbVwoGO&h2IsCab zELf6>n3c@W(&}I_+G(c*M|XfIAPdPNGW+YGDwFp-Bgx^BVcsW)r;J2p9`x;% z$d?u&ln!eS zShZc}h|X-2LR6V`4pnB8XQiaI5SdobGKt84td~g7WoM#Y3^E;H%DlHT z@k?gWB_hKtyJz7{DZx;cN%AKKkS_fzpqDrpOWlebr$NiN?5(;0(%*&RK_gg z)A`@mzbjSoY1>)WI_m`pNHJhrbsD7}JR0c;7o%BN6Ig?e!=VK2=U2>U{){b1bao^8utVqAQGZRc0UsN*8-CQTqIT5F;lDu7i@}SMEQDW&YCv1-D<(JtD3SH5NG#BKK9ltD+beoC?@0 zR(+4YNar~#B>|@-uD0Qbl)xr=*#;c&{yjpy4S2m5jAd;)@2K_d9s1LltmS_NWdc>}K6~fGjUUT4=@hlAawMz)b#>;L1V8N$&4 zIeeQ;gr*M-fu8tbpJmORb)?SGutpA>Z;9X^8{wTZs|~@k3t(o}$0&!6E?R^l6;yi#Yl%pN?i=DD)2P$erX_h}a}q?B(YayEYo$@o{SwCzr73Q;X<9iEB8KkvM6&Fx6;|GcQazXl$<21BdOTfVHPCk-(C+nbO|X>gg_@@`b{UDR-o@7F9<7ro zish}I6{%WxGSF+dsL0y2~jaM|IXTk+d?Auo8DOWMQMU^axg4SS*XcP?4<-KzV2C_LD-UsTBF*Vq(|1z zBAsG#zwEJPT$AQzV1YxOM20VOUd4KvM4LN)v1u`(>Z7dc9-`O+Ml=|t5OGKjx61qJ znPO9_R*cS@bDn6It&4j$-b5mzOQt{j*Hc4rpsi=sHwb%i{m zj7kWta`;7=qV$}BH7e8bE68MSDrgJkO&6!R?zUlF|3<;6J8WI6Bf3dc`aGauzLxy3 zE8R^&$OQVkl-7O;?>~4Snh^dnsNhooAp}1nKsq2pFe74@jY{Qaurn0K%M=z(3}HeU z37H?yDE6Yw&9=}khYQ9i6q7r-cePCpTgQ;; zbBT(1IyVI07;BDTLp?SD(5ZkvCrwE9EeMm?`9_o~XpfP@e~=TwV}E=wBE8!>EZ|Y+ z0uC_Z0NalK2054m;tC-ywx~T8v;=T-AVWKU;Y9^Yz$kZ*k!kVbP{t9QrQLw?qC^U< z*)EtKl*4Zi;xz3US1cumKOEi9Jp*dTzJX2j;Ar$u4grJ-GgHe?xFpHpU7CulWKh%B zzy?vsF}kB-2V2BX=bx@u^=;?22^BN> zN@@$Yh26Fce5FJVKQWpW@h2M$vupGQ5b3w0MUW!Rq>)$<$;q~k-tRi}F9-kqKOKD1 zXmdp~yOCcV8T?L;uegmDDyg;HT9#J^uT};xfWa#xgD)T57#aNape?-{1}#%&+~6gO zCuU3>$p)vB!%d_6X%t*@iFj&bn!%dTYojW-3bsr}|5D`YlcXc{9Z4f2_{rFYtCZVzf*aRBLS4mtEI_g2qwZF1~gF-w9J7ld6n zR_LOBMm#uVz=F&e-9qCf@QLu1l zP#-tK10!2uK{j1fwaGcC_o0jbdYAFVpZ))Ep4=2^qG?gKaKw8xwwSN@xJ0(nVRkSqq7oKRldx< ztc;WWBfS=l#tPI6+>7i>ieillGRq4&&*+P;dHtExv)ps+Aq5|&;B))SseRn<*aJ$t zJUqTwRDTWi1otHSw9@{K(w^M!he?gQV8Mu!`Yrcw?2{21K@ML~h%f;P%2)PqXjU7u zmD|32FS7;i9IzpNGQu%5GoM-o_a#_ce^L6B!XaBsbT^S4C z3+ug#+Q{9@3W_jCls+hrIEzAK!&$)hs4$XG-N`kv_bWv03ei}&c|;B$0Bi%-z-~~m zI~DAaE88sVA-0{VCT5{bl!t7oN zRyf_Ea1u&EiVcz34QETGx zZcC&?g#NpTz~l7l>-3+G;Ds25jM55ck{Y^Z$rKMPsrc2!O2{vg*i1#-&xgjXCGLuY z65_dd)~p~tRuHjV3aqOz67L$mjLaG?)@AT~e;FU&v?V`mp+3kcAnBvZ!2PyBeFc;_ z%eV?OJE0yA&;j*i*jaxCr4L{i0CwF{DD42{0{pB1z`1QVl(_(^7x%&i*9i_~>Q3rj zH}c0_I`?soIMT)(hqcW{0}!r08{W*oC4<;|ftX9?e;fSw%Ki_Rj1UD^TwZp$it=$jcAK&!(-fh8 z$^8=Oyw@|w%YzzV^7z1O-zs(I9x&1a&_z-3g+Z>%++BhwTfHCu2C?r zUdMbgj9t>p(AM+ToZvZ->Av0}Jg1F#MNcc^VTmox{c!A?(v7!|m zZ59ntk=@ULH6{RZ)^(NLI1G2I^MAVgod=J=Cp_$apF-UZWipf^0QwU3k!VO`gWc~c zz`fvdrvS15u$w)K9!1^Iei{IWtYy^8$}(LY7`F%EKiFa9XWGklS!x-aN}h{C!B6{k z|L`UDT)|zP)Wl}}5D1(@ZY4PhsEn4>UNOJw0?Z!pRm1bB71&uT(L# zz^tNnRe&Pq$l>P(Y>~_lE9uA}AR!_?qTn7^aCJ;8!b7E1SHV_<=`|wmyH&xD_xiQc z>p`WJfFx$iAa=VA1DIkwy+y&xSHS-1feTmg-Q(f@4ctADju!Fr$u_t#dUa?$cNe6H z8

GhbpKh*s7Y9Il7cN%Hj1xIETc(5y_f^a(FFx`m_N#Tn~CV$Jc5&rk%%DvfGSp zgkx&?O3kHyl#c}QH+?nKP2A0FwZhhPoh=OmF6WlBRSG8gI;Lc3li3dD)>5qoLwlir zt7*b;+xltF!QQCEL7di&$3fUvB1=>ZyqvHhjfKCA92$ke;P}dqujBiJ4#o+7P4%yb3^JX~j)*%J?o#?f{y6BQX26*$UBPr* z#{`8z>_i?Z&o&l*US3b*o7g&doIycL|8O)qP4zpe$>2!Sl&=2kU5^bmVh;c-_dt0s zKnegp)1^a+uNHCMIFUm(f=A%ZsTn*0LH!+|u|vJ26)L-+lGqu;rNWjG2ltNAoVt%F zR24l-lV|lUo9F>J+@n5%!bdT@>uvFuSgPP+Zo6fs@Fjddnt%|x1=$BWW08(ab|o*L zS^*puEOO&lrVKC28xWC&Kx)e3L80=IST4Ri-iaxQ2!$Cg9|uH>_iO;4DBxbSD=KpH zIRvNe#dHEZKKw8dN{y%%i^*x!ytmFr>HKrk-y$0Pqv?9#W*KjYo-SlUVCc)`K}l1- z9ek6O;VH-SIq<@LuY$ZGfPv2GoCX=a@d#OsaFW%-;Zavn;H@+4qm$1s&eiu6cymx3 zx+5*2JYN4=;BsIp#P7FO5k=<$&w)mWf_L==o`J6D$QUUyO0g7qE=eYkK@LADUz4s6 z=0B3L*s3-mKS3c23hf`#!_yrI=~q#9_--AV#@Wrt4=oloT+HqAPoGsFsHs@zp1=%H zSMqR%=YnKYA?k=3X=5x%`x%rI+_7r#bP_u!aRf?%ctDDAE{nGZREdJ{r~(|bhqX>E zyMylz80_7acB0C@!;LH!&sT~{@Dk$Xd-OGgl#{j)d4pWYoo&&jK0>43xYYUV(*ZxT zr{y?(a}UbTfh)W;xPjis%z>114x}XuQ=bI7 z3cXqTZDm#J*}!gkpr?*$Ygx%;bAs`;K#k9?NBPmg$Kg$9;vrJNFOdz5*=gi`>2Y?O ziL=);dzd(Px+;y+^f@7h5es6$c+_G&<7_t3--!)OU2`R4BtJTH(^7cRGbM2~K9qkn zct*14C-v+LtW9l7Tptkz{L7riSD`=GejO3$aS$k)yT#Wn*)5+-DPSa}0;n6SWWs%r z8`&3wm1AoRb$-Y!hv%VeS9fP-%d^aB{gsr%OgCIC9A0Wan^Cb99b*oc-Oe~wgrmS+ zz_$P`<=kMuohfkl!W)DSg4GT>yJxXAqo+o@lQC5M8FesODJjeJ6^EE5WgSd{?^YjL zUbbzez3gEhG9L)AzBT%tzK7i~KfTV^z_hE{11Ejj_BY&!`r&PvrXj1f9^bTP`uu<(<%iYcz;ih|PU!2AWRE;h(yoZ^rr6SdXtm&f4njeHK0c);U z%l)4SrOjMrzlGJ=yUlyR;%;Jf@WfZc86QE`FU3_{oy$vEKMUSm4tchGMY3BH;T{s# zKam=|AH?JZHCC4x19_9md?P&Cu4!2YzsT(3YJGnN3bQp^v{-eb$@*=uoGtTzl|5Bh z0=NdR$@&NJqJ+$LpqInTo`+n`Y*eWoalTxj`>nL5#SG;iq=ptN>!%CE_#V}Kc|NWYg>s>vP7IQQ zDFY@mbL@U89Y~B~xA_C)rzZzvO(tm9jWtO=b0xGO@pdW6Gy~dV#_FY1phe=XQm)Ae zEoiJ-B29Xz4Ubkyg{Bm!eLq?uWx_o;JPVCFCA^L}7GPh+miii$f*{MKs)g{R4v1m^ zyvSv+=r~9aYJ{{4-~}4W5lF2*1yDiV4sFc<@c`ZP{fn%r0yC!SNbDl0VTq&$rBLSr z*XE9f<~q&t)1^+X*+>?ind?e0A7HrVIm--o5ki)`?61{twzQ`B&;gCJIVZjC;dp2{{%M? zA`XxJ15}80i`6HG;Su{QS;juJH4AC6?y;KjzlG>hQKud5RqU4bz^$qKm~Ci0!o-OQ z>;jnEQ`I=^ol?Rcjxw?E&ke0i17k09_}~J_xsSP{Yym$W-yocg|EowhQ|kXHw}>e9 zPsv*>jD<|r2x%PgNR4LO^XVIcQ&Hj# zc`=8XJmMhZE6d>T;AgmRb3e~Z{O{bKxD$(KqQs&bmtG65h5xIFPbW(92&Z0WU#d^0 z&En3Q!z;--`<5Ejxr06GbaFwvmMCfmzxp!e-ISZtP)-zV>8EZnpsTPYK0yx#$A#A* zjQbj1DRAve$$-8G;r+Ao$BriD|D9k?kx2UpjR5xoYyoHiXpVzJ0{{hZJ{H&kv;oinrLq3| z3M=)Vd)98;xV91TcQ-def$mw`ytW=U_`fbr^S?iTgMZijbP_Ubbo9;QQySsDsYuIA zL)x36{C|b&=|Avz=STIQZI1d;dX*5C0cTF!Q#Q9|oQn?D+p;Qm*O3Pdj1( zUP(pTS^A#`pYi8$)e0_g#yAc8Kk%9*{LDbfO2=pa#b8*-g$A&MAMv>BNA-W4L^JRN sKSNoNOxplT0sQU-0nHE+5c2C5=B3ynXIcy-_#KgeJORBaBmo5i7(mbp){wwc$cZ3eCl_ra;0&v+skSrix}8{i z!OPpKX;&b&b?R2N+R{w+x~;a@?(O277(YGbqcVeW|F}hlP&8fzdji^KAl9^}usq736WzXTH*@>L2 zP*J4J`O04gUFpUL@ypO5>NYC-+JJ;s-4(MsJNc7p+~od(Z|t;JAYY?9ChO`a6rJp( zvWGx;ll@b^sdHULjIYW4$LxVm>afaroi7*5D4V;`1m!RIUYM+03ekHYl>xX4J+ZQU zYL91yEN@;tSHMumyKn*11KXFYeyAJU_Y%b+GVAR$1? zC_oA+lkAdZQGQCNb~^9q$0t2s%a_Z~0!5#vIBJWeY20%x>a9719}S!Y0SQ%ZU^s*V zCq3JupEFbA#Z@Rc89vg1W}@KOcp;QRq$DBbYvT){{8jknj+7XUi7JcAEg8sV4x>OL z3Vs&OfwrNrr&*ziIvGa617Xi2ii))-!XNWV&~h~VKA#BbFT?Nfq`Sz7OvjEPbPD=H zbn-f+4j962fWrX&0963z0o-orq*7uM1Yx2b$|C@u0bKH=#-y{#K9r^4qHGk3*U?B4 zG>pj@ja_+K!X(?nFhTvmnMhIUG|ZqQ)-2}+9eXW>vqhR#9Dgn(M*r$?U)4Ct?hA;G7s{| z=uU#XU?0XG<67L`Cx7^fUdbycuaILir7p=Usir)x*cqLN2KxdJSx=z)rsuHiR&9!*Vl6(W83&#FIul|F?k{KY z|LL4fDPpCjM9Y@@U%P)SqrLVpk_4zSlpDh>?aW40p-{NbX9VV}1WDF4E~-~E?PkZoo*pC zV>~Le*L^_bQg?ANBg;&2Y;l$_DUM$|i{X3SxsP9DEv}y9sCTsZ;vMMOY6rCs84B2o zs7K$CXlhRLl*e{Z-4}fcW{Q*OU^YO2i_c~hz)I@b!YlMtW|4CfpT?v?7t;}?pM#LL z8<#m4d>H3C4&Vw`e7WAN;o5Ko-rovcT`Vh>Wq;{^j<>ijM$bF{%T|la8?8J~d3UwG z&6`~_7`5H@sF=Lviig4>UL;*N!~@DYACJ6;)?Ed=Xe>ku;(5scoseIYOPQ7clmT=> zIScBECwSUt*r+7WYcoDzNl{`=bWlZ!cH+;ZOle2@rXp}9ewYdLsT~hj#ah(%W{1So zY*#zBR!K~1NPjG*&5j2lokcg>FZ}3H%Y|0;J)22=8`AaIoA23aX>QwORTd-w^?lXN z@Ffrnd=BWE9Q!=N%v7qylR8T!Uu#{<+~p~qmC8OiDunJ9sNjNdJ1vBi<8FQHk6L7j zmbO+Qq!m^&D{b9)B~w@1gX?M9ccke+r}?xgZ0eyNK!`KGu&U;?*{;}}SWa&* zb*xQUW=DDNU1G4_zFc2we}})3Bk?)b@CG--AoVl21@fo3JSN9lh1GTxe15E#H$XHx zG=hTnkNhWJRe5xfT0+~U+67fq5Qh))G*e_ZJnY38OtJ$7pB{ykHn@Alv7;CT7ml@H zWS9j#?7{|AiNSH9@n<98plc~;Papfj=dJu^AeKhKJ3&DC$TOaolzDYV(4G;LOv2tG zNJ$9ngt`Nu{67E??e;_ZI)pZ7AIgxgh^jF-j7a08g6UxylW*5Jou~Wp5}@4;xH~+V z3Hst4kaPCM+T=*@T5gCQP*hVzu@1d+rDl#(VRxREGf`GGXyK27-W3EhB=}1_KTRlR zWiDgxTn^=0IXyC##u)H`1UPR;DakDmFH%%VE@Npj1P0P}eNbUnBI9XVXK{HfjfN!7 zY~cOdU5{##k#Px?l|2BKnQ1}=2ISAOP=$#u4KkKdxqlzL%o8jatzoAB5}!~e&s7f6 z@coz_Se;1~%BaSaL>E#a!}}Z|iOK!jfHCtLzc@3gWGPe zMFDD&-bIzB8^#8yqaMMM9`bKzSp6L`!>vr#J7&W_rwvxlAV0x_*J$zJi`_ zqXJ9N1`)GJKnq9wBzmarTG3`Hux5!+yxEBU%qKI+)|yPUy_QY^nj73zBKHq?C6i$N zF|=0Fb4cr&Y2mSAb3Y%$#8_*gxrUw@K^&eWU3-n^Ky5-atku)&=En ziI}{v2mVafu4(ShzDIj!BI>9NX7`gxl(md|%v{P*Ua4WpK#tXmx*Or!i1JO`uGTCj z+gb_zw$WJ;{oXT)Sm-#_C4`O&G(%fE0EMRM2ozQvnu<}uT%!C`?!L@Tv?`)~lh`il zb)Hr-O6z8zUro=BXun%*|B~Oe?lk{HppB1ctAjRn#2?^qMB5u9I}CGl1fUmS4?qB% zE!amoxV@L!;{qW@IxT`xo+#uVOzF^qS@Sq1lr(ieYnS4X!o{q4-Ip`<&M&4ESOUUwyJ#M34}K+^+_V&^|tabQky= z9W;Rgm3?nVN&Kc5A>%?h>eFG*|4`G#<=;4W&TlSb1SEYvdkZgb|HcWey>}VF~o1b_M)>_JgvXK8T zLr2WWe|1RaJyA;;r~wpQGX4^C#JYaI+Fnl|T|otm=sp)!3_du4@<;qe5dG}LGWhPB zC}kZ~PfCZ{yo4*rC<%POz*i@pWm={Mz9I^I83gW~7N{8C#q6FI_#Y7hTSb8dAZo2B zuzBJq)AEqtC~l+Jx`{_@5AhUC@wo|ET0A$Fd4g<;mZ7{Tu62j@VG=w3JSxfhJGa@k zUc`H2LI`~}dY|nseoIXetQprhi>uJ66`?!xiiue*<>ppngQKG{+(B(UN5Ff)dn=co(L>sZnx5+P2&i* z?}%)RZGRp9R}7~{H#|Nyx}*tNS3wpUSaGF<>4K4c5ODj1&_g2&m<87Lz`33-h~V5U zawbFaO{B3*y0sNh?xAxcP&!4FxwcpSrEsY@wMWL~=zv+mNxc%o=D~PohP4g&)Z7vs z+NVU>b`DcU3M~KF1Z8_{_+3~(NjN0l#FB;f#?I;wi(pZO2C@Sqar6PmD~pjr18@Z3 zR2INH*MQ2-7B+( z|IrN>j1$+}d|B2bfMdKsI5Y6e}#F~%D{}&(!Pk9y%Z+a^0G}b{43@q zh_|fTUPZqgfpAttIApta^;fm4hksd{I{XX9IKKxUX1ulCxSQ$17Q8w$-M*5x;qR8O z*F>sSm>eEn4in!#5~j`yp|{6Lpg93 zY{kSgmeOk?##$y4TX1rx5E>K5R}_}$_v0cLwK!1mqB(GJm2K74$5-t zo^S1dO$??>YRD#LtBWcTLVp?~n;5b*UkO`qs+9(eTsl7j(z#2f)x>~XZ{0!zt2)!^y)_`sLxG5?Y$U1;bZnXhfwcd-9Vfu># z14VGFHoegZfV+_cGx1q+AUY4O*9di4;HD=RBZUd-0#HX>_Yo))x8-2Tu7bP`U=4r_ zARZtIKm$Ow`;FL(Sqd~aR3U^K#0~p(|GQSoyBA+X-4%QEUgX6LZpK}Wf2bi5ZN<0+ z({vh)u57FsTDlrhybv zGd=;PnD}1eTPcpCwnY0eMtY(LkNC2|^7Z4}Ff6wmb(vZ$TlkGX^Rq+D3*wGx75$3{ zYxruESi=i&BoRW<;VzpHN*MQA6J1T_rt$8-fDs8q$4zcYL9bxgzRyG0jamtE)_Se zuziJPc=|9{B13Rnlm8dLTSw_Xtz!3~?JJw{lUk2y2QoLRE#{S0jB=1)GNia|s$4IY z(a<*SxhjIw12`@C68eDIquY<)XWA?Fp+hTWg@;y3^O67EfDFF(3`yYoUf^lnY?;hU z(JfS>WsmNyYJzE6x~s80bGv2N%6{eyYc(0w_WlU-NgN^mOV)(k(NoNCtxhm7n*MDB zhD5~Z0|Uz%YrwtMRiGe;-dE$rlE4-*s!fK1LJOu!kl|ZDS<0eE8}P5JG~jjUkKTgE zUb>0MK=|>Zj~g5CeppbAa4M8@RLNxMJ%Qv${SEl%B8zqUo|%> zuv(lOiKQn)uL%u!=k&<}`H#VB_^9yGRRs1E7zUSwYoM`FF=a#fV=UvIcC^QDj&d@z zM?CUA0;BxR=vHQ{^K`K-)BG!PPe%w(b_!6C(gyF&WZ;3P=PXK0oEL=|EO`(_<_D znGC3?Td0V`%77|gRMBMU+9ZD!X?Nmk@S_dG3z#f%i1*S(5#0<-oqsc+pHZXfuo0iy zC>bJ9J`hi~8o>DbNFM0*kCQ((3!zsbu3dCA%UAOabOKyh(4ZP>(PZe<^j$(c6A!wd zIeqmp8G2$;4z!gMZ(gr`dM-29dcjU|ljJUeg&^`Ydiv&-#cl`;2LMPw`3zEW3=cwT zggCJT(z6gNo{5MR@le+e<^2HYZzv!`V{*7uhEdNRz8;Ov&l*-R3hRAhkdBTRSerO7 znXOs~?HIYS(O3h_h+t)39HW6V{7f#EQFlISj^`vrNGA(Oin`NcI=7i+994MG9J)x+ zN;u7r^CSX3;5n*mpvpWGx^(svC_g<5?qSv-(@0;kEf%ibkRi@Lw{~95Jmz-0G(eT! zZihD^F4F~;0+)molG1u73f7EIVa8X*SI=N55t9-zbuN@M!s%TX;r5*35Iu4_%1Y6R z&M}z9GKj7>#&ElNmINt1|Dpd7Ze`bHsMs2T>>8Y>kroa$p*w_8euqz91=|(@9+jM* z1G!R)=u6P$0KiD!JVu66Tr&_dq`=FY3XV64H3hB~_4DSWOUv_A1Dn!*?_2EJk4w={ zRWqyp=F`HR*O^sR(M8|OX4o(;-cYgFIdXc3FB)Vh1(d8Wa$e!5Li2ONHU6eBPeSH$ z1M*0j4#w3=JUJB)BJU_`SSh3F+TP>wiVW#GWGo3>` zEkX2cdZc(3;6Z>J+{uiP;VAoH7Ev<9FBunSLo}IPflDRZ$iU9$^Lw6ip~F>m^MI=%QgbK{3-VGft-C}Bz<4#J5SCux2M zIAxkc@UmxubDt^Wkgo?*MJ>v1&=%YR>6_7G&18y>*LRyo23l}WXC2OF>=jL{yA2EK zH+^VfwEvk(IT!iFSLD!EyEEcUMlEA1vTxa#A<@H&D1*!KKCH5*F!De(glwubRy2_N zH)_q_a`kx2#uVAbkDjT7heWNCX>y~5ulhgaf1+toJ}-8r1#29nL)*j-vA?K)9(okT z-0eOCrl5e?$bvZ~)KE@c{t8#4pee*jH;%8J>laJ%96~`+r zmlo8{%6uKmP1TZY%j4*H#Rhzv{WeD@z60y3A2N~BV08X@H^kCi=A41$hWP_cirp;M z)Sf}7a9*;yN?p4Rmsgy^GuI^A z11u@rZ&mgsI#Oh+cw|srjEjoUN;F9fHg3kC)?nmJhGajvdU;N0V%CauMqPs`z#~Jv zzs+?n#^RT=hE^`dAoojjb&T5C+Ic5@k!}^!?6$%3LPQagKk{`<%1&gs$T3Wdi#GhX zzXm+)hr)+^n@b08A9}+)PHVXAueRR7By^@YRPMUYCimXXZuhy)3+`y03HY_Svo)@C zB|g`h&nR6gM}v#frAVZfICnPSJ;k?nY9T$qw{_;g9T&|d3`mv=OUZjUc@XrN=W}jd zJ%ZaW&c)Bx>R--LVy)ZNhiyO1}5T@d%z zQBs6D;Yw8s>3&F$0|Wr#%U}V5)L!c8$GI|uA9G2R)_qJ_pk=LAG zT+M*jrGHdno25I9nT^Gsp`27U_GW)PS+t@g!cWVapu|HJ2IK(jkD#7 zkC1l0HNmOg7+(OdbL|<{=Js@GIVY2U6t7ip+zE9w)QOkIIRk#THijxNrE|GEQLdju z+E*Q_8rK@NCOBlSxnh z&OsvH^S&ox>4@V>lb6keBmN6;7txG%i?QaU7;0jfe$<8Au&Ki0CTsJ4yrH6W+Qv)m zQ-3q*$620bxkXf#=l_q5OLEJ3B`d$T{01u{>pc;}-f=*8Tw`Eq2d2j}jTjG%v zoro^?&q2y%c`-+D9(5c)2G1HrXue~;Bh5bSc**gpJq@k3zi3x3QkJw;e(kTsvohlK zRB;|vtx7UgsuIocuM_?IjbE;m6%ALarTL=+QoXF~u!3527^zKpsu57(GU02%-qzzARhs3`RO%J^;C?QyUp z0{AQzDK5a@g3d$w0>CPOMRA^w3+mbVNzfAj)4cz8$eQ~dkCHjx<-d>jU*{tB7Qr+B zf#`4q!|!84>MQ<%j?@kOi@Ja0F_OsM+Dp=bA15QlU7GKQ+5e_3kTOM=tD8!HGhO~( ze(d)!du*EU;s1rfSry!a0o)L9{@-*y1KPlEP(>-+i2. - * - * 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 . - */ - -#include "adcrandom.h" -#include "balls.h" -#include "fonts.h" -#include "proto.h" -#include "screen.h" -#include "usb.h" - -extern uint8_t countms, rainbow, balls; -extern uint32_t Tms; - -char *omit_spaces(const char *buf){ - while(*buf){ - if(*buf > ' ') break; - ++buf; - } - return (char*)buf; -} - -// In case of overflow return `buf` and N==0xffffffff -// read decimal number & return pointer to next non-number symbol -static char *getdec(const char *buf, uint32_t *N){ - char *start = (char*)buf; - uint32_t num = 0; - while(*buf){ - char c = *buf; - if(c < '0' || c > '9'){ - break; - } - if(num > 429496729 || (num == 429496729 && c > '5')){ // overflow - *N = 0xffffff; - return start; - } - num *= 10; - num += c - '0'; - ++buf; - } - *N = num; - return (char*)buf; -} -// read hexadecimal number (without 0x prefix!) -static char *gethex(const char *buf, uint32_t *N){ - char *start = (char*)buf; - uint32_t num = 0; - while(*buf){ - char c = *buf; - uint8_t M = 0; - if(c >= '0' && c <= '9'){ - M = '0'; - }else if(c >= 'A' && c <= 'F'){ - M = 'A' - 10; - }else if(c >= 'a' && c <= 'f'){ - M = 'a' - 10; - } - if(M){ - if(num & 0xf0000000){ // overflow - *N = 0xffffff; - return start; - } - num <<= 4; - num += c - M; - }else{ - break; - } - ++buf; - } - *N = num; - return (char*)buf; -} -// read octal number (without 0 prefix!) -static char *getoct(const char *buf, uint32_t *N){ - char *start = (char*)buf; - uint32_t num = 0; - while(*buf){ - char c = *buf; - if(c < '0' || c > '7'){ - break; - } - if(num & 0xe0000000){ // overflow - *N = 0xffffff; - return start; - } - num <<= 3; - num += c - '0'; - ++buf; - } - *N = num; - return (char*)buf; -} -// read binary number (without b prefix!) -static char *getbin(const char *buf, uint32_t *N){ - char *start = (char*)buf; - uint32_t num = 0; - while(*buf){ - char c = *buf; - if(c < '0' || c > '1'){ - break; - } - if(num & 0x80000000){ // overflow - *N = 0xffffff; - return start; - } - num <<= 1; - if(c == '1') num |= 1; - ++buf; - } - *N = num; - return (char*)buf; -} - -/** - * @brief getnum - read uint32_t from string (dec, hex or bin: 127, 0x7f, 0b1111111) - * @param buf - buffer with number and so on - * @param N - the number read - * @return pointer to first non-number symbol in buf - * (if it is == buf, there's no number or if *N==0xffffffff there was overflow) - */ -char *getnum(const char *txt, uint32_t *N){ - char *nxt = NULL; - char *s = omit_spaces(txt); - if(*s == '0'){ // hex, oct or 0 - if(s[1] == 'x' || s[1] == 'X'){ // hex - nxt = gethex(s+2, N); - if(nxt == s+2) nxt = (char*)txt; - }else if(s[1] > '0'-1 && s[1] < '8'){ // oct - nxt = getoct(s+1, N); - if(nxt == s+1) nxt = (char*)txt; - }else{ // 0 - nxt = s+1; - *N = 0; - } - }else if(*s == 'b' || *s == 'B'){ - nxt = getbin(s+1, N); - if(nxt == s+1) nxt = (char*)txt; - }else{ - nxt = getdec(s, N); - if(nxt == s) nxt = (char*)txt; - } - return nxt; -} - -const char* helpmsg = - "'0/1' - screen off/on\n" - "'2,3' - select font\n" - "'A' - get ADC values\n" - "'B' - start/stop rainBow\n" - "'b' - start/stop Balls\n" - "'C' - clear screen with given color\n" - "'F' - set foreground color\n" - "'G' - get 100 random numbers\n" - "'f' - get FPS\n" - "'R' - software reset\n" - "'W' - test watchdog\n" - "'Zz' -start/stop counting ms\n" - "Any text - put text @ screen\n" -; - -const char *parse_cmd(const char *buf){ - uint32_t N; - if(buf[1] == '\n'){ // one symbol commands - switch(*buf){ - case '0': - ScreenOFF(); - return "OFF\n"; - break; - case '1': - ScreenON(); - return "ON\n"; - break; - case '2': - if(choose_font(FONT14)) return "Font14\n"; - return "err\n"; - break; - case '3': - if(choose_font(FONT16)) return "Font16\n"; - return "err\n"; - break; - case 'A': - USB_send("Tsens="); USB_send(u2str(getADCval(0))); - USB_send("\nVref="); USB_send(u2str(getADCval(1))); - USB_send("\nRand="); USB_send(u2str(getRand())); - USB_send("\n"); - return NULL; - break; - case 'B': - if(rainbow){ - rainbow = 0; - return "Stop rainbow\n"; - }else{ - rainbow = 1; - return "Start rainbow\n"; - } - break; - case 'b': - if(balls){ - balls = 0; - return "Stop balls\n"; - }else{ - balls_init(); - balls = 1; - return "Start balls\n"; - } - case 'f': - if(SCREEN_RELAX == getScreenState()) return "Screen is inactive\n"; - USB_send("FPS="); - USB_send(u2str(getFPS())); - USB_send("\n"); - return NULL; - break; - case 'G': - /*USB_send(u2str(Tms)); USB_send("\n"); - for(int i=0; i < 1000; ++i) getRand(); - USB_send(u2str(Tms)); USB_send("\n");*/ - for(int i = 0; i < 100; ++i){ - USB_send(u2str(getRand())); - USB_send("\n"); - } - return NULL; - break; - case 'R': - USB_send("Soft reset\n"); - NVIC_SystemReset(); - break; - case 'W': - USB_send("Wait for reboot\n"); - while(1){nop();}; - break; - case 'Z': - countms = 1; - return "Start\n"; - break; - case 'z': - countms = 0; - return "Stop\n"; - break; - default: - return helpmsg; - } - return NULL; - }else{ - switch(*buf){ - case 'C': - if(getnum(buf+1, &N)){ - ScreenOFF(); - setBGcolor(N); - ClearScreen(); - ScreenON(); - return "Background color\n"; - } - return "Wrong color\n"; - break; - case 'F': - if(getnum(buf+1, &N)){ - setFGcolor(N); - return "Foreground color\n"; - } - return "Wrong color\n"; - break; - default: - ScreenOFF(); - ClearScreen(); - PutStringAt(1, curfont->height + 3, buf); - ScreenON(); - } - return buf; - } - return NULL; -} - -// return string with number `val` -char *u2str(uint32_t val){ - static char strbuf[11]; - char *bufptr = &strbuf[10]; - *bufptr = 0; - if(!val){ - *(--bufptr) = '0'; - }else{ - while(val){ - *(--bufptr) = val % 10 + '0'; - val /= 10; - } - } - return bufptr; -} diff --git a/F1-nolib/RGB_LED_Screen/proto.c b/F1-nolib/RGB_LED_Screen/proto.c new file mode 120000 index 0000000..ef1f2e9 --- /dev/null +++ b/F1-nolib/RGB_LED_Screen/proto.c @@ -0,0 +1 @@ +/home/eddy/Yandex.Disk/Projects/mytakepic/.hg/wcache/checklink-target \ No newline at end of file diff --git a/F1-nolib/SI7005_HTU21D/si7005.bin b/F1-nolib/SI7005_HTU21D/si7005.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/SPI/SPI.bin b/F1-nolib/SPI/SPI.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/SevenCDCs/cdcacmcore.bin b/F1-nolib/SevenCDCs/cdcacmcore.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/Tetris/TETRIS.bin b/F1-nolib/Tetris/TETRIS.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/Tetris/getrand b/F1-nolib/Tetris/getrand old mode 100755 new mode 100644 diff --git a/F1-nolib/Tetris/main.c b/F1-nolib/Tetris/main.c deleted file mode 100644 index 0513d46..0000000 --- a/F1-nolib/Tetris/main.c +++ /dev/null @@ -1,193 +0,0 @@ -/* - * This file is part of the TETRIS project. - * Copyright 2021 Edward V. Emelianov . - * - * 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 . - */ - -#include "adcrandom.h" -#include "arkanoid.h" -#include "balls.h" -#include "buttons.h" -#include "fonts.h" -#include "hardware.h" -#include "menu.h" -#include "proto.h" -#include "screen.h" -#include "snake.h" -#include "tetris.h" -#include "usb.h" -#include "usb_lib.h" - -// timeout for autosleep (30s) -#define AUTOSLEEP_TMOUT (30000) - -volatile uint32_t Tms = 0; -uint8_t balls = 0; - -enum{ - STATE_MENU, - STATE_SNAKE, - STATE_TETRIS, - STATE_ARKANOID, - STATE_SLEEP, - STATE_GAMEOVER -} curstate = STATE_SLEEP; - -/* Called when systick fires */ -void sys_tick_handler(void){ - ++Tms; -} - -#define USBBUFSZ (127) -// usb getline -static char *get_USB(){ - static char tmpbuf[USBBUFSZ+1], *curptr = tmpbuf; - static int rest = USBBUFSZ; - int x = USB_receive(curptr); - curptr[x] = 0; - if(!x) return NULL; - if(curptr[x-1] == '\n'){ - curptr = tmpbuf; - rest = USBBUFSZ; - return tmpbuf; - } - curptr += x; rest -= x; - if(rest <= 0){ // buffer overflow - curptr = tmpbuf; - rest = USBBUFSZ; - USB_send("USB buffer overflow\n"); - } - return NULL; -} - -static void process_menu(){ - switch(menu_activated()){ - case MENU_SLEEP: - USB_send("Select 'Sleep'\n"); - ScreenOFF(); - curstate = STATE_SLEEP; - break; - case MENU_BALLS: - USB_send("Select 'Balls'\n"); - if(balls){ - balls = 0; - }else{ - curstate = STATE_SLEEP; - balls_init(); - balls = 1; - } - break; - case MENU_SNAKE: - USB_send("Select 'Snake'\n"); - snake_init(); - curstate = STATE_SNAKE; - break; - case MENU_TETRIS: - USB_send("Select 'Tetris'\n"); - tetris_init(); - curstate = STATE_TETRIS; - break; - case MENU_ARKANOID: - USB_send("Select 'Arkanoid'\n"); - arkanoid_init(); - curstate = STATE_ARKANOID; - default: - break; - } -} - -static void gotomenu(){ - curstate = STATE_MENU; - clear_events(); - show_menu(); -} - -int main(void){ - uint32_t lastT = 0; - sysreset(); - StartHSE(); - SysTick_Config(72000); - RCC->CSR |= RCC_CSR_RMVF; // remove reset flags - - hw_setup(); - USBPU_OFF(); - adc_setup(); - USB_setup(); - //iwdg_setup(); - USBPU_ON(); - - keyevent evt; - while(1){ - if(Tms - lastT > 499){ - LED_blink(LED0); - lastT = Tms; - } - IWDG->KR = IWDG_REFRESH; - if(balls) process_balls(); - process_keys(); - switch(curstate){ - case STATE_SLEEP: - if(keystate(KEY_M, &evt) && evt == EVT_RELEASE){ - USB_send("Activate menu\n"); - gotomenu(); - } - break; - case STATE_MENU: - process_menu(); - if(Tms - lastUnsleep > AUTOSLEEP_TMOUT){ - USB_send("Autosleep\n"); - ScreenOFF(); - curstate = STATE_SLEEP; - } - break; - case STATE_SNAKE: - if(!snake_proces()){ - show_gameover(); - curstate = STATE_GAMEOVER; - } - break; - case STATE_TETRIS: - if(!tetris_process()){ - show_gameover(); - curstate = STATE_GAMEOVER; - } - break; - case STATE_ARKANOID: - if(!arkanoid_process()){ - show_gameover(); - curstate = STATE_GAMEOVER; - } - break; - case STATE_GAMEOVER: // show gameover screen - if(keystate(KEY_M, &evt) && evt == EVT_RELEASE){ - gotomenu(); - }else if(Tms - lastUnsleep > AUTOSLEEP_TMOUT){ - USB_send("Autosleep\n"); - ScreenOFF(); - curstate = STATE_SLEEP; - } - break; - } - - usb_proc(); - char *txt; const char *ans; - if((txt = get_USB())){ - ans = parse_cmd(txt); - if(ans) USB_send(ans); - } - } - return 0; -} - diff --git a/F1-nolib/Tetris/main.c b/F1-nolib/Tetris/main.c new file mode 120000 index 0000000..ef1f2e9 --- /dev/null +++ b/F1-nolib/Tetris/main.c @@ -0,0 +1 @@ +/home/eddy/Yandex.Disk/Projects/mytakepic/.hg/wcache/checklink-target \ No newline at end of file diff --git a/F1-nolib/USB_HID/usbhid103.bin b/F1-nolib/USB_HID/usbhid103.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/chronometer/chrono.bin b/F1-nolib/chronometer/chrono.bin old mode 100644 new mode 100755 diff --git a/F1-nolib/chronometer_v2/chrono.bin b/F1-nolib/chronometer_v2/chrono.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/chronometer_v3/chrono.bin b/F1-nolib/chronometer_v3/chrono.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/inc/cm/core_cmFunc.h b/F1-nolib/inc/cm/core_cmFunc.h index a1bd88c..bdc54e6 100644 --- a/F1-nolib/inc/cm/core_cmFunc.h +++ b/F1-nolib/inc/cm/core_cmFunc.h @@ -453,7 +453,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void) */ __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) { - __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp"); + __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack)); } diff --git a/F1-nolib/led_blink/blink.bin b/F1-nolib/led_blink/blink.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/pl2303_snippet/pl2303.bin b/F1-nolib/pl2303_snippet/pl2303.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/pl2303_snippet_naked/pl2303.bin b/F1-nolib/pl2303_snippet_naked/pl2303.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/pwmdmatest/pwmtest.bin b/F1-nolib/pwmdmatest/pwmtest.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/pwmtest/pwmtest.bin b/F1-nolib/pwmtest/pwmtest.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/uart/uart.bin b/F1-nolib/uart/uart.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/ws2815/ws2815.bin b/F1-nolib/ws2815/ws2815.bin old mode 100755 new mode 100644 diff --git a/F1/1_wire/onewire.bin b/F1/1_wire/onewire.bin old mode 100755 new mode 100644 diff --git a/F1/2.8TFT/dma_gpio.bin b/F1/2.8TFT/dma_gpio.bin old mode 100755 new mode 100644 diff --git a/F1/DMA_GPIO/dma_gpio.bin b/F1/DMA_GPIO/dma_gpio.bin old mode 100755 new mode 100644 diff --git a/F1/GPIO_TIM/tim_gpio.bin b/F1/GPIO_TIM/tim_gpio.bin old mode 100755 new mode 100644 diff --git a/F1/GPS+ultrasonic/timelapse.bin b/F1/GPS+ultrasonic/timelapse.bin old mode 100755 new mode 100644 diff --git a/F1/GPS/GPS.bin b/F1/GPS/GPS.bin old mode 100755 new mode 100644 diff --git a/F1/Jeep_generator/jeep_generator.bin b/F1/Jeep_generator/jeep_generator.bin old mode 100755 new mode 100644 diff --git a/F1/Timelapse_keyboard/timelapse.bin b/F1/Timelapse_keyboard/timelapse.bin old mode 100755 new mode 100644 diff --git a/F1/Timelapse_keyboard_only_lasers/timelapse.bin b/F1/Timelapse_keyboard_only_lasers/timelapse.bin old mode 100755 new mode 100644 diff --git a/F1/USBCDC_template/usb_cdc_simple.bin b/F1/USBCDC_template/usb_cdc_simple.bin old mode 100755 new mode 100644 diff --git a/F1/canon_lens/canon_lens.bin b/F1/canon_lens/canon_lens.bin old mode 100755 new mode 100644 diff --git a/F1/distance_meters/ultrasonic.bin b/F1/distance_meters/ultrasonic.bin old mode 100755 new mode 100644 diff --git a/F1/hid_mouse_keyboard/usbhid.bin b/F1/hid_mouse_keyboard/usbhid.bin old mode 100755 new mode 100644 diff --git a/F1/keyboard_snippet/keyboard.bin b/F1/keyboard_snippet/keyboard.bin old mode 100755 new mode 100644 diff --git a/F1/matrix_keyboard/matrkeyb.bin b/F1/matrix_keyboard/matrkeyb.bin old mode 100755 new mode 100644 diff --git a/F1/nokia5110/nokia5110.bin b/F1/nokia5110/nokia5110.bin old mode 100755 new mode 100644 diff --git a/F1/simple_cdc/usb_cdc_simple.bin b/F1/simple_cdc/usb_cdc_simple.bin old mode 100755 new mode 100644 diff --git a/F1/stepper_motion/usb_cdc_simple.bin b/F1/stepper_motion/usb_cdc_simple.bin old mode 100755 new mode 100644 diff --git a/F1/ultrasonic/ultrasonic.bin b/F1/ultrasonic/ultrasonic.bin old mode 100755 new mode 100644 diff --git a/F303-nolib/blink/blink.bin b/F303-nolib/blink/blink.bin old mode 100755 new mode 100644 diff --git a/F303-nolib/usart1/usart1.bin b/F303-nolib/usart1/usart1.bin old mode 100755 new mode 100644 diff --git a/F303-nolib/usarts/usart.bin b/F303-nolib/usarts/usart.bin old mode 100755 new mode 100644