Fork for Get Started Demo

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

Fork of D7A_Demo_full by WizziLab

Committer:
Jeej
Date:
Wed Nov 25 14:19:03 2015 +0000
Revision:
7:4226c77951a4
Parent:
6:897d29f7c89a
Child:
8:9beb450228d4
Complete D7 test.

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