add button press detection
This commit is contained in:
parent
b5cc93bfc0
commit
11ccf9aacc
78
main.c
78
main.c
|
@ -86,6 +86,17 @@ volatile uint8_t frame_count = 0; /**< number of frames passed */
|
||||||
#define POWER_BUTTON_PORT B /**< port to detect power switching activity (to keep alive) */
|
#define POWER_BUTTON_PORT B /**< port to detect power switching activity (to keep alive) */
|
||||||
#define POWER_BUTTON_PIN 1 /**< pin to detect power switching activity (to keep alive) */
|
#define POWER_BUTTON_PIN 1 /**< pin to detect power switching activity (to keep alive) */
|
||||||
|
|
||||||
|
#define BUTTONS_DRIVE_PORT A
|
||||||
|
#define BUTTONS_DRIVE_PIN0 0
|
||||||
|
#define BUTTONS_DRIVE_PIN1 1
|
||||||
|
#define BUTTONS_DRIVE_PIN2 2
|
||||||
|
#define BUTTONS_DRIVE_PIN3 3
|
||||||
|
#define BUTTONS_READ_PORT A
|
||||||
|
#define BUTTONS_READ_PIN0 4
|
||||||
|
#define BUTTONS_READ_PIN1 5
|
||||||
|
#define BUTTONS_READ_PIN2 6
|
||||||
|
#define BUTTONS_READ_PIN3 15
|
||||||
|
|
||||||
/** user input command */
|
/** user input command */
|
||||||
static char command[32] = {0};
|
static char command[32] = {0};
|
||||||
/** user input command index */
|
/** user input command index */
|
||||||
|
@ -259,12 +270,12 @@ static void encode_morse(void)
|
||||||
{
|
{
|
||||||
bool not_zero = false;
|
bool not_zero = false;
|
||||||
for (uint8_t digit=0; digit<4; digit++) {
|
for (uint8_t digit=0; digit<4; digit++) {
|
||||||
uint16_t number = 40;
|
uint16_t number = 42;
|
||||||
|
// get only the digit from the number
|
||||||
for (uint8_t divide=digit; divide<3; divide++) {
|
for (uint8_t divide=digit; divide<3; divide++) {
|
||||||
number /= 10;
|
number /= 10;
|
||||||
}
|
}
|
||||||
number %= 10;
|
number %= 10;
|
||||||
printf("%u: %u\n", digit, number);
|
|
||||||
// remember when we found the first non-zero digit
|
// remember when we found the first non-zero digit
|
||||||
if (number!=0 || digit==3) {
|
if (number!=0 || digit==3) {
|
||||||
not_zero = true;
|
not_zero = true;
|
||||||
|
@ -413,15 +424,6 @@ void main(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// disable internal RTC
|
|
||||||
printf("disable internal RTC: ");
|
|
||||||
rcc_periph_clock_enable(RCC_PWR); // enable power domain clock
|
|
||||||
rcc_periph_clock_enable(RCC_BKP); // enable backup domain clock
|
|
||||||
pwr_disable_backup_domain_write_protect(); // enable write on backup domain (including RTC)
|
|
||||||
RCC_BDCR &= ~RCC_BDCR_RTCEN; // disable RTC
|
|
||||||
pwr_enable_backup_domain_write_protect(); // re-enable write protect
|
|
||||||
printf("OK\n");
|
|
||||||
|
|
||||||
// setup external RTC
|
// setup external RTC
|
||||||
printf("setup external RTC: ");
|
printf("setup external RTC: ");
|
||||||
rtc_ds1307_setup(); // setup external RTC module
|
rtc_ds1307_setup(); // setup external RTC module
|
||||||
|
@ -513,7 +515,7 @@ void main(void)
|
||||||
printf("OK\n");
|
printf("OK\n");
|
||||||
|
|
||||||
// setup PWM for piezo-buzzer
|
// setup PWM for piezo-buzzer
|
||||||
printf("setup piezo-buzzer timer: ");
|
printf("setup piezo-buzzer PWM timer: ");
|
||||||
rcc_periph_clock_enable(RCC_GPIO(BUZZER_1_PORT)); // enable clock for GPIO peripheral
|
rcc_periph_clock_enable(RCC_GPIO(BUZZER_1_PORT)); // enable clock for GPIO peripheral
|
||||||
rcc_periph_clock_enable(RCC_AFIO); // enable clock for alternate function (PWM)
|
rcc_periph_clock_enable(RCC_AFIO); // enable clock for alternate function (PWM)
|
||||||
gpio_primary_remap(AFIO_MAPR_SWJ_MASK, AFIO_MAPR_TIM1_REMAP_PARTIAL_REMAP); // remap TIM1_CH1N to PA7 instead of PB13
|
gpio_primary_remap(AFIO_MAPR_SWJ_MASK, AFIO_MAPR_TIM1_REMAP_PARTIAL_REMAP); // remap TIM1_CH1N to PA7 instead of PB13
|
||||||
|
@ -534,8 +536,18 @@ void main(void)
|
||||||
timer_generate_event(TIM(BUZZER_TIMER), TIM_EGR_UG); // generate update event to reload registers and reset counter
|
timer_generate_event(TIM(BUZZER_TIMER), TIM_EGR_UG); // generate update event to reload registers and reset counter
|
||||||
printf("OK\n");
|
printf("OK\n");
|
||||||
|
|
||||||
|
// setup GPIO for reading buttons
|
||||||
|
printf("setup button inputs: ");
|
||||||
|
rcc_periph_clock_enable(RCC_GPIO(BUTTONS_DRIVE_PORT)); // enable clock for GPIO port domain
|
||||||
|
// no need to configure the driving line modes since this will be done when they need to be driven
|
||||||
|
rcc_periph_clock_enable(RCC_GPIO(BUTTONS_READ_PORT)); // enable clock for GPIO port domain
|
||||||
|
gpio_set_mode(GPIO(BUTTONS_READ_PORT), GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN, GPIO(BUTTONS_READ_PIN0)|GPIO(BUTTONS_READ_PIN1)|GPIO(BUTTONS_READ_PIN2)|GPIO(BUTTONS_READ_PIN3)); // set read lines as input
|
||||||
|
gpio_primary_remap(AFIO_MAPR_SWJ_CFG_JTAG_OFF_SW_ON, 0); // enable PA15 (JTDI per default)
|
||||||
|
gpio_clear(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN0)|GPIO(BUTTONS_READ_PIN1)|GPIO(BUTTONS_READ_PIN2)|GPIO(BUTTONS_READ_PIN3)); // pull read lines low since they will be high when driven and button is pressed
|
||||||
|
uint16_t buttons = 0;
|
||||||
|
|
||||||
encode_morse();
|
encode_morse();
|
||||||
bool announce = true;
|
bool announce = false;
|
||||||
|
|
||||||
// main loop
|
// main loop
|
||||||
printf("command input: ready\n");
|
printf("command input: ready\n");
|
||||||
|
@ -577,7 +589,8 @@ void main(void)
|
||||||
while (frame_flag) { // a frame has passed
|
while (frame_flag) { // a frame has passed
|
||||||
frame_flag = false; // reset flag
|
frame_flag = false; // reset flag
|
||||||
action = true; // action has been performed
|
action = true; // action has been performed
|
||||||
if (announce) { // announce the scene and take using Morse code over the buzzer
|
// announce the scene and take using Morse code over the buzzer
|
||||||
|
if (announce) {
|
||||||
while (morse_i<LENGTH(morse)) {
|
while (morse_i<LENGTH(morse)) {
|
||||||
if (morse[morse_i]) { // skip empty codes
|
if (morse[morse_i]) { // skip empty codes
|
||||||
if (morse_i%2) { // switch buzzer on for odd code
|
if (morse_i%2) { // switch buzzer on for odd code
|
||||||
|
@ -595,6 +608,41 @@ void main(void)
|
||||||
announce = false; // announce finished
|
announce = false; // announce finished
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// read button inputs (drive and read each row since they are multiplexed)
|
||||||
|
uint16_t buttons_new = 0;
|
||||||
|
gpio_set_mode(GPIO(BUTTONS_DRIVE_PORT), GPIO_MODE_OUTPUT_10_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO(BUTTONS_DRIVE_PIN0));
|
||||||
|
gpio_set(GPIO(BUTTONS_DRIVE_PORT), GPIO(BUTTONS_DRIVE_PIN0));
|
||||||
|
gpio_set_mode(GPIO(BUTTONS_DRIVE_PORT), GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO(BUTTONS_DRIVE_PIN1)|GPIO(BUTTONS_DRIVE_PIN2)|GPIO(BUTTONS_DRIVE_PIN3));
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN0)) ? 1 : 0)<<0);
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN1)) ? 1 : 0)<<1);
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN2)) ? 1 : 0)<<2);
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN3)) ? 1 : 0)<<3);
|
||||||
|
gpio_set_mode(GPIO(BUTTONS_DRIVE_PORT), GPIO_MODE_OUTPUT_10_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO(BUTTONS_DRIVE_PIN1));
|
||||||
|
gpio_set(GPIO(BUTTONS_DRIVE_PORT), GPIO(BUTTONS_DRIVE_PIN1));
|
||||||
|
gpio_set_mode(GPIO(BUTTONS_DRIVE_PORT), GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO(BUTTONS_DRIVE_PIN0)|GPIO(BUTTONS_DRIVE_PIN2)|GPIO(BUTTONS_DRIVE_PIN3));
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN0)) ? 1 : 0)<<4);
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN1)) ? 1 : 0)<<5);
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN2)) ? 1 : 0)<<6);
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN3)) ? 1 : 0)<<7);
|
||||||
|
gpio_set_mode(GPIO(BUTTONS_DRIVE_PORT), GPIO_MODE_OUTPUT_10_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO(BUTTONS_DRIVE_PIN2));
|
||||||
|
gpio_set(GPIO(BUTTONS_DRIVE_PORT), GPIO(BUTTONS_DRIVE_PIN2));
|
||||||
|
gpio_set_mode(GPIO(BUTTONS_DRIVE_PORT), GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO(BUTTONS_DRIVE_PIN0)|GPIO(BUTTONS_DRIVE_PIN1)|GPIO(BUTTONS_DRIVE_PIN3));
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN0)) ? 1 : 0)<<8);
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN1)) ? 1 : 0)<<9);
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN2)) ? 1 : 0)<<10);
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN3)) ? 1 : 0)<<11);
|
||||||
|
gpio_set_mode(GPIO(BUTTONS_DRIVE_PORT), GPIO_MODE_OUTPUT_10_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO(BUTTONS_DRIVE_PIN3));
|
||||||
|
gpio_set(GPIO(BUTTONS_DRIVE_PORT), GPIO(BUTTONS_DRIVE_PIN3));
|
||||||
|
gpio_set_mode(GPIO(BUTTONS_DRIVE_PORT), GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO(BUTTONS_DRIVE_PIN0)|GPIO(BUTTONS_DRIVE_PIN1)|GPIO(BUTTONS_DRIVE_PIN2));
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN0)) ? 1 : 0)<<12);
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN1)) ? 1 : 0)<<13);
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN2)) ? 1 : 0)<<14);
|
||||||
|
buttons_new |= ((gpio_get(GPIO(BUTTONS_READ_PORT), GPIO(BUTTONS_READ_PIN3)) ? 1 : 0)<<15);
|
||||||
|
if (buttons_new!=buttons) { // only do something if there is a change
|
||||||
|
buttons = buttons_new; // save new state
|
||||||
|
printf("button pressed: %016b\n", buttons);
|
||||||
|
}
|
||||||
|
|
||||||
char time[] = "00000000"; // time to display
|
char time[] = "00000000"; // time to display
|
||||||
time[0] += (rtc_ds1307_time[2]/10)%10; // display hours
|
time[0] += (rtc_ds1307_time[2]/10)%10; // display hours
|
||||||
time[1] += (rtc_ds1307_time[2])%10; // display hours
|
time[1] += (rtc_ds1307_time[2])%10; // display hours
|
||||||
|
@ -617,7 +665,7 @@ void main(void)
|
||||||
rtc_tick_flag = false; // reset flag
|
rtc_tick_flag = false; // reset flag
|
||||||
action = true; // action has been performed
|
action = true; // action has been performed
|
||||||
led_toggle(); // toggle LED (good to indicate if main function is stuck)
|
led_toggle(); // toggle LED (good to indicate if main function is stuck)
|
||||||
if (standby_timer>=STANDBY_TIMEOUT) { // standby timeout complete
|
if (standby_timer>=STANDBY_TIMEOUT && false) { // standby timeout complete
|
||||||
// go into standby mode
|
// go into standby mode
|
||||||
printf("shutting down\n");
|
printf("shutting down\n");
|
||||||
led_max7219_off(0xff); // switch off MAX7219 displays
|
led_max7219_off(0xff); // switch off MAX7219 displays
|
||||||
|
|
Loading…
Reference in New Issue