adjust definitions to prototype and add documentation

This commit is contained in:
King Kévin 2017-05-21 11:47:50 +02:00
parent 7edfe7b275
commit 6df6c4e461
1 changed files with 51 additions and 42 deletions

93
main.c
View File

@ -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
}
}
}