
USED IMAGE2GLCD
Dependencies: BLE_API SharpLCD_LucidaFont mbed nRF51822
Fork of Renard_YO by
Diff: main.cpp
- Revision:
- 0:9bea6067730f
- Child:
- 1:f0635f12df8c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Jul 02 13:19:34 2014 +0000 @@ -0,0 +1,283 @@ +#include "mbed.h" +#include "DebouncedInterrupt.h" +#include "EaEpaper.h" +#include "Arial28x28.h" +#include "Arial12x12.h" + +//I/O Initialisation +DigitalOut myled(LED1); +DigitalOut motor(P0_23); +#define BUTTON_INTERRUPT_DEBOUNCE_TIME_MS 150 +DebouncedInterrupt buttonOne (P0_16); +DebouncedInterrupt buttonTwo (P0_17); + +//Epaper Init +EaEpaper epaper(P0_0, //PWR_CONTROL + P0_1, //BORDER CONTROL + P0_2, //DISCHARGE + P0_3, //RESET + P0_4, //BUSY + P0_5, //SSEL + P0_6, //PWM + P0_12,P0_13,P0_15, //MOSI,MISO,SCLK + P0_22,P0_20);//SDA, SDL + +//Notification Data struct +#define NOTIFICATION_TEXT_MAX_LENGTH 20 +#define NOTIFICATION_TYPE_CALL 0x01 +#define NOTIFICATION_TYPE_SMS 0x02 +#define NOTIFICATION_TYPE_EMAIL 0x03 +#define NOTIFICATION_TYPE_EVENT 0x04 +#define NOTIFICATION_STATE_DELETED 0x00 +#define NOTIFICATION_STATE_UNREAD 0x01 +#define NOTIFICATION_STATE_READ 0x02 +struct Notification{ + uint8_t type; + uint8_t state; + char primary_text[NOTIFICATION_TEXT_MAX_LENGTH]; + char secondary_text[NOTIFICATION_TEXT_MAX_LENGTH]; + }; + +//notification storage +#define MAX_NOTIFICATIONS 20 +Notification notifications[MAX_NOTIFICATIONS]; +uint8_t notification_count = 0; +int visible_notification_index = -1; + +//States +uint8_t needs_display_update = 0; +uint8_t has_unread = 0; + +//For LED +#define LED_BLINK_TIME_MS 500 +uint8_t led_on = 0; +Timer led_timer; + +//For Buzzer +#define BUZZ_TIME_MS 200 +#define MAX_BUZZ_COUNT 3 +uint8_t buzz_count = MAX_BUZZ_COUNT; +Timer buzz_timer; + +void setType(Notification* note, uint8_t type) { + note->type = type; +} + +uint8_t isCall(Notification note) { + return note.type == NOTIFICATION_TYPE_CALL; +} + +uint8_t isSMS(Notification note) { + return note.type == NOTIFICATION_TYPE_SMS; +} + +uint8_t isEmail(Notification note) { + return note.type == NOTIFICATION_TYPE_EMAIL; +} + +uint8_t isEvent(Notification note) { + return note.type == NOTIFICATION_TYPE_EVENT; +} + +void setState(Notification* note, uint8_t state) { + note->state = state; +} + +uint8_t isDeleted(Notification note) { + return note.state == NOTIFICATION_STATE_DELETED; +} + +uint8_t isUnread(Notification note) { + return note.state == NOTIFICATION_STATE_UNREAD; +} + +uint8_t isRead(Notification note) { + return note.state == NOTIFICATION_STATE_READ; +} + +//Update Display to show current notification... +void doDisplayUpdate() { + epaper.cls(); + if(visible_notification_index >= 0) { + //Write current notification... + epaper.set_font((unsigned char*)Arial12x12); + epaper.locate(5,5); + epaper.printf(notifications[visible_notification_index].primary_text); + epaper.locate(5,15); + epaper.printf(notifications[visible_notification_index].secondary_text); + } else { + //no notifications... + //Write current notification... + epaper.set_font((unsigned char*)Arial12x12); + epaper.locate(5,5); + epaper.printf("No Notifications"); + } + epaper.write_disp(); + needs_display_update = 0; +} + +//Request a display update.. +void requestDisplayUpdate() { + needs_display_update = 1; +} + +//Starts buzz pattern... +void startBuzz() { + //Buzz + buzz_count = 0; + buzz_timer.reset(); + buzz_timer.start(); +} + + +//Add Notification... +int addNotification(Notification note) { + //Find insertion point... + uint8_t index = 0; + for(index = 0; index < MAX_NOTIFICATIONS; index++) { + if(isDeleted(notifications[index])) { + //Here... + break; + } + } + //If here, didn't find insertion point... wrap to beginning. + if(index >= MAX_NOTIFICATIONS) index = 0; + notifications[index] = note; + //Set buzzer + startBuzz(); + //Set unread + if(isUnread(note)) has_unread = 1; + return index; +} + +void deleteNotification(int index) { + setState(¬ifications[index], NOTIFICATION_STATE_DELETED); + //Shift array elements left... + int i = 0; + for (i = index + 1; i < MAX_NOTIFICATIONS; i++) { + notifications[i - 1] = notifications[i]; + } +} + +void checkUnread(){ + uint8_t i = 0; + led_timer.stop(); + has_unread = 0; + for(i = 0; i < MAX_NOTIFICATIONS; i++) { + if(isUnread(notifications[i])) { + has_unread = 1; + led_timer.reset(); + led_timer.start(); + break; + } + } +} + +//Button One Handler +void buttonOnePressed(){ + if(visible_notification_index >= 0) { + //Increment index, wrap to beginning if last. + visible_notification_index++; + if(visible_notification_index >= MAX_NOTIFICATIONS || isDeleted(notifications[visible_notification_index])) { + visible_notification_index = 0; + if(isDeleted(notifications[visible_notification_index])) { + //Still deleted... none... + visible_notification_index = -1; + } + } + //Trigger display update... + requestDisplayUpdate(); + } +} + +//Button Two handler +void buttonTwoPressed(){ + if(visible_notification_index >= 0) { + if(!isDeleted(notifications[visible_notification_index])) { + //Exists. + if(isUnread(notifications[visible_notification_index])) { + //Toggle to 'read' + setState(¬ifications[visible_notification_index], NOTIFICATION_STATE_READ); + checkUnread(); + } else if (isRead(notifications[visible_notification_index])) { + //Already 'read'... delete, this also shifts remaining notifications down... + deleteNotification(visible_notification_index); + //If current is deleted... + if(isDeleted(notifications[visible_notification_index])) { + //We're at end, so wrap... + visible_notification_index = 0; + if(isDeleted(notifications[visible_notification_index])) { + //Still deleted... so there are none... + visible_notification_index = -1; + } + } + //Otherwise, we've got one, so we should be ok... + } + + //Trigger display update... + requestDisplayUpdate(); + } + } +} + +//Initialise notification data... +void initNotificationData() { + //For debug purposes... + notifications[0].type = NOTIFICATION_TYPE_CALL; + notifications[0].state = NOTIFICATION_STATE_UNREAD; + strcpy(notifications[0].primary_text,"Eric Gowland"); + strcpy(notifications[0].secondary_text, "07770909177"); + + notifications[1].type = NOTIFICATION_TYPE_EMAIL; + notifications[1].state = NOTIFICATION_STATE_UNREAD; + strcpy(notifications[1].primary_text, "Dear Sir I have $US"); + strcpy(notifications[1].secondary_text, "not@scam.net"); + + //Set location, etc. + visible_notification_index = 0; + checkUnread(); + requestDisplayUpdate(); + startBuzz(); +} + +//Main Program Function +int main() { + //Init Data + initNotificationData(); + //Attach interrupt handlers... + buttonOne.attach(buttonOnePressed, IRQ_RISE, BUTTON_INTERRUPT_DEBOUNCE_TIME_MS); + buttonTwo.attach(buttonTwoPressed, IRQ_RISE, BUTTON_INTERRUPT_DEBOUNCE_TIME_MS); + //Request display update... + requestDisplayUpdate(); + while(1) { + if(needs_display_update){ + doDisplayUpdate(); + } else { + //If state hasn't changed, just action timers... + //Unread LED + if(has_unread) { + //LED flashing... + if(led_timer.read_ms() > LED_BLINK_TIME_MS) { + myled = !myled; + led_timer.reset(); + } + } else { + myled = 0; + led_timer.stop(); + } + + //Buzz + if(buzz_count < MAX_BUZZ_COUNT) { + //Buzzing... + if(buzz_timer.read_ms() > BUZZ_TIME_MS) { + motor = !motor; + if(!motor) buzz_count++; + buzz_timer.reset(); + } + } else { + motor = 0; + buzz_timer.stop(); + } + } + } +} \ No newline at end of file