Fork for Get Started Demo

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

Fork of D7A_Demo_full by WizziLab

Committer:
Jeej
Date:
Thu Jan 28 09:56:25 2016 +0000
Revision:
14:02bfe80b3db8
Parent:
13:218d2b6a9390
Child:
15:78f0945fbf69
Cleanup API

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 11:1a5a4f7cc5d3 6 #include "files.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 13:218d2b6a9390 12 alp_err_t d7a_write_file(const uint8_t file_id,
Jeej 7:4226c77951a4 13 const uint16_t offset,
Jeej 7:4226c77951a4 14 const uint16_t file_size,
Jeej 7:4226c77951a4 15 const uint8_t* const content)
Jeej 7:4226c77951a4 16 {
Jeej 7:4226c77951a4 17 alp_err_t err = ALP_ERR_NO;
Jeej 7:4226c77951a4 18 void* file = NULL;
Jeej 7:4226c77951a4 19
Jeej 7:4226c77951a4 20 //err = write_file(file_id, offset, file_size, content);
mikl_andre 8:9beb450228d4 21 PRINT("D7 File %d Write (offset %d, size %d)\r\n", file_id, offset, file_size);
Jeej 7:4226c77951a4 22 switch (file_id)
Jeej 7:4226c77951a4 23 {
Jeej 7:4226c77951a4 24 case REVISION_DEVICE_FILE_ID:
Jeej 7:4226c77951a4 25 file = &revision;
Jeej 7:4226c77951a4 26 break;
Jeej 7:4226c77951a4 27 case ALARM_DATA_FILE_ID:
Jeej 7:4226c77951a4 28 file = &alarm_data;
Jeej 7:4226c77951a4 29 break;
Jeej 7:4226c77951a4 30 case ALARM_CMD_FILE_ID:
Jeej 7:4226c77951a4 31 file = &alarm_cmd;
Jeej 7:4226c77951a4 32 // Update alarm file
Jeej 7:4226c77951a4 33 alarm_data.status = !content[0];
Jeej 7:4226c77951a4 34 // Simulate button press
Jeej 7:4226c77951a4 35 button_user.release();
Jeej 7:4226c77951a4 36 break;
Jeej 7:4226c77951a4 37 case TEMP_DATA_FILE_ID:
Jeej 7:4226c77951a4 38 file = &temp_data;
Jeej 7:4226c77951a4 39 break;
Jeej 7:4226c77951a4 40 default:
Jeej 7:4226c77951a4 41 PRINT("Unknown file id %d\r\n", file_id);
Jeej 7:4226c77951a4 42 err = ALP_ERR_FILE_NOT_FOUND;
Jeej 7:4226c77951a4 43 break;
Jeej 7:4226c77951a4 44 }
Jeej 7:4226c77951a4 45
Jeej 7:4226c77951a4 46 if (file != NULL)
Jeej 7:4226c77951a4 47 {
Jeej 7:4226c77951a4 48 memcpy(file+offset, content, file_size);
Jeej 7:4226c77951a4 49 }
Jeej 7:4226c77951a4 50
Jeej 7:4226c77951a4 51 return err;
Jeej 7:4226c77951a4 52 }
Jeej 12:d17ef6ce50c8 53
Jeej 13:218d2b6a9390 54 alp_err_t d7a_read_file( const uint8_t file_id,
Jeej 7:4226c77951a4 55 const uint16_t offset,
Jeej 7:4226c77951a4 56 const uint16_t file_size,
Jeej 7:4226c77951a4 57 uint8_t* buf)
Jeej 7:4226c77951a4 58 {
Jeej 7:4226c77951a4 59 alp_err_t err = ALP_ERR_NO;
Jeej 7:4226c77951a4 60 void* file = NULL;
Jeej 7:4226c77951a4 61
mikl_andre 8:9beb450228d4 62 PRINT("D7 File %d Read (offset %d, size %d)\r\n", file_id, offset, file_size);
mikl_andre 8:9beb450228d4 63
Jeej 7:4226c77951a4 64 switch (file_id)
Jeej 7:4226c77951a4 65 {
Jeej 7:4226c77951a4 66 case REVISION_DEVICE_FILE_ID:
Jeej 7:4226c77951a4 67 file = &revision;
Jeej 7:4226c77951a4 68 break;
Jeej 7:4226c77951a4 69 case ALARM_DATA_FILE_ID:
Jeej 7:4226c77951a4 70 file = &alarm_data;
Jeej 7:4226c77951a4 71 break;
Jeej 7:4226c77951a4 72 case ALARM_CMD_FILE_ID:
Jeej 7:4226c77951a4 73 file = &alarm_cmd;
Jeej 7:4226c77951a4 74 break;
Jeej 7:4226c77951a4 75 case TEMP_DATA_FILE_ID:
Jeej 7:4226c77951a4 76 file = &temp_data;
Jeej 7:4226c77951a4 77 break;
Jeej 7:4226c77951a4 78 default:
Jeej 7:4226c77951a4 79 PRINT("Unknown file id %d\r\n", file_id);
Jeej 7:4226c77951a4 80 err = ALP_ERR_FILE_NOT_FOUND;
Jeej 7:4226c77951a4 81 break;
Jeej 7:4226c77951a4 82 }
Jeej 7:4226c77951a4 83
Jeej 7:4226c77951a4 84 if (file != NULL)
Jeej 7:4226c77951a4 85 {
Jeej 7:4226c77951a4 86 memcpy(buf, file+offset, file_size);
Jeej 7:4226c77951a4 87 }
Jeej 7:4226c77951a4 88
Jeej 7:4226c77951a4 89 return err;
Jeej 7:4226c77951a4 90 }
Jeej 7:4226c77951a4 91
Jeej 13:218d2b6a9390 92 const d7a_config_t shield1001_config = {
Jeej 7:4226c77951a4 93 .tx = PB_6,
Jeej 7:4226c77951a4 94 .rx = PA_10,
Jeej 7:4226c77951a4 95 .rts = PA_5,
Jeej 7:4226c77951a4 96 .cts = PC_7,
Jeej 7:4226c77951a4 97 .rx_buffer_size = 256,
Jeej 13:218d2b6a9390 98 .local_timeout = 3000,
Jeej 13:218d2b6a9390 99 .distant_timeout = 10000,
Jeej 13:218d2b6a9390 100 .write = d7a_write_file,
Jeej 13:218d2b6a9390 101 .read = d7a_read_file,
Jeej 7:4226c77951a4 102 };
Jeej 7:4226c77951a4 103
Jeej 7:4226c77951a4 104
Jeej 2:c3cfaa7d5bb8 105 // Checks the status of the report send.
Jeej 13:218d2b6a9390 106 void check_status( alp_response_t* response, char* message )
Jeej 2:c3cfaa7d5bb8 107 {
Jeej 13:218d2b6a9390 108 if (response != NULL)
Jeej 2:c3cfaa7d5bb8 109 {
Jeej 13:218d2b6a9390 110 /*
Jeej 13:218d2b6a9390 111 Accessing the list of acknowledges.
Jeej 13:218d2b6a9390 112 */
Jeej 13:218d2b6a9390 113 if (response->nb_ack == 0)
Jeej 13:218d2b6a9390 114 {
Jeej 13:218d2b6a9390 115 PRINT("%s NO RESPONSE!\r\n", message);
Jeej 13:218d2b6a9390 116 }
Jeej 13:218d2b6a9390 117 else
Jeej 13:218d2b6a9390 118 {
Jeej 13:218d2b6a9390 119 for(uint8_t i=0 ; i < response->nb_ack ; i++)
Jeej 13:218d2b6a9390 120 {
Jeej 13:218d2b6a9390 121 PRINT("%s -%d- ERR:0x%02X UID:%02X%02X%02X%02X%02X%02X%02X%02X\r\n", message, i+1, response->ack[i].err,
Jeej 13:218d2b6a9390 122 response->ack[i].uid[0], response->ack[i].uid[1], response->ack[i].uid[2], response->ack[i].uid[3],
Jeej 13:218d2b6a9390 123 response->ack[i].uid[4], response->ack[i].uid[5], response->ack[i].uid[6], response->ack[i].uid[7]);
Jeej 13:218d2b6a9390 124 }
Jeej 13:218d2b6a9390 125 }
Jeej 13:218d2b6a9390 126
Jeej 13:218d2b6a9390 127 /*
Jeej 13:218d2b6a9390 128 Do not forget to free the response!
Jeej 13:218d2b6a9390 129 */
Jeej 13:218d2b6a9390 130 FREE(response);
Jeej 13:218d2b6a9390 131 }
Jeej 13:218d2b6a9390 132 else
Jeej 13:218d2b6a9390 133 {
Jeej 13:218d2b6a9390 134 PRINT("%s ERROR!\r\n", message);
Jeej 2:c3cfaa7d5bb8 135 }
Jeej 2:c3cfaa7d5bb8 136 }
Jeej 0:aa25c4c8ddbf 137
Jeej 3:b77b01171cc0 138 // Interrupt Service Routine on button press.
Jeej 3:b77b01171cc0 139 void button_push_isr( void )
Jeej 3:b77b01171cc0 140 {
Jeej 3:b77b01171cc0 141 button_user.release();
Jeej 3:b77b01171cc0 142 }
Jeej 3:b77b01171cc0 143
Jeej 3:b77b01171cc0 144 // This Thread monitors the user button
Jeej 3:b77b01171cc0 145 // and reports the alarm status
Jeej 3:b77b01171cc0 146 void alarm_thread( const void* args )
Jeej 10:e16d5cfd4198 147 {
Jeej 7:4226c77951a4 148 // Get modem
Jeej 13:218d2b6a9390 149 D7A_modem* wm1001 = (D7A_modem*)args;
Jeej 13:218d2b6a9390 150 uint8_t target_uid[8] = { 0x00, 0x1B, 0xC5, 0x0C, 0x70, 0x00, 0x06, 0xA7 };
Jeej 13:218d2b6a9390 151 uint8_t led_on_cmd[5] = { 0, 0, 0, 9, 2 };
Jeej 13:218d2b6a9390 152 uint8_t led_off_cmd[5] = { 0, 0, 0, 9, 3 };
Jeej 13:218d2b6a9390 153 uint8_t buf[20];
Jeej 13:218d2b6a9390 154 alp_response_t* response;
Jeej 11:1a5a4f7cc5d3 155
Jeej 3:b77b01171cc0 156 // Enable interrupt on User button
Jeej 3:b77b01171cc0 157 DebouncedInterrupt button(USER_BUTTON);
Jeej 10:e16d5cfd4198 158 button.attach(&button_push_isr, IRQ_FALL, 500, true);
Jeej 12:d17ef6ce50c8 159
Jeej 3:b77b01171cc0 160 while(true)
Jeej 3:b77b01171cc0 161 {
Jeej 3:b77b01171cc0 162 // Wait for button press
Jeej 3:b77b01171cc0 163 button_user.wait();
Jeej 5:e18c38942326 164
Jeej 13:218d2b6a9390 165 response = NULL;
Jeej 13:218d2b6a9390 166
Jeej 7:4226c77951a4 167 // Invert alarm status
Jeej 7:4226c77951a4 168 alarm_data.status = !alarm_data.status;
Jeej 7:4226c77951a4 169
mikl_andre 8:9beb450228d4 170 PRINT("NOTIFY ALARM STATE CHANGE %d\r\n", alarm_data.status);
Jeej 10:e16d5cfd4198 171 FLUSH();
Jeej 13:218d2b6a9390 172
Jeej 3:b77b01171cc0 173 // Notify alarm status
Jeej 7:4226c77951a4 174 check_status(wm1001->notify_filechange(ALARM_DATA_FILE_ID), "ALARM REPORT");
Jeej 11:1a5a4f7cc5d3 175
Jeej 11:1a5a4f7cc5d3 176 if (alarm_data.status)
Jeej 11:1a5a4f7cc5d3 177 {
Jeej 13:218d2b6a9390 178 /*
Jeej 13:218d2b6a9390 179 Writes a file in broadcast and wait for the first response
Jeej 13:218d2b6a9390 180 */
Jeej 13:218d2b6a9390 181 response = wm1001->write(NULL, ACCESS_CLASS_SC, 80, 0, 5, led_on_cmd, RESP_ANYCAST);
Jeej 13:218d2b6a9390 182
Jeej 13:218d2b6a9390 183 /*
Jeej 13:218d2b6a9390 184 Reads a file from the specified UID into 'buf'
Jeej 13:218d2b6a9390 185 When the UID is specified, the resp parameter is always ANYCAST
Jeej 13:218d2b6a9390 186 */
Jeej 13:218d2b6a9390 187 //response = wm1001->read(target_uid, ACCESS_CLASS_SC, ALARM_CMD_FILE_ID, 0, 1, buf);
Jeej 11:1a5a4f7cc5d3 188 }
Jeej 11:1a5a4f7cc5d3 189 else
Jeej 11:1a5a4f7cc5d3 190 {
Jeej 13:218d2b6a9390 191 /*
Jeej 13:218d2b6a9390 192 Writes a file in broadcast and wait for all the responses before timeout.
Jeej 13:218d2b6a9390 193 */
Jeej 13:218d2b6a9390 194 response = wm1001->write(NULL, ACCESS_CLASS_SC, 80, 0, 5, led_off_cmd, RESP_ALLCAST);
Jeej 13:218d2b6a9390 195
Jeej 13:218d2b6a9390 196 /*
Jeej 13:218d2b6a9390 197 Reads a file in broadcast and wait for all the responses before timeout.
Jeej 13:218d2b6a9390 198 'buf' is filled with the data of the last response recieved.
Jeej 13:218d2b6a9390 199 */
Jeej 13:218d2b6a9390 200 //response = wm1001->read(NULL, ACCESS_CLASS_SC, ALARM_CMD_FILE_ID, 0, 1, buf, RESP_ALLCAST);
Jeej 11:1a5a4f7cc5d3 201 }
Jeej 13:218d2b6a9390 202
Jeej 13:218d2b6a9390 203 check_status(response, "CMD");
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 13:218d2b6a9390 212 D7A_modem* wm1001 = (D7A_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
mikl_andre 8:9beb450228d4 218 PRINT("NOTIFY TEMPERATURE %d C\r\n", temp_data.value);
Jeej 7:4226c77951a4 219
Jeej 5:e18c38942326 220 // Notify temp value
Jeej 14:02bfe80b3db8 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 14:02bfe80b3db8 242 D7A_modem wm1001(&shield1001_config, PB_0);
Jeej 2:c3cfaa7d5bb8 243
Jeej 7:4226c77951a4 244 // Register the files
Jeej 14:02bfe80b3db8 245 wm1001.register_file(&revision_device_fh);
Jeej 7:4226c77951a4 246 wm1001.register_file(&alarm_data_fh);
Jeej 7:4226c77951a4 247 wm1001.register_file(&alarm_cmd_fh);
Jeej 14:02bfe80b3db8 248 wm1001.register_file(&temp_data_fh);
Jeej 4:1edd956b015f 249
Jeej 2:c3cfaa7d5bb8 250 // Send the Revision report
Jeej 14:02bfe80b3db8 251 PRINT("NOTIFY REVISION\r\n");
Jeej 14:02bfe80b3db8 252 check_status(wm1001.notify_filechange(REVISION_DEVICE_FILE_ID), "REPORT REVISION");
Jeej 2:c3cfaa7d5bb8 253
Jeej 5:e18c38942326 254 // Init Threads
Jeej 13:218d2b6a9390 255 Thread t_alarm_thread(alarm_thread, &wm1001, osPriorityNormal, DEFAULT_STACK_SIZE*8);
Jeej 14:02bfe80b3db8 256 Thread t_temp_thread(temp_thread, &wm1001, osPriorityNormal, DEFAULT_STACK_SIZE*4);
Jeej 3:b77b01171cc0 257
Jeej 0:aa25c4c8ddbf 258 // Set main task to lowest priority
Jeej 0:aa25c4c8ddbf 259 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
Jeej 0:aa25c4c8ddbf 260 while(true)
Jeej 0:aa25c4c8ddbf 261 {
Jeej 0:aa25c4c8ddbf 262 // Wait to avoid beeing stuck in loop
Jeej 0:aa25c4c8ddbf 263 Thread::wait(osWaitForever);
Jeej 0:aa25c4c8ddbf 264 }
Jeej 0:aa25c4c8ddbf 265 }