diff --git a/F1:F103/CAR_CANbus/WindShield/buttons.c b/F1:F103/CAR_CANbus/WindShield/buttons.c index 68b0667..278397c 100644 --- a/F1:F103/CAR_CANbus/WindShield/buttons.c +++ b/F1:F103/CAR_CANbus/WindShield/buttons.c @@ -20,6 +20,9 @@ #include "buttons.h" #include "hardware.h" +#ifdef EBUG +#include "usart.h" +#endif extern volatile uint32_t Tms; //uint32_t lastUnsleep = 0; @@ -28,22 +31,24 @@ extern volatile uint32_t Tms; #define PRESSTHRESHOLD (29) // HOLDTHRESHOLD = PRESSTHRESHOLD + hold time #define HOLDTHRESHOLD (329) - +/* typedef struct{ keyevent event; // current key event int16_t counter; // press/release milliseconds counter GPIO_TypeDef *port; // key port uint16_t pin; // key pin - uint8_t changed; // the event have been changed + uint8_t changed : 1; // the event have been changed + uint8_t inverted : 1; // button inverted: 0 - passive, 1 - active } keybase; - +*/ +// HALLs are inverted as disconnected when active keybase allkeys[KEY_AMOUNT] = { - [HALL_D] = {.port = HALL_PORT, .pin = HALL_D_PIN}, - [HALL_U] = {.port = HALL_PORT, .pin = HALL_U_PIN}, + [HALL_D] = {.port = HALL_PORT, .pin = HALL_D_PIN, .inverted = 1}, + [HALL_U] = {.port = HALL_PORT, .pin = HALL_U_PIN, .inverted = 1}, [KEY_D] = {.port = BUTTON_PORT, .pin = BUTTON_D_PIN}, [KEY_U] = {.port = BUTTON_PORT, .pin = BUTTON_U_PIN}, - [DIR_D] = {.port = DIR_PORT, .pin = DIR_U_PIN}, - [DIR_U] = {.port = DIR_PORT, .pin = DIR_U_PIN} + [DIR_D] = {.port = DIR_PORT, .pin = DIR_D_PIN, .inverted = 1}, + [DIR_U] = {.port = DIR_PORT, .pin = DIR_U_PIN, .inverted = 1} }; // return 1 if something was changed @@ -56,7 +61,7 @@ int process_keys(){ for(int i = 0; i < KEY_AMOUNT; ++i){ keybase *k = &allkeys[i]; keyevent e = k->event; - if(PRESSED(k->port, k->pin)){ // key is in pressed state + if(PRESSED(k->port, k->pin) != k->inverted){ // key is in pressed state //lastUnsleep = Tms; // update activity time (any key is in pressed state) switch(e){ case EVT_NONE: // just pressed diff --git a/F1:F103/CAR_CANbus/WindShield/buttons.h b/F1:F103/CAR_CANbus/WindShield/buttons.h index e31f256..87e3254 100644 --- a/F1:F103/CAR_CANbus/WindShield/buttons.h +++ b/F1:F103/CAR_CANbus/WindShield/buttons.h @@ -42,6 +42,15 @@ typedef enum{ EVT_RELEASE // released } keyevent; +typedef struct{ + keyevent event; // current key event + int16_t counter; // press/release milliseconds counter + GPIO_TypeDef *port; // key port + uint16_t pin; // key pin + uint8_t changed : 1; // the event have been changed + uint8_t inverted : 1; // button inverted: 0 - passive, 1 - active +} keybase; + //extern uint32_t lastUnsleep; // last keys activity time int process_keys(); diff --git a/F1:F103/CAR_CANbus/WindShield/hardware.c b/F1:F103/CAR_CANbus/WindShield/hardware.c index c1029be..faa2d07 100644 --- a/F1:F103/CAR_CANbus/WindShield/hardware.c +++ b/F1:F103/CAR_CANbus/WindShield/hardware.c @@ -96,10 +96,13 @@ int motor_ctl(int32_t dir){ } accel = 1; direction = dir; + keyevent uh = keyevt(HALL_U), dh = keyevt(HALL_D); if(dir == MOTDIR_UP){ // start in positive direction (move UP) + if(uh == EVT_PRESS || uh == EVT_HOLD) return FALSE; // can't move in given direction set_up(UP_LEFT); set_pwm(PWM_RIGHT, 1); }else{ // negative (move DOWN) + if(dh == EVT_PRESS || dh == EVT_HOLD) return FALSE; set_up(UP_RIGHT); set_pwm(PWM_LEFT, 1); } @@ -134,29 +137,30 @@ void motor_process(){ } } } - keyevent uh = keyevt(HALL_U), dh = keyevt(HALL_D); // current hall states - if we cannot move upper or lower - // short key pressed - full open/close; long - move with stop after release + // short key pressed - full open/close (or stop while moving); long - move with stop after release if(MOTDIR_BREAK != newdir){ // process keys if don't need to break evt = EVT_NONE; if(keystate(KEY_U, &evt)){ - if(evt == EVT_PRESS){ // move up (don't mind EVT_HOLD - it's already moving) - if(uh != EVT_HOLD && uh != EVT_PRESS) newdir = MOTDIR_UP; + if(evt == EVT_PRESS){ + if(direction == MOTDIR_UP || direction == MOTDIR_DOWN) newdir = MOTDIR_STOP; + else newdir = MOTDIR_UP; } }else if(keystate(KEY_D, &evt)){ if(evt == EVT_PRESS){ - if(dh != EVT_HOLD && dh != EVT_PRESS) newdir = MOTDIR_DOWN; + if(direction == MOTDIR_UP || direction == MOTDIR_DOWN) newdir = MOTDIR_STOP; + else newdir = MOTDIR_DOWN; } } - if(evt == EVT_RELEASE) newdir = MOTDIR_STOP; + if(evt == EVT_RELEASE) newdir = MOTDIR_STOP; // stop after long press evt = EVT_NONE; int extsig = FALSE; // now chech external signals, they have an advantage over local keys if(keystate(DIR_U, &evt)){ // react on PRESS and both NONE/RELEASE extsig = TRUE; - if(evt == EVT_PRESS && uh != EVT_PRESS && uh != EVT_HOLD) newdir = MOTDIR_UP; + if(evt == EVT_PRESS) newdir = MOTDIR_UP; }else if(keystate(DIR_D, &evt)){ extsig = TRUE; - if(evt == EVT_PRESS && dh != EVT_PRESS && dh != EVT_HOLD) newdir = MOTDIR_DOWN; + if(evt == EVT_PRESS) newdir = MOTDIR_DOWN; } if(evt == EVT_RELEASE || (extsig && evt == EVT_NONE)){ // EVT_NONE - released after short press - do nothing; EVT_RELEASE - after hold, stop newdir = MOTDIR_STOP; diff --git a/F1:F103/CAR_CANbus/WindShield/hardware.h b/F1:F103/CAR_CANbus/WindShield/hardware.h index aa4a194..3179c6b 100644 --- a/F1:F103/CAR_CANbus/WindShield/hardware.h +++ b/F1:F103/CAR_CANbus/WindShield/hardware.h @@ -64,7 +64,8 @@ #define DIR_U_PIN (1<12) #define DIR_D_PIN (1<13) -// define BUTTONS_NEGATIVE if button pressed when ==1 +// define BUTTONS_NEGATIVE if ALL button pressed when ==1 +// (inversion of common buttons - by flag `inverted`) #ifdef BUTTONS_NEGATIVE #define PRESSED(port, pin) ((port->IDR & pin) == pin) #else diff --git a/F1:F103/CAR_CANbus/WindShield/proto.c b/F1:F103/CAR_CANbus/WindShield/proto.c index 8da9318..e96b2e8 100644 --- a/F1:F103/CAR_CANbus/WindShield/proto.c +++ b/F1:F103/CAR_CANbus/WindShield/proto.c @@ -17,6 +17,7 @@ */ #include "adc.h" +#include "buttons.h" #include "can.h" #include "hardware.h" #include "proto.h" @@ -42,6 +43,7 @@ const char *helpmsg = "'t' - get MCU temperature (*10)\n" "'u y xx' - turn on (xx==1) or off (xx==0) y (l/r) MOSFET\n" "'v' - get Vdd (*100)\n" + "'B' - current buttons state\n" "'M' - CAN bus monitoring on/off\n" "'R' - software reset\n" "'T' - get time from start (ms)\n" @@ -111,6 +113,46 @@ static int startPWM(){ return TRUE; } +static const char* keyz[KEY_AMOUNT] = { + [HALL_D] = "Hall down", + [HALL_U] = "Hall up", + [KEY_D] = "Key down", + [KEY_U] = "Key up", + [DIR_D] = "Ext down", + [DIR_U] = "Ext up" +}; + + +extern keybase allkeys[]; +TRUE_INLINE void showbtnstate(){ + for(int i = 0; i < KEY_AMOUNT; ++i){ + usart_send(keyz[i]); usart_send(": "); + switch(keyevt(i)){ + case EVT_PRESS: + usart_send("pressed"); + break; + case EVT_HOLD: + usart_send("holded"); + break; + case EVT_RELEASE: + usart_send("released after hold"); + break; + default: + usart_send("none"); + } + newline(); + } + for(int i = 0; i < KEY_AMOUNT; ++i){ + usart_send(keyz[i]); usart_send(": "); + keybase *k = &allkeys[i]; + if(!PRESSED(k->port, k->pin)) usart_send("not "); + usart_send("pressed, "); + if(!k->inverted) usart_send("not "); + usart_send("inverted"); + newline(); + } +} + /** * @brief cmd_parser - command parsing * @param txt - buffer with commands & data @@ -185,6 +227,9 @@ void cmd_parser(char *txt){ case 'v': usart_send("VDD="); usart_send(u2str(getVdd())); break; + case 'B': + showbtnstate(); + break; case 'M': flags.can_monitor = !flags.can_monitor; usart_send("CAN monitoring "); diff --git a/F1:F103/CAR_CANbus/WindShield/version.inc b/F1:F103/CAR_CANbus/WindShield/version.inc index 76ac59d..97041b9 100644 --- a/F1:F103/CAR_CANbus/WindShield/version.inc +++ b/F1:F103/CAR_CANbus/WindShield/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "21" -#define BUILD_DATE "2024-03-04" +#define BUILD_NUMBER "27" +#define BUILD_DATE "2024-03-05" diff --git a/F1:F103/CAR_CANbus/WindShield/windshield.bin b/F1:F103/CAR_CANbus/WindShield/windshield.bin index 3cffb78..fa3e890 100755 Binary files a/F1:F103/CAR_CANbus/WindShield/windshield.bin and b/F1:F103/CAR_CANbus/WindShield/windshield.bin differ diff --git a/F1:F103/CAR_CANbus/WindShield/windshield.creator.user b/F1:F103/CAR_CANbus/WindShield/windshield.creator.user index 635ea21..2d3fcea 100644 --- a/F1:F103/CAR_CANbus/WindShield/windshield.creator.user +++ b/F1:F103/CAR_CANbus/WindShield/windshield.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId