summaryrefslogtreecommitdiffstats
path: root/Sensor Watch Starter Project/app.c
diff options
context:
space:
mode:
authorJoey Castillo <jose.castillo@gmail.com>2021-08-25 12:15:58 -0600
committerJoey Castillo <jose.castillo@gmail.com>2021-08-25 12:15:58 -0600
commitd09d3c3c95a412ce5f5af8068205c416938510e7 (patch)
tree3881a35421aec0ad645cc43fd226e848d1cb6a1e /Sensor Watch Starter Project/app.c
parentc35e8e2b07e971c587bda9a4c28a5916312fd4cd (diff)
downloadSensor-Watch-d09d3c3c95a412ce5f5af8068205c416938510e7.tar.gz
Sensor-Watch-d09d3c3c95a412ce5f5af8068205c416938510e7.tar.bz2
Sensor-Watch-d09d3c3c95a412ce5f5af8068205c416938510e7.zip
external interrupt refactor: allow enabling in watch library functions
Diffstat (limited to 'Sensor Watch Starter Project/app.c')
-rw-r--r--Sensor Watch Starter Project/app.c71
1 files changed, 37 insertions, 34 deletions
diff --git a/Sensor Watch Starter Project/app.c b/Sensor Watch Starter Project/app.c
index 87326422..3fa3a618 100644
--- a/Sensor Watch Starter Project/app.c
+++ b/Sensor Watch Starter Project/app.c
@@ -11,17 +11,16 @@ typedef enum ApplicationMode {
} ApplicationMode;
typedef enum LightColor {
- COLOR_OFF = 0,
- COLOR_RED = 1,
- COLOR_GREEN = 2,
- COLOR_YELLOW = 3
+ COLOR_RED = 0,
+ COLOR_GREEN,
+ COLOR_YELLOW
} LightColor;
typedef struct ApplicationState {
ApplicationMode mode;
LightColor color;
+ bool light_on;
uint8_t wake_count;
- bool debounce_wait;
bool enter_deep_sleep;
} ApplicationState;
@@ -62,7 +61,6 @@ void app_wake_from_deep_sleep() {
application_state.mode = (ApplicationMode)watch_get_backup_data(0);
application_state.color = (LightColor)watch_get_backup_data(1);
application_state.wake_count = (uint8_t)watch_get_backup_data(2) + 1;
- application_state.debounce_wait = true;
}
/**
@@ -80,10 +78,18 @@ void app_wake_from_deep_sleep() {
void app_setup() {
watch_enable_led(false); // enable LED with plain digital IO, not PWM
- watch_enable_buttons();
- watch_register_button_callback(BTN_LIGHT, cb_light_pressed);
- watch_register_button_callback(BTN_MODE, cb_mode_pressed);
- watch_register_button_callback(BTN_ALARM, cb_alarm_pressed);
+ watch_enable_external_interrupts();
+ // This starter app demonstrates three different ways of using the button interrupts.
+ // The BTN_MODE interrupt only triggers on a rising edge, so the mode changes once per press.
+ watch_register_interrupt_callback(BTN_MODE, cb_mode_pressed, INTERRUPT_TRIGGER_RISING);
+ // The BTN_LIGHT interrupt triggers on both rising and falling edges. The callback then checks
+ // the pin state when triggered: on a button down event, it increments the color and turns the
+ // LED on, whereas on a button up event, it turns the light off.
+ watch_register_interrupt_callback(BTN_LIGHT, cb_light_pressed, INTERRUPT_TRIGGER_BOTH);
+ // The BTN_ALARM callback is on an external wake pin; we can avoid using the EIC for this pin
+ // by using the extwake interrupt — but note that it can only trigger on either a rising or
+ // a falling edge, not both.
+ watch_register_extwake_callback(BTN_ALARM, cb_alarm_pressed, true);
watch_enable_display();
}
@@ -95,7 +101,6 @@ void app_setup() {
* a press on one of the buttons).
*/
void app_prepare_for_sleep() {
- application_state.debounce_wait = false;
}
/**
@@ -112,19 +117,20 @@ void app_wake_from_sleep() {
*/
bool app_loop() {
// set the LED to a color
- switch (application_state.color) {
- case COLOR_OFF:
- watch_set_led_off();
- break;
- case COLOR_RED:
- watch_set_led_red();
- break;
- case COLOR_GREEN:
- watch_set_led_green();
- break;
- case COLOR_YELLOW:
- watch_set_led_yellow();
- break;
+ if (application_state.light_on) {
+ switch (application_state.color) {
+ case COLOR_RED:
+ watch_set_led_red();
+ break;
+ case COLOR_GREEN:
+ watch_set_led_green();
+ break;
+ case COLOR_YELLOW:
+ watch_set_led_yellow();
+ break;
+ }
+ } else {
+ watch_set_led_off();
}
// Display the number of times we've woken up (modulo 32 to fit in 2 digits at top right)
@@ -142,9 +148,6 @@ bool app_loop() {
break;
}
- // Wait a moment to debounce button input
- delay_ms(250);
-
if (application_state.enter_deep_sleep) {
application_state.enter_deep_sleep = false;
@@ -171,20 +174,20 @@ bool app_loop() {
// Implementations for our callback functions. Replace these with whatever functionality
// your app requires.
void cb_light_pressed() {
- if (application_state.debounce_wait) return;
- application_state.debounce_wait = true;
- application_state.color = (application_state.color + 1) % 4;
+ // always turn the light off when the pin goes low
+ if (watch_get_pin_level(BTN_LIGHT) == 0) {
+ application_state.light_on = false;
+ return;
+ }
+ application_state.color = (application_state.color + 1) % 3;
+ application_state.light_on = true;
}
void cb_mode_pressed() {
- if (application_state.debounce_wait) return;
- application_state.debounce_wait = true;
application_state.mode = (application_state.mode + 1) % 2;
}
void cb_alarm_pressed() {
- if (application_state.debounce_wait) return;
- application_state.debounce_wait = true;
// boo: http://ww1.microchip.com/downloads/en/DeviceDoc/SAM_L22_Family_Errata_DS80000782B.pdf
// Reference 15010. doesn't say it applies to PA02 but it seems it does?
// anyway can't deep sleep now :(