Fork for Get Started Demo
Dependencies: DebouncedInterrupt dash7-alp mbed-rtos mbed wizzi-utils
Fork of D7A_Demo_full by
main.cpp@3:b77b01171cc0, 2015-11-19 (annotated)
- Committer:
- Jeej
- Date:
- Thu Nov 19 17:29:09 2015 +0000
- Revision:
- 3:b77b01171cc0
- Parent:
- 2:c3cfaa7d5bb8
- Child:
- 4:1edd956b015f
Added alarm button.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jeej | 0:aa25c4c8ddbf | 1 | #include "mbed.h" |
Jeej | 0:aa25c4c8ddbf | 2 | #include "rtos.h" |
Jeej | 0:aa25c4c8ddbf | 3 | #include "dbg.h" |
Jeej | 1:49da0144dd4c | 4 | #include "shield.h" |
Jeej | 1:49da0144dd4c | 5 | #include "alp_serial.h" |
Jeej | 1:49da0144dd4c | 6 | #include "alp_device.h" |
Jeej | 2:c3cfaa7d5bb8 | 7 | #include "alp_file.h" |
Jeej | 2:c3cfaa7d5bb8 | 8 | #include "alp_report.h" |
Jeej | 3:b77b01171cc0 | 9 | #include "DebouncedInterrupt.h" |
Jeej | 3:b77b01171cc0 | 10 | |
Jeej | 2:c3cfaa7d5bb8 | 11 | |
Jeej | 2:c3cfaa7d5bb8 | 12 | /* |
Jeej | 2:c3cfaa7d5bb8 | 13 | These data are user defined and will be used by the dash7board |
Jeej | 2:c3cfaa7d5bb8 | 14 | to identify the device |
Jeej | 2:c3cfaa7d5bb8 | 15 | */ |
Jeej | 2:c3cfaa7d5bb8 | 16 | |
Jeej | 2:c3cfaa7d5bb8 | 17 | #define __MANUFACTURER_ID__ 0x01234567 // Identify the manufacturer |
Jeej | 2:c3cfaa7d5bb8 | 18 | #define __DEVICE_ID__ 0x89ABCDEF // Identify the device type |
Jeej | 2:c3cfaa7d5bb8 | 19 | |
Jeej | 3:b77b01171cc0 | 20 | #define __FW_ID__ 0x01 // Firmware ID |
Jeej | 2:c3cfaa7d5bb8 | 21 | |
Jeej | 3:b77b01171cc0 | 22 | // Firmware version |
Jeej | 2:c3cfaa7d5bb8 | 23 | #define __FW_MAJOR__ 0x02 |
Jeej | 2:c3cfaa7d5bb8 | 24 | #define __FW_MINOR__ 0x03 |
Jeej | 3:b77b01171cc0 | 25 | #define __FW_PATCH__ 0x0045 |
Jeej | 2:c3cfaa7d5bb8 | 26 | #define __FW_HASH__ 0x86605dba |
Jeej | 2:c3cfaa7d5bb8 | 27 | |
Jeej | 2:c3cfaa7d5bb8 | 28 | #define __HW_ID__ 0x01520C02 // Hardware ID |
Jeej | 2:c3cfaa7d5bb8 | 29 | |
Jeej | 2:c3cfaa7d5bb8 | 30 | revision_t revision = { |
Jeej | 2:c3cfaa7d5bb8 | 31 | // The two first bytes must be present in all reported files |
Jeej | 2:c3cfaa7d5bb8 | 32 | // They are parsed by the dash7board |
Jeej | 2:c3cfaa7d5bb8 | 33 | .nw_stat = 0, |
Jeej | 2:c3cfaa7d5bb8 | 34 | .nw_seq = 255, |
Jeej | 2:c3cfaa7d5bb8 | 35 | // These data are parsed to identify the device |
Jeej | 2:c3cfaa7d5bb8 | 36 | .manufacturer_id = __MANUFACTURER_ID__, |
Jeej | 2:c3cfaa7d5bb8 | 37 | .device_id = __DEVICE_ID__, |
Jeej | 2:c3cfaa7d5bb8 | 38 | .fw_version.fw_id = __FW_ID__, |
Jeej | 2:c3cfaa7d5bb8 | 39 | .fw_version.major = __FW_MAJOR__, |
Jeej | 2:c3cfaa7d5bb8 | 40 | .fw_version.minor = __FW_MINOR__, |
Jeej | 2:c3cfaa7d5bb8 | 41 | .fw_version.patch = __FW_PATCH__, |
Jeej | 2:c3cfaa7d5bb8 | 42 | .fw_version.hash = __FW_HASH__, |
Jeej | 2:c3cfaa7d5bb8 | 43 | .hw_version = __HW_ID__, |
Jeej | 2:c3cfaa7d5bb8 | 44 | .fs_crc = 0 |
Jeej | 2:c3cfaa7d5bb8 | 45 | }; |
Jeej | 2:c3cfaa7d5bb8 | 46 | |
Jeej | 3:b77b01171cc0 | 47 | // Alarm data structure |
Jeej | 3:b77b01171cc0 | 48 | TYPEDEF_STRUCT_PACKED |
Jeej | 3:b77b01171cc0 | 49 | { |
Jeej | 3:b77b01171cc0 | 50 | uint8_t nw_stat; |
Jeej | 3:b77b01171cc0 | 51 | uint8_t nw_seq; |
Jeej | 3:b77b01171cc0 | 52 | uint8_t status; // Alarm state true/false |
Jeej | 3:b77b01171cc0 | 53 | } alarm_data_t; |
Jeej | 3:b77b01171cc0 | 54 | |
Jeej | 3:b77b01171cc0 | 55 | #define ALARM_DATA_FILE_ID (224) |
Jeej | 3:b77b01171cc0 | 56 | #define ALARM_DATA_FILE_SIZE ((uint16_t) sizeof(alarm_data_t)) |
Jeej | 3:b77b01171cc0 | 57 | |
Jeej | 3:b77b01171cc0 | 58 | alarm_data_t alarm_data = { |
Jeej | 3:b77b01171cc0 | 59 | .nw_stat = 0, |
Jeej | 3:b77b01171cc0 | 60 | .nw_seq = 255, |
Jeej | 3:b77b01171cc0 | 61 | .status = 0 |
Jeej | 3:b77b01171cc0 | 62 | }; |
Jeej | 3:b77b01171cc0 | 63 | |
Jeej | 2:c3cfaa7d5bb8 | 64 | // Checks the status of the report send. |
Jeej | 2:c3cfaa7d5bb8 | 65 | void check_status( AlpReport* report, void* param ) |
Jeej | 2:c3cfaa7d5bb8 | 66 | { |
Jeej | 2:c3cfaa7d5bb8 | 67 | char* message = (char*)param; |
Jeej | 2:c3cfaa7d5bb8 | 68 | uint8_t status = report->get_status(); |
Jeej | 2:c3cfaa7d5bb8 | 69 | switch (status) |
Jeej | 2:c3cfaa7d5bb8 | 70 | { |
Jeej | 2:c3cfaa7d5bb8 | 71 | case ALP_CMD_OK: // message is send and acknowleged |
Jeej | 2:c3cfaa7d5bb8 | 72 | DPRINT("%s OK\r\n", message); |
Jeej | 2:c3cfaa7d5bb8 | 73 | break; |
Jeej | 2:c3cfaa7d5bb8 | 74 | case ALP_CMD_TIMEOUT: // message has not been acknowleged by modem |
Jeej | 2:c3cfaa7d5bb8 | 75 | DPRINT("%s CMD TIMEOUT\r\n", message); |
Jeej | 2:c3cfaa7d5bb8 | 76 | break; |
Jeej | 2:c3cfaa7d5bb8 | 77 | case ALP_CMD_ERROR: // message has been acknowleged by modem but returned an error |
Jeej | 2:c3cfaa7d5bb8 | 78 | DPRINT("%s CMD ERROR\r\n", message); |
Jeej | 2:c3cfaa7d5bb8 | 79 | break; |
Jeej | 2:c3cfaa7d5bb8 | 80 | case ALP_D7_TIMEOUT: // message has not been acknowleged by gateway |
Jeej | 2:c3cfaa7d5bb8 | 81 | DPRINT("%s D7 TIMEOUT\r\n", message); |
Jeej | 2:c3cfaa7d5bb8 | 82 | break; |
Jeej | 2:c3cfaa7d5bb8 | 83 | case ALP_D7_ERROR: // message has been acknowleged by gateway but returned an error |
Jeej | 2:c3cfaa7d5bb8 | 84 | DPRINT("%s D7 ERROR\r\n", message); |
Jeej | 2:c3cfaa7d5bb8 | 85 | break; |
Jeej | 2:c3cfaa7d5bb8 | 86 | default: |
Jeej | 2:c3cfaa7d5bb8 | 87 | DPRINT("%s UNKNOWN ERROR %d\r\n", message, status); |
Jeej | 2:c3cfaa7d5bb8 | 88 | break; |
Jeej | 2:c3cfaa7d5bb8 | 89 | } |
Jeej | 2:c3cfaa7d5bb8 | 90 | } |
Jeej | 0:aa25c4c8ddbf | 91 | |
Jeej | 3:b77b01171cc0 | 92 | |
Jeej | 3:b77b01171cc0 | 93 | // Semaphore for notifiying button presses |
Jeej | 3:b77b01171cc0 | 94 | Semaphore button_user(1); |
Jeej | 3:b77b01171cc0 | 95 | |
Jeej | 3:b77b01171cc0 | 96 | |
Jeej | 3:b77b01171cc0 | 97 | // Prints the alarm status. |
Jeej | 3:b77b01171cc0 | 98 | void print_alarm( AlpReport* report, void* param ) |
Jeej | 3:b77b01171cc0 | 99 | { |
Jeej | 3:b77b01171cc0 | 100 | alarm_data_t* alarm = (alarm_data_t*)report->get_content(); |
Jeej | 3:b77b01171cc0 | 101 | DPRINT("SENDING REPORT ALARM %d\r\n", alarm->status); |
Jeej | 3:b77b01171cc0 | 102 | } |
Jeej | 3:b77b01171cc0 | 103 | |
Jeej | 3:b77b01171cc0 | 104 | // Interrupt Service Routine on button press. |
Jeej | 3:b77b01171cc0 | 105 | // Inverts alarm status and releases button Semaphore. |
Jeej | 3:b77b01171cc0 | 106 | void button_push_isr( void ) |
Jeej | 3:b77b01171cc0 | 107 | { |
Jeej | 3:b77b01171cc0 | 108 | DPRINT("BUTTON PUSH\r\n"); |
Jeej | 3:b77b01171cc0 | 109 | // Retrieve file content |
Jeej | 3:b77b01171cc0 | 110 | alarm_data_t* alarm = (alarm_data_t*)alp_file_get_content(ALARM_DATA_FILE_ID); |
Jeej | 3:b77b01171cc0 | 111 | // Invert alarm status |
Jeej | 3:b77b01171cc0 | 112 | alarm->status = !alarm->status; |
Jeej | 3:b77b01171cc0 | 113 | // Release button Semaphore |
Jeej | 3:b77b01171cc0 | 114 | button_user.release(); |
Jeej | 3:b77b01171cc0 | 115 | } |
Jeej | 3:b77b01171cc0 | 116 | |
Jeej | 3:b77b01171cc0 | 117 | // This Thread monitors the user button |
Jeej | 3:b77b01171cc0 | 118 | // and reports the alarm status |
Jeej | 3:b77b01171cc0 | 119 | void alarm_thread( const void* args ) |
Jeej | 3:b77b01171cc0 | 120 | { |
Jeej | 3:b77b01171cc0 | 121 | // Get shield device |
Jeej | 3:b77b01171cc0 | 122 | AlpDevice* shield = (AlpDevice*)args; |
Jeej | 3:b77b01171cc0 | 123 | |
Jeej | 3:b77b01171cc0 | 124 | // Create new report |
Jeej | 3:b77b01171cc0 | 125 | AlpReport report_alarm(shield, ALARM_DATA_FILE_ID); |
Jeej | 3:b77b01171cc0 | 126 | report_alarm.attach_before(print_alarm, NULL); |
Jeej | 3:b77b01171cc0 | 127 | report_alarm.attach_after(check_status, (void*)"REPORT ALARM"); |
Jeej | 3:b77b01171cc0 | 128 | |
Jeej | 3:b77b01171cc0 | 129 | // Enable interrupt on User button |
Jeej | 3:b77b01171cc0 | 130 | //__enable_irq(); // Enable Interrupts |
Jeej | 3:b77b01171cc0 | 131 | DebouncedInterrupt button(USER_BUTTON); |
Jeej | 3:b77b01171cc0 | 132 | button.attach(&button_push_isr, IRQ_FALL, 200); |
Jeej | 3:b77b01171cc0 | 133 | |
Jeej | 3:b77b01171cc0 | 134 | while(true) |
Jeej | 3:b77b01171cc0 | 135 | { |
Jeej | 3:b77b01171cc0 | 136 | // Wait for button press |
Jeej | 3:b77b01171cc0 | 137 | button_user.wait(); |
Jeej | 3:b77b01171cc0 | 138 | |
Jeej | 3:b77b01171cc0 | 139 | // Notify alarm status |
Jeej | 3:b77b01171cc0 | 140 | report_alarm.send(); |
Jeej | 3:b77b01171cc0 | 141 | } |
Jeej | 3:b77b01171cc0 | 142 | } |
Jeej | 3:b77b01171cc0 | 143 | |
Jeej | 0:aa25c4c8ddbf | 144 | int main() |
Jeej | 0:aa25c4c8ddbf | 145 | { |
Jeej | 0:aa25c4c8ddbf | 146 | // ----- Debug session over USB Serial ----- // |
Jeej | 0:aa25c4c8ddbf | 147 | DBG_OPEN(); |
Jeej | 1:49da0144dd4c | 148 | |
Jeej | 1:49da0144dd4c | 149 | // Clear some lines on the terminal |
Jeej | 1:49da0144dd4c | 150 | DPRINT("\r\n\nBOOT\r\n"); |
Jeej | 0:aa25c4c8ddbf | 151 | |
Jeej | 1:49da0144dd4c | 152 | // Declare Shield NRST pin |
Jeej | 1:49da0144dd4c | 153 | DigitalOut shield_nrst(PB_0); |
Jeej | 1:49da0144dd4c | 154 | |
Jeej | 1:49da0144dd4c | 155 | // Reset shield |
Jeej | 1:49da0144dd4c | 156 | shield_nrst = 0; |
Jeej | 1:49da0144dd4c | 157 | |
Jeej | 1:49da0144dd4c | 158 | // Open ALP port over serial |
Jeej | 1:49da0144dd4c | 159 | // This is the physical ALP serial port |
Jeej | 1:49da0144dd4c | 160 | AlpSerial serial_shield; |
Jeej | 1:49da0144dd4c | 161 | |
Jeej | 1:49da0144dd4c | 162 | // Initialize ALP device |
Jeej | 1:49da0144dd4c | 163 | // This creates an AlpDevice object abstracting the shield1001 |
Jeej | 1:49da0144dd4c | 164 | // The parameters describe how to access it |
Jeej | 1:49da0144dd4c | 165 | AlpDevice shield(&serial_shield, 0, ACCESS_CLASS_EP, ALP_FILE_BLOCK_ISFB, true); |
Jeej | 1:49da0144dd4c | 166 | |
Jeej | 1:49da0144dd4c | 167 | // Release reset |
Jeej | 1:49da0144dd4c | 168 | shield_nrst = 1; |
Jeej | 1:49da0144dd4c | 169 | |
Jeej | 1:49da0144dd4c | 170 | // Check the shield boot packets |
Jeej | 1:49da0144dd4c | 171 | shield_check_boot(&shield); |
Jeej | 1:49da0144dd4c | 172 | |
Jeej | 1:49da0144dd4c | 173 | // Wait for Shield to notify its files if there is any |
Jeej | 1:49da0144dd4c | 174 | Thread::wait(1000); |
Jeej | 0:aa25c4c8ddbf | 175 | |
Jeej | 3:b77b01171cc0 | 176 | // Add the files to the file system |
Jeej | 3:b77b01171cc0 | 177 | alp_file_add(ALARM_DATA_FILE_ID, ALARM_DATA_FILE_SIZE, (uint8_t*)&alarm_data); |
Jeej | 2:c3cfaa7d5bb8 | 178 | alp_file_add(REVISION_DEVICE_FILE_ID, REVISION_DEVICE_FILE_SIZE, (uint8_t*)&revision); |
Jeej | 2:c3cfaa7d5bb8 | 179 | |
Jeej | 2:c3cfaa7d5bb8 | 180 | // Create the Revision report |
Jeej | 2:c3cfaa7d5bb8 | 181 | AlpReport report_revision(&shield, REVISION_DEVICE_FILE_ID); |
Jeej | 2:c3cfaa7d5bb8 | 182 | |
Jeej | 2:c3cfaa7d5bb8 | 183 | // Attach callback after report is send |
Jeej | 2:c3cfaa7d5bb8 | 184 | report_revision.attach_after(check_status, (void*)"REPORT REVISION"); |
Jeej | 2:c3cfaa7d5bb8 | 185 | |
Jeej | 2:c3cfaa7d5bb8 | 186 | // Send the Revision report |
Jeej | 2:c3cfaa7d5bb8 | 187 | DPRINT("SENDING REPORT REVISION\r\n"); |
Jeej | 2:c3cfaa7d5bb8 | 188 | report_revision.send(); |
Jeej | 2:c3cfaa7d5bb8 | 189 | |
Jeej | 3:b77b01171cc0 | 190 | // Init Thread |
Jeej | 3:b77b01171cc0 | 191 | Thread t_alarm_thread(alarm_thread, &shield); |
Jeej | 3:b77b01171cc0 | 192 | |
Jeej | 0:aa25c4c8ddbf | 193 | // Set main task to lowest priority |
Jeej | 0:aa25c4c8ddbf | 194 | osThreadSetPriority(osThreadGetId(), osPriorityIdle); |
Jeej | 0:aa25c4c8ddbf | 195 | while(true) |
Jeej | 0:aa25c4c8ddbf | 196 | { |
Jeej | 0:aa25c4c8ddbf | 197 | // Wait to avoid beeing stuck in loop |
Jeej | 0:aa25c4c8ddbf | 198 | Thread::wait(osWaitForever); |
Jeej | 0:aa25c4c8ddbf | 199 | } |
Jeej | 0:aa25c4c8ddbf | 200 | } |