Jérémie Greffe / Mbed 2 deprecated D7A_Demo-Get-started

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

Fork of D7A_Demo_full by WizziLab

Committer:
mikl_andre
Date:
Wed Nov 25 16:36:40 2015 +0000
Revision:
8:9beb450228d4
Parent:
7:4226c77951a4
Child:
10:e16d5cfd4198
Added some prints

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 7:4226c77951a4 129 .local_timeout = 500,
Jeej 7:4226c77951a4 130 .distant_timeout = 2000,
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 3:b77b01171cc0 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 3:b77b01171cc0 193 button.attach(&button_push_isr, IRQ_FALL, 200);
Jeej 3:b77b01171cc0 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 7:4226c77951a4 204
Jeej 3:b77b01171cc0 205 // Notify alarm status
Jeej 7:4226c77951a4 206 check_status(wm1001->notify_filechange(ALARM_DATA_FILE_ID), "ALARM REPORT");
Jeej 5:e18c38942326 207 }
Jeej 5:e18c38942326 208 }
Jeej 5:e18c38942326 209
Jeej 5:e18c38942326 210 // This Thread reads the chip temperature
Jeej 5:e18c38942326 211 // and reports it every 5 minutes
Jeej 5:e18c38942326 212 void temp_thread( const void* args )
Jeej 5:e18c38942326 213 {
Jeej 7:4226c77951a4 214 // Get modem
Jeej 7:4226c77951a4 215 D7_modem* wm1001 = (D7_modem*)args;
Jeej 5:e18c38942326 216
Jeej 5:e18c38942326 217 while(true)
Jeej 5:e18c38942326 218 {
Jeej 7:4226c77951a4 219 temp_data.value = system_get_temperature();
Jeej 7:4226c77951a4 220
mikl_andre 8:9beb450228d4 221 PRINT("NOTIFY TEMPERATURE %d C\r\n", temp_data.value);
Jeej 7:4226c77951a4 222
Jeej 5:e18c38942326 223 // Notify temp value
Jeej 7:4226c77951a4 224 check_status(wm1001->notify_filechange(TEMP_DATA_FILE_ID), "TEMP REPORT");
Jeej 3:b77b01171cc0 225
Jeej 7:4226c77951a4 226 // Wait 5 minutes
Jeej 7:4226c77951a4 227 // The function Thread::wait(...) takes a uin32_t as parameter
Jeej 7:4226c77951a4 228 // but the maximum value is uin16_t (65535)
Jeej 7:4226c77951a4 229 for (uint8_t i=0 ; i<5 ; i++) { Thread::wait(60000); }
Jeej 4:1edd956b015f 230 }
Jeej 4:1edd956b015f 231 }
Jeej 4:1edd956b015f 232
Jeej 0:aa25c4c8ddbf 233 int main()
Jeej 0:aa25c4c8ddbf 234 {
Jeej 0:aa25c4c8ddbf 235 // ----- Debug session over USB Serial ----- //
Jeej 0:aa25c4c8ddbf 236 DBG_OPEN();
Jeej 1:49da0144dd4c 237
Jeej 1:49da0144dd4c 238 // Clear some lines on the terminal
Jeej 7:4226c77951a4 239 PRINT("\r\n\nBOOT\r\n");
Jeej 1:49da0144dd4c 240
Jeej 5:e18c38942326 241 // Initialize system functions
Jeej 5:e18c38942326 242 system_open();
Jeej 7:4226c77951a4 243
Jeej 7:4226c77951a4 244 // Initialize ALP modem
Jeej 7:4226c77951a4 245 D7_modem wm1001(&shield1001_config, PB_0);
Jeej 1:49da0144dd4c 246
Jeej 7:4226c77951a4 247 // Reset modem
Jeej 7:4226c77951a4 248 wm1001.reset();
Jeej 1:49da0144dd4c 249
Jeej 7:4226c77951a4 250 // Check the boot packets
Jeej 7:4226c77951a4 251 ASSERT(wm1001.wait_boot() == ALP_ERR_NO, "BOOT FAIL!\r\n");
Jeej 0:aa25c4c8ddbf 252
Jeej 7:4226c77951a4 253 // Wait for modem to notify its files if there is any
Jeej 7:4226c77951a4 254 Thread::wait(200);
Jeej 2:c3cfaa7d5bb8 255
Jeej 7:4226c77951a4 256 // Register the files
Jeej 7:4226c77951a4 257 wm1001.register_file(&revision_device_fh);
Jeej 7:4226c77951a4 258 wm1001.register_file(&alarm_data_fh);
Jeej 7:4226c77951a4 259 wm1001.register_file(&alarm_cmd_fh);
Jeej 7:4226c77951a4 260 wm1001.register_file(&temp_data_fh);
Jeej 4:1edd956b015f 261
Jeej 2:c3cfaa7d5bb8 262 // Send the Revision report
mikl_andre 8:9beb450228d4 263 PRINT("NOTIFY REVISION\r\n");
Jeej 7:4226c77951a4 264 check_status(wm1001.notify_filechange(REVISION_DEVICE_FILE_ID), "REPORT REVISION");
Jeej 2:c3cfaa7d5bb8 265
Jeej 5:e18c38942326 266 // Init Threads
Jeej 7:4226c77951a4 267 Thread t_alarm_thread(alarm_thread, &wm1001);
Jeej 7:4226c77951a4 268 Thread t_temp_thread(temp_thread, &wm1001);
Jeej 3:b77b01171cc0 269
Jeej 0:aa25c4c8ddbf 270 // Set main task to lowest priority
Jeej 0:aa25c4c8ddbf 271 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
Jeej 0:aa25c4c8ddbf 272 while(true)
Jeej 0:aa25c4c8ddbf 273 {
Jeej 0:aa25c4c8ddbf 274 // Wait to avoid beeing stuck in loop
Jeej 0:aa25c4c8ddbf 275 Thread::wait(osWaitForever);
Jeej 0:aa25c4c8ddbf 276 }
Jeej 0:aa25c4c8ddbf 277 }