adjust definitions to prototype and add documentation
This commit is contained in:
parent
7edfe7b275
commit
6df6c4e461
93
main.c
93
main.c
|
@ -47,7 +47,7 @@
|
|||
|
||||
#define WATCHDOG_PERIOD 10000 /**< watchdog period in ms */
|
||||
|
||||
/** @defgroup main_flags flag set in interrupts to be processed in main task
|
||||
/** @defgroup main_flags flag set in interrupts to be processed in main loop
|
||||
* @{
|
||||
*/
|
||||
volatile bool rtc_tick_flag = false; /**< flag set when RTC ticked */
|
||||
|
@ -60,7 +60,7 @@ volatile bool clap_flag = false; /**< flag set on clap */
|
|||
#define SQUARE_WAVE_PIN 0 /**< pin connected to RTC DS1307 square wave output */
|
||||
volatile uint8_t rtc_seconds = 0; /**< number of seconds passed incremented by the square wave */
|
||||
|
||||
#define STANDBY_TIMEOUT 5 /**< number of seconds after last shake before going down */
|
||||
#define STANDBY_TIMEOUT 30 /**< number of seconds after last shake before going down */
|
||||
volatile uint16_t standby_timer = 0; /**< number of seconds since last wake-up/activity */
|
||||
|
||||
#define FRAME_TIMER 2 /**< timer to count frame time */
|
||||
|
@ -87,36 +87,40 @@ struct number_t {
|
|||
uint16_t number; /**< number to display (0-9999, 0xffff=off) */
|
||||
uint8_t up; /**< which of the 16 buttons is to increment the number */
|
||||
uint8_t down; /**< which of the 16 buttons is to decrement the number */
|
||||
uint8_t display; /**< which display on the channel multiplexer */
|
||||
};
|
||||
/** episode, scene, take, video 1, audio 1, video 2, audio 2 number (does not have to be in this order) */
|
||||
/** episode, scene, take, video 1, audio 1, video 2, audio 2 number (in this order) */
|
||||
struct number_t numbers[] = {
|
||||
{0, 2, 3},
|
||||
{0, 14, 15},
|
||||
{0, 10, 11},
|
||||
{0, 6, 7},
|
||||
{0, 1, 0},
|
||||
{0, 13, 12},
|
||||
{0, 5, 4},
|
||||
{0, 0, 4, 4}, // episode
|
||||
{0, 8, 12, 5}, // scene
|
||||
{0, 1, 5, 6}, // take
|
||||
{0, 2, 6, 3}, // video 1
|
||||
{0, 10, 14, 2}, // audio 1
|
||||
{0, 3, 7, 1}, // video 2
|
||||
{0, 11, 15, 0}, // audio 2
|
||||
};
|
||||
#define BUTTON_SECONDS_UP 9 /**< which of the 16 buttons is to increment the seconds */
|
||||
#define BUTTON_SECONDS_DOWN 13 /**< which of the 16 buttons is to decrement the seconds */
|
||||
|
||||
#define POWER_SWITCH_PORT B /**< port to switch power of all devices (including this micro-controller) */
|
||||
#define POWER_SWITCH_PIN 8 /**< pin to switch power of all devices (including this micro-controller) */
|
||||
#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 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
|
||||
// buttons to adjust numbers and seconds (mutliplexed in a 4x4 matrix)
|
||||
#define BUTTONS_DRIVE_PORT A /**< port used to drive the buttons rows */
|
||||
#define BUTTONS_DRIVE_PIN0 0 /**< pin used to drive buttons row 0 */
|
||||
#define BUTTONS_DRIVE_PIN1 1 /**< pin used to drive buttons row 1 */
|
||||
#define BUTTONS_DRIVE_PIN2 2 /**< pin used to drive buttons row 2 */
|
||||
#define BUTTONS_DRIVE_PIN3 3 /**< pin used to drive buttons row 3 */
|
||||
#define BUTTONS_READ_PORT A /**< port used to read the buttons columns */
|
||||
#define BUTTONS_READ_PIN0 4 /**< pin used to read buttons column 0 */
|
||||
#define BUTTONS_READ_PIN1 5 /**< pin used to read buttons column 1 */
|
||||
#define BUTTONS_READ_PIN2 6 /**< pin used to read buttons column 2 */
|
||||
#define BUTTONS_READ_PIN3 15 /**< pin used to read buttons column 3 */
|
||||
|
||||
#define CLAP_BUTTON_PORT B
|
||||
#define CLAP_BUTTON_PIN 14
|
||||
#define CLAP_BUTTON_PORT B /**< port for button to detect clap action */
|
||||
#define CLAP_BUTTON_PIN 14 /**< port for button to detect clap action */
|
||||
|
||||
/** Morse code variables, to buzz scene and take */
|
||||
#define MORSE_DOT 1 /**< unit Morse code duration in frames */
|
||||
|
@ -288,11 +292,12 @@ static void mux_select(uint8_t output)
|
|||
}
|
||||
}
|
||||
|
||||
/** encode scene and take into Morse code (in morse) */
|
||||
static void encode_morse(void)
|
||||
{
|
||||
// encode numbers (scene and take) in Morse code
|
||||
uint16_t morse_numbers[] = {numbers[0].number, numbers[1].number};
|
||||
printf("scene: %u, take: %u\n", morse_numbers[0], morse_numbers[1]);
|
||||
uint16_t morse_numbers[] = {numbers[1].number, numbers[2].number};
|
||||
printf("morsing scene: %u, take: %u\n", morse_numbers[0], morse_numbers[1]);
|
||||
for (uint8_t morse_number=0; morse_number<LENGTH(morse_numbers); morse_number++) {
|
||||
bool not_zero = false; // has the first non-zero digit been found
|
||||
if (0xffff==morse_numbers[morse_number]) { // number disabled, don't beep
|
||||
|
@ -533,7 +538,7 @@ void main(void)
|
|||
printf("could not get number from EEPROM\n");
|
||||
}
|
||||
numbers[number].number = (bytes[0]<<8)+bytes[1];
|
||||
mux_select(number);
|
||||
mux_select(numbers[number].display);
|
||||
printf("number %u: ", number);
|
||||
if (0xffff==numbers[number].number) {
|
||||
printf("off\n");
|
||||
|
@ -545,8 +550,8 @@ void main(void)
|
|||
}
|
||||
|
||||
// display date and time on MAX7219
|
||||
led_max7219_number(20000000+rtc_ds1307_time[6]*10000+rtc_ds1307_time[5]*100+rtc_ds1307_time[4], 0x14, 1); // display date on 2nd display
|
||||
led_max7219_number(rtc_ds1307_time[2]*1000000+rtc_ds1307_time[1]*10000+rtc_ds1307_time[0]*100, 0x54, 0); // display time on 1nd display
|
||||
led_max7219_number(20000000+rtc_ds1307_time[6]*10000+rtc_ds1307_time[5]*100+rtc_ds1307_time[4], 0x14, 0); // display date on 1st display
|
||||
led_max7219_number(rtc_ds1307_time[2]*1000000+rtc_ds1307_time[1]*10000+rtc_ds1307_time[0]*100, 0x54, 1); // display time on 2nd display
|
||||
led_max7219_on(0xff); // switch displays on
|
||||
|
||||
// setup frame timer
|
||||
|
@ -618,7 +623,7 @@ void main(void)
|
|||
button_flag = false; // reset button flag
|
||||
char c = '\0'; // to store received character
|
||||
bool char_flag = false; // a new character has been received
|
||||
while (true) { // infinite loop
|
||||
while (true) { // main loop
|
||||
iwdg_reset(); // kick the dog
|
||||
while (usart_received) { // data received over UART
|
||||
action = true; // action has been performed
|
||||
|
@ -670,7 +675,7 @@ void main(void)
|
|||
}
|
||||
time[6] += (frame_count/10)%10; // display frame
|
||||
time[7] += (frame_count)%10; // display frame
|
||||
led_max7219_text(time, 0); // display frame time on 1st display
|
||||
led_max7219_text(time, 1); // display frame time on 2nd display
|
||||
|
||||
// Morse the scene and take numbers over the buzzer
|
||||
if (morse_delay>0) {
|
||||
|
@ -749,7 +754,7 @@ void main(void)
|
|||
}
|
||||
}
|
||||
// display numbers on TM1637
|
||||
mux_select(number);
|
||||
mux_select(numbers[number].display);
|
||||
if (0xffff==numbers[number].number) {
|
||||
led_tm1637_off();
|
||||
} else {
|
||||
|
@ -761,14 +766,14 @@ void main(void)
|
|||
printf("could not set number on EEPROM\n");
|
||||
}
|
||||
}
|
||||
if ((buttons_diff&(1<<9) && buttons&(1<<9)) || (buttons_diff&(1<<8) && buttons&(1<<8))) { // buttons for time pressed
|
||||
if ((buttons_diff&(1<<BUTTON_SECONDS_UP) && buttons&(1<<BUTTON_SECONDS_UP)) || (buttons_diff&(1<<BUTTON_SECONDS_DOWN) && buttons&(1<<BUTTON_SECONDS_DOWN))) { // buttons for time pressed
|
||||
rtc_ds1307_time = rtc_ds1307_read_time(); // get time/date from external RTC
|
||||
if (rtc_ds1307_time==NULL) {
|
||||
printf("could not get time from DS1307: resetting\n");
|
||||
rtc_ds1307_setup(); // resetting peripheral
|
||||
} else {
|
||||
// adjust time
|
||||
if (buttons_diff&(1<<9) && buttons&(1<<9)) { // up pressed
|
||||
if (buttons_diff&(1<<BUTTON_SECONDS_UP) && buttons&(1<<BUTTON_SECONDS_UP)) { // up pressed
|
||||
if (!(23==rtc_ds1307_time[2] && 59==rtc_ds1307_time[1] && 59==rtc_ds1307_time[0])) { // don't handle date changes since it's too complex
|
||||
rtc_ds1307_time[0] += 1;
|
||||
while (rtc_ds1307_time[0]>=60) {
|
||||
|
@ -783,7 +788,7 @@ void main(void)
|
|||
rtc_ds1307_time[2] -= 24;
|
||||
}
|
||||
}
|
||||
} else if (buttons_diff&(1<<8) && buttons&(1<<8)) { // down pressed
|
||||
} else if (buttons_diff&(1<<BUTTON_SECONDS_DOWN) && buttons&(1<<BUTTON_SECONDS_DOWN)) { // down pressed
|
||||
if (!(0==rtc_ds1307_time[2] && 0==rtc_ds1307_time[1] && 0==rtc_ds1307_time[0])) { // don't handle date changes since it's too complex
|
||||
if (rtc_ds1307_time[0]>0) {
|
||||
rtc_ds1307_time[0] -= 1;
|
||||
|
@ -818,21 +823,25 @@ void main(void)
|
|||
// increment and save take if there has been a clap
|
||||
if (-2==morse_delay) {
|
||||
morse_delay = -1; // prevent incrementing multiple times
|
||||
if (numbers[1].number!=0xffff) {
|
||||
numbers[1].number = (numbers[1].number+1)%10000;
|
||||
uint8_t bytes[2] = {numbers[1].number>>8, numbers[1].number};
|
||||
if (!rtc_ds1307_write_rom(1*LENGTH(bytes), bytes, LENGTH(bytes))) {
|
||||
printf("could not set number on EEPROM\n");
|
||||
uint8_t bytes[LENGTH(numbers)*2] = {0}; // all numbers to write again in EEPROM
|
||||
for (uint8_t number=0; number<LENGTH(numbers); number++) { // increment numbers
|
||||
if (number!=0 && number!=1 && numbers[number].number!=0xffff) { // don't increment episode, scene, or disabled numbers
|
||||
numbers[number].number = (numbers[number].number+1)%10000;
|
||||
printf("incrementing %u to %u\n", number, numbers[number].number);
|
||||
}
|
||||
bytes[2*number+0] = numbers[number].number>>8; // set number to save
|
||||
bytes[2*number+1] = numbers[number].number; // set number to save
|
||||
}
|
||||
if (!rtc_ds1307_write_rom(0, bytes, LENGTH(bytes))) { // save numbers to EEPROM
|
||||
printf("could not set numbers on EEPROM\n");
|
||||
}
|
||||
printf("incrementing to take %u\n", numbers[1].number);
|
||||
}
|
||||
timer_disable_counter(TIM(BUZZER_TIMER)); // stop buzzing
|
||||
led_max7219_off(0xff); // switch off MAX7219 displays
|
||||
for (uint8_t tm1637=0; tm1637<7; tm1637++) { // switch off TM1637 displays
|
||||
mux_select(tm1637); // selecting TM1637 display
|
||||
led_tm1637_off(); // switch off TM1637 display
|
||||
}
|
||||
led_max7219_off(0xff); // switch off MAX7219 displays
|
||||
timer_disable_counter(TIM(BUZZER_TIMER)); // stop buzzing
|
||||
gpio_clear(GPIO(POWER_SWITCH_PORT), GPIO(POWER_SWITCH_PIN)); // switch power of by disconnecting from battery
|
||||
SCB_SCR |= SCB_SCR_SLEEPDEEP; // enable deep sleep
|
||||
pwr_set_standby_mode(); // go to deep sleep
|
||||
|
@ -846,7 +855,7 @@ void main(void)
|
|||
} else {
|
||||
rtc_seconds = rtc_ds1307_time[0]; // get actual number of seconds
|
||||
if (0==rtc_ds1307_time[1] && 0==rtc_ds1307_time[2]) { // new day arrived
|
||||
led_max7219_number(20000000+rtc_ds1307_time[6]*10000+rtc_ds1307_time[5]*100+rtc_ds1307_time[4], 0x14, 1); // display date on 2nd display
|
||||
led_max7219_number(20000000+rtc_ds1307_time[6]*10000+rtc_ds1307_time[5]*100+rtc_ds1307_time[4], 0x14, 0); // display date on 1st display
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue