Fork for Get Started Demo

Dependencies:   DebouncedInterrupt dash7-alp mbed-rtos mbed wizzi-utils

Fork of D7A_Demo_full by WizziLab

Committer:
Jeej
Date:
Mon Nov 30 15:18:13 2015 +0000
Revision:
10:e16d5cfd4198
Parent:
8:9beb450228d4
Child:
11:1a5a4f7cc5d3
Some updates.

Who changed what in which revision?

UserRevisionLine numberNew 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 3:b77b01171cc0 4 #include "DebouncedInterrupt.h"
Jeej 5:e18c38942326 5 #include "system.h"
Jeej 7:4226c77951a4 6 #include "file_sys.h"
Jeej 7:4226c77951a4 7 #include "alp.h"
Jeej 2:c3cfaa7d5bb8 8
Jeej 7:4226c77951a4 9 // Semaphore for notifiying button presses
Jeej 7:4226c77951a4 10 Semaphore button_user(1);
Jeej 2:c3cfaa7d5bb8 11
Jeej 7:4226c77951a4 12 revision_t revision = {
Jeej 2:c3cfaa7d5bb8 13 .nw_stat = 0,
Jeej 2:c3cfaa7d5bb8 14 .nw_seq = 255,
Jeej 2:c3cfaa7d5bb8 15 // These data are parsed to identify the device
Jeej 2:c3cfaa7d5bb8 16 .manufacturer_id = __MANUFACTURER_ID__,
Jeej 2:c3cfaa7d5bb8 17 .device_id = __DEVICE_ID__,
Jeej 2:c3cfaa7d5bb8 18 .fw_version.fw_id = __FW_ID__,
Jeej 2:c3cfaa7d5bb8 19 .fw_version.major = __FW_MAJOR__,
Jeej 2:c3cfaa7d5bb8 20 .fw_version.minor = __FW_MINOR__,
Jeej 2:c3cfaa7d5bb8 21 .fw_version.patch = __FW_PATCH__,
Jeej 2:c3cfaa7d5bb8 22 .fw_version.hash = __FW_HASH__,
Jeej 2:c3cfaa7d5bb8 23 .hw_version = __HW_ID__,
Jeej 7:4226c77951a4 24 .fs_crc = 0,
Jeej 2:c3cfaa7d5bb8 25 };
Jeej 2:c3cfaa7d5bb8 26
Jeej 3:b77b01171cc0 27 alarm_data_t alarm_data = {
Jeej 3:b77b01171cc0 28 .nw_stat = 0,
Jeej 3:b77b01171cc0 29 .nw_seq = 255,
Jeej 7:4226c77951a4 30 .status = true,
Jeej 3:b77b01171cc0 31 };
Jeej 3:b77b01171cc0 32
Jeej 4:1edd956b015f 33 alarm_cmd_t alarm_cmd = {
Jeej 7:4226c77951a4 34 .cmd = 0,
Jeej 4:1edd956b015f 35 };
Jeej 4:1edd956b015f 36
Jeej 5:e18c38942326 37 temp_data_t temp_data = {
Jeej 5:e18c38942326 38 .nw_stat = 0,
Jeej 5:e18c38942326 39 .nw_seq = 255,
Jeej 7:4226c77951a4 40 .value = 0,
Jeej 7:4226c77951a4 41 };
Jeej 7:4226c77951a4 42
Jeej 7:4226c77951a4 43 alp_err_t d7_write_file(const uint8_t file_id,
Jeej 7:4226c77951a4 44 const uint16_t offset,
Jeej 7:4226c77951a4 45 const uint16_t file_size,
Jeej 7:4226c77951a4 46 const uint8_t* const content)
Jeej 7:4226c77951a4 47 {
Jeej 7:4226c77951a4 48 alp_err_t err = ALP_ERR_NO;
Jeej 7:4226c77951a4 49 void* file = NULL;
Jeej 7:4226c77951a4 50
Jeej 7:4226c77951a4 51 //err = write_file(file_id, offset, file_size, content);
mikl_andre 8:9beb450228d4 52 PRINT("D7 File %d Write (offset %d, size %d)\r\n", file_id, offset, file_size);
Jeej 7:4226c77951a4 53 switch (file_id)
Jeej 7:4226c77951a4 54 {
Jeej 7:4226c77951a4 55 case REVISION_DEVICE_FILE_ID:
Jeej 7:4226c77951a4 56 file = &revision;
Jeej 7:4226c77951a4 57 break;
Jeej 7:4226c77951a4 58 case ALARM_DATA_FILE_ID:
Jeej 7:4226c77951a4 59 file = &alarm_data;
Jeej 7:4226c77951a4 60 break;
Jeej 7:4226c77951a4 61 case ALARM_CMD_FILE_ID:
Jeej 7:4226c77951a4 62 file = &alarm_cmd;
Jeej 7:4226c77951a4 63 // Update alarm file
Jeej 7:4226c77951a4 64 alarm_data.status = !content[0];
Jeej 7:4226c77951a4 65 // Simulate button press
Jeej 7:4226c77951a4 66 button_user.release();
Jeej 7:4226c77951a4 67 break;
Jeej 7:4226c77951a4 68 case TEMP_DATA_FILE_ID:
Jeej 7:4226c77951a4 69 file = &temp_data;
Jeej 7:4226c77951a4 70 break;
Jeej 7:4226c77951a4 71 default:
Jeej 7:4226c77951a4 72 PRINT("Unknown file id %d\r\n", file_id);
Jeej 7:4226c77951a4 73 err = ALP_ERR_FILE_NOT_FOUND;
Jeej 7:4226c77951a4 74 break;
Jeej 7:4226c77951a4 75 }
Jeej 7:4226c77951a4 76
Jeej 7:4226c77951a4 77 if (file != NULL)
Jeej 7:4226c77951a4 78 {
Jeej 7:4226c77951a4 79 memcpy(file+offset, content, file_size);
Jeej 7:4226c77951a4 80 }
Jeej 7:4226c77951a4 81
Jeej 7:4226c77951a4 82 return err;
Jeej 7:4226c77951a4 83 }
Jeej 7:4226c77951a4 84
Jeej 7:4226c77951a4 85 alp_err_t d7_read_file( const uint8_t file_id,
Jeej 7:4226c77951a4 86 const uint16_t offset,
Jeej 7:4226c77951a4 87 const uint16_t file_size,
Jeej 7:4226c77951a4 88 uint8_t* buf)
Jeej 7:4226c77951a4 89 {
Jeej 7:4226c77951a4 90 alp_err_t err = ALP_ERR_NO;
Jeej 7:4226c77951a4 91 void* file = NULL;
Jeej 7:4226c77951a4 92
mikl_andre 8:9beb450228d4 93 PRINT("D7 File %d Read (offset %d, size %d)\r\n", file_id, offset, file_size);
mikl_andre 8:9beb450228d4 94
Jeej 7:4226c77951a4 95 switch (file_id)
Jeej 7:4226c77951a4 96 {
Jeej 7:4226c77951a4 97 case REVISION_DEVICE_FILE_ID:
Jeej 7:4226c77951a4 98 file = &revision;
Jeej 7:4226c77951a4 99 break;
Jeej 7:4226c77951a4 100 case ALARM_DATA_FILE_ID:
Jeej 7:4226c77951a4 101 file = &alarm_data;
Jeej 7:4226c77951a4 102 break;
Jeej 7:4226c77951a4 103 case ALARM_CMD_FILE_ID:
Jeej 7:4226c77951a4 104 file = &alarm_cmd;
Jeej 7:4226c77951a4 105 break;
Jeej 7:4226c77951a4 106 case TEMP_DATA_FILE_ID:
Jeej 7:4226c77951a4 107 file = &temp_data;
Jeej 7:4226c77951a4 108 break;
Jeej 7:4226c77951a4 109 default:
Jeej 7:4226c77951a4 110 PRINT("Unknown file id %d\r\n", file_id);
Jeej 7:4226c77951a4 111 err = ALP_ERR_FILE_NOT_FOUND;
Jeej 7:4226c77951a4 112 break;
Jeej 7:4226c77951a4 113 }
Jeej 7:4226c77951a4 114
Jeej 7:4226c77951a4 115 if (file != NULL)
Jeej 7:4226c77951a4 116 {
Jeej 7:4226c77951a4 117 memcpy(buf, file+offset, file_size);
Jeej 7:4226c77951a4 118 }
Jeej 7:4226c77951a4 119
Jeej 7:4226c77951a4 120 return err;
Jeej 7:4226c77951a4 121 }
Jeej 7:4226c77951a4 122
Jeej 7:4226c77951a4 123 const d7_config_t shield1001_config = {
Jeej 7:4226c77951a4 124 .tx = PB_6,
Jeej 7:4226c77951a4 125 .rx = PA_10,
Jeej 7:4226c77951a4 126 .rts = PA_5,
Jeej 7:4226c77951a4 127 .cts = PC_7,
Jeej 7:4226c77951a4 128 .rx_buffer_size = 256,
Jeej 10:e16d5cfd4198 129 .local_timeout = 200,
Jeej 10:e16d5cfd4198 130 .distant_timeout = 3000,
Jeej 7:4226c77951a4 131 .write = d7_write_file,
Jeej 7:4226c77951a4 132 .read = d7_read_file,
Jeej 7:4226c77951a4 133 };
Jeej 7:4226c77951a4 134
Jeej 7:4226c77951a4 135
Jeej 7:4226c77951a4 136 const d7_file_header_t revision_device_fh = {
Jeej 7:4226c77951a4 137 .access_class = ACCESS_CLASS_GW,
Jeej 7:4226c77951a4 138 .notify = true,
Jeej 7:4226c77951a4 139 .file_size = REVISION_DEVICE_FILE_SIZE,
Jeej 7:4226c77951a4 140 .file_id = REVISION_DEVICE_FILE_ID,
Jeej 7:4226c77951a4 141 };
Jeej 7:4226c77951a4 142
Jeej 7:4226c77951a4 143 const d7_file_header_t alarm_data_fh = {
Jeej 7:4226c77951a4 144 .access_class = ACCESS_CLASS_GW,
Jeej 7:4226c77951a4 145 .notify = true,
Jeej 7:4226c77951a4 146 .file_size = ALARM_DATA_FILE_SIZE,
Jeej 7:4226c77951a4 147 .file_id = ALARM_DATA_FILE_ID,
Jeej 7:4226c77951a4 148 };
Jeej 7:4226c77951a4 149
Jeej 7:4226c77951a4 150 const d7_file_header_t alarm_cmd_fh = {
Jeej 7:4226c77951a4 151 .access_class = ACCESS_CLASS_GW,
Jeej 7:4226c77951a4 152 .notify = false,
Jeej 7:4226c77951a4 153 .file_size = ALARM_CMD_FILE_SIZE,
Jeej 7:4226c77951a4 154 .file_id = ALARM_CMD_FILE_ID,
Jeej 7:4226c77951a4 155 };
Jeej 7:4226c77951a4 156
Jeej 7:4226c77951a4 157 const d7_file_header_t temp_data_fh = {
Jeej 7:4226c77951a4 158 .access_class = ACCESS_CLASS_GW,
Jeej 7:4226c77951a4 159 .notify = true,
Jeej 7:4226c77951a4 160 .file_size = TEMP_DATA_FILE_SIZE,
Jeej 7:4226c77951a4 161 .file_id = TEMP_DATA_FILE_ID,
Jeej 5:e18c38942326 162 };
Jeej 5:e18c38942326 163
Jeej 2:c3cfaa7d5bb8 164 // Checks the status of the report send.
Jeej 7:4226c77951a4 165 void check_status( uint8_t status, char* message )
Jeej 2:c3cfaa7d5bb8 166 {
Jeej 2:c3cfaa7d5bb8 167 switch (status)
Jeej 2:c3cfaa7d5bb8 168 {
Jeej 7:4226c77951a4 169 case ALP_ERR_NO: // message is send and acknowleged
Jeej 7:4226c77951a4 170 PRINT("%s OK\r\n", message);
Jeej 2:c3cfaa7d5bb8 171 break;
Jeej 2:c3cfaa7d5bb8 172 default:
Jeej 7:4226c77951a4 173 PRINT("%s ERROR %d\r\n", message, status);
Jeej 2:c3cfaa7d5bb8 174 break;
Jeej 2:c3cfaa7d5bb8 175 }
Jeej 2:c3cfaa7d5bb8 176 }
Jeej 0:aa25c4c8ddbf 177
Jeej 3:b77b01171cc0 178 // Interrupt Service Routine on button press.
Jeej 3:b77b01171cc0 179 void button_push_isr( void )
Jeej 3:b77b01171cc0 180 {
Jeej 3:b77b01171cc0 181 button_user.release();
Jeej 3:b77b01171cc0 182 }
Jeej 3:b77b01171cc0 183
Jeej 3:b77b01171cc0 184 // This Thread monitors the user button
Jeej 3:b77b01171cc0 185 // and reports the alarm status
Jeej 3:b77b01171cc0 186 void alarm_thread( const void* args )
Jeej 10:e16d5cfd4198 187 {
Jeej 7:4226c77951a4 188 // Get modem
Jeej 7:4226c77951a4 189 D7_modem* wm1001 = (D7_modem*)args;
Jeej 3:b77b01171cc0 190
Jeej 3:b77b01171cc0 191 // Enable interrupt on User button
Jeej 3:b77b01171cc0 192 DebouncedInterrupt button(USER_BUTTON);
Jeej 10:e16d5cfd4198 193 button.attach(&button_push_isr, IRQ_FALL, 500, true);
Jeej 10:e16d5cfd4198 194
Jeej 3:b77b01171cc0 195 while(true)
Jeej 3:b77b01171cc0 196 {
Jeej 3:b77b01171cc0 197 // Wait for button press
Jeej 3:b77b01171cc0 198 button_user.wait();
Jeej 5:e18c38942326 199
Jeej 7:4226c77951a4 200 // Invert alarm status
Jeej 7:4226c77951a4 201 alarm_data.status = !alarm_data.status;
Jeej 7:4226c77951a4 202
mikl_andre 8:9beb450228d4 203 PRINT("NOTIFY ALARM STATE CHANGE %d\r\n", alarm_data.status);
Jeej 10:e16d5cfd4198 204 FLUSH();
Jeej 7:4226c77951a4 205
Jeej 3:b77b01171cc0 206 // Notify alarm status
Jeej 7:4226c77951a4 207 check_status(wm1001->notify_filechange(ALARM_DATA_FILE_ID), "ALARM REPORT");
Jeej 5:e18c38942326 208 }
Jeej 5:e18c38942326 209 }
Jeej 5:e18c38942326 210
Jeej 5:e18c38942326 211 // This Thread reads the chip temperature
Jeej 5:e18c38942326 212 // and reports it every 5 minutes
Jeej 5:e18c38942326 213 void temp_thread( const void* args )
Jeej 5:e18c38942326 214 {
Jeej 7:4226c77951a4 215 // Get modem
Jeej 7:4226c77951a4 216 D7_modem* wm1001 = (D7_modem*)args;
Jeej 5:e18c38942326 217
Jeej 5:e18c38942326 218 while(true)
Jeej 5:e18c38942326 219 {
Jeej 7:4226c77951a4 220 temp_data.value = system_get_temperature();
Jeej 7:4226c77951a4 221
mikl_andre 8:9beb450228d4 222 PRINT("NOTIFY TEMPERATURE %d C\r\n", temp_data.value);
Jeej 7:4226c77951a4 223
Jeej 5:e18c38942326 224 // Notify temp value
Jeej 7:4226c77951a4 225 check_status(wm1001->notify_filechange(TEMP_DATA_FILE_ID), "TEMP REPORT");
Jeej 3:b77b01171cc0 226
Jeej 7:4226c77951a4 227 // Wait 5 minutes
Jeej 7:4226c77951a4 228 // The function Thread::wait(...) takes a uin32_t as parameter
Jeej 7:4226c77951a4 229 // but the maximum value is uin16_t (65535)
Jeej 7:4226c77951a4 230 for (uint8_t i=0 ; i<5 ; i++) { Thread::wait(60000); }
Jeej 4:1edd956b015f 231 }
Jeej 4:1edd956b015f 232 }
Jeej 4:1edd956b015f 233
Jeej 0:aa25c4c8ddbf 234 int main()
Jeej 0:aa25c4c8ddbf 235 {
Jeej 0:aa25c4c8ddbf 236 // ----- Debug session over USB Serial ----- //
Jeej 0:aa25c4c8ddbf 237 DBG_OPEN();
Jeej 1:49da0144dd4c 238
Jeej 1:49da0144dd4c 239 // Clear some lines on the terminal
Jeej 7:4226c77951a4 240 PRINT("\r\n\nBOOT\r\n");
Jeej 1:49da0144dd4c 241
Jeej 5:e18c38942326 242 // Initialize system functions
Jeej 5:e18c38942326 243 system_open();
Jeej 7:4226c77951a4 244
Jeej 7:4226c77951a4 245 // Initialize ALP modem
Jeej 7:4226c77951a4 246 D7_modem wm1001(&shield1001_config, PB_0);
Jeej 1:49da0144dd4c 247
Jeej 7:4226c77951a4 248 // Wait for modem to notify its files if there is any
Jeej 10:e16d5cfd4198 249 Thread::wait(500);
Jeej 2:c3cfaa7d5bb8 250
Jeej 7:4226c77951a4 251 // Register the files
Jeej 7:4226c77951a4 252 wm1001.register_file(&revision_device_fh);
Jeej 7:4226c77951a4 253 wm1001.register_file(&alarm_data_fh);
Jeej 7:4226c77951a4 254 wm1001.register_file(&alarm_cmd_fh);
Jeej 10:e16d5cfd4198 255 wm1001.register_file(&temp_data_fh);
Jeej 4:1edd956b015f 256
Jeej 2:c3cfaa7d5bb8 257 // Send the Revision report
mikl_andre 8:9beb450228d4 258 PRINT("NOTIFY REVISION\r\n");
Jeej 7:4226c77951a4 259 check_status(wm1001.notify_filechange(REVISION_DEVICE_FILE_ID), "REPORT REVISION");
Jeej 2:c3cfaa7d5bb8 260
Jeej 5:e18c38942326 261 // Init Threads
Jeej 7:4226c77951a4 262 Thread t_alarm_thread(alarm_thread, &wm1001);
Jeej 7:4226c77951a4 263 Thread t_temp_thread(temp_thread, &wm1001);
Jeej 3:b77b01171cc0 264
Jeej 0:aa25c4c8ddbf 265 // Set main task to lowest priority
Jeej 0:aa25c4c8ddbf 266 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
Jeej 0:aa25c4c8ddbf 267 while(true)
Jeej 0:aa25c4c8ddbf 268 {
Jeej 0:aa25c4c8ddbf 269 // Wait to avoid beeing stuck in loop
Jeej 0:aa25c4c8ddbf 270 Thread::wait(osWaitForever);
Jeej 0:aa25c4c8ddbf 271 }
Jeej 0:aa25c4c8ddbf 272 }