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 Feb 15 10:43:19 2016 +0000
Revision:
17:cc5aa9de745a
Parent:
12:d17ef6ce50c8
Commented tag to tag for demo. (Get started)

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 7:4226c77951a4 12 alp_err_t d7_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 7:4226c77951a4 54 alp_err_t d7_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 7:4226c77951a4 92 const d7_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 10:e16d5cfd4198 98 .local_timeout = 200,
Jeej 10:e16d5cfd4198 99 .distant_timeout = 3000,
Jeej 7:4226c77951a4 100 .write = d7_write_file,
Jeej 7:4226c77951a4 101 .read = d7_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 7:4226c77951a4 106 void check_status( uint8_t status, char* message )
Jeej 2:c3cfaa7d5bb8 107 {
Jeej 2:c3cfaa7d5bb8 108 switch (status)
Jeej 2:c3cfaa7d5bb8 109 {
Jeej 7:4226c77951a4 110 case ALP_ERR_NO: // message is send and acknowleged
Jeej 7:4226c77951a4 111 PRINT("%s OK\r\n", message);
Jeej 2:c3cfaa7d5bb8 112 break;
Jeej 2:c3cfaa7d5bb8 113 default:
Jeej 7:4226c77951a4 114 PRINT("%s ERROR %d\r\n", message, status);
Jeej 2:c3cfaa7d5bb8 115 break;
Jeej 2:c3cfaa7d5bb8 116 }
Jeej 2:c3cfaa7d5bb8 117 }
Jeej 0:aa25c4c8ddbf 118
Jeej 3:b77b01171cc0 119 // Interrupt Service Routine on button press.
Jeej 3:b77b01171cc0 120 void button_push_isr( void )
Jeej 3:b77b01171cc0 121 {
Jeej 3:b77b01171cc0 122 button_user.release();
Jeej 3:b77b01171cc0 123 }
Jeej 3:b77b01171cc0 124
Jeej 3:b77b01171cc0 125 // This Thread monitors the user button
Jeej 3:b77b01171cc0 126 // and reports the alarm status
Jeej 3:b77b01171cc0 127 void alarm_thread( const void* args )
Jeej 10:e16d5cfd4198 128 {
Jeej 7:4226c77951a4 129 // Get modem
Jeej 7:4226c77951a4 130 D7_modem* wm1001 = (D7_modem*)args;
Jeej 11:1a5a4f7cc5d3 131
Jeej 3:b77b01171cc0 132 // Enable interrupt on User button
Jeej 3:b77b01171cc0 133 DebouncedInterrupt button(USER_BUTTON);
Jeej 10:e16d5cfd4198 134 button.attach(&button_push_isr, IRQ_FALL, 500, true);
Jeej 12:d17ef6ce50c8 135
Jeej 3:b77b01171cc0 136 while(true)
Jeej 3:b77b01171cc0 137 {
Jeej 3:b77b01171cc0 138 // Wait for button press
Jeej 3:b77b01171cc0 139 button_user.wait();
Jeej 5:e18c38942326 140
Jeej 7:4226c77951a4 141 // Invert alarm status
Jeej 7:4226c77951a4 142 alarm_data.status = !alarm_data.status;
Jeej 7:4226c77951a4 143
mikl_andre 8:9beb450228d4 144 PRINT("NOTIFY ALARM STATE CHANGE %d\r\n", alarm_data.status);
Jeej 10:e16d5cfd4198 145 FLUSH();
Jeej 7:4226c77951a4 146
Jeej 3:b77b01171cc0 147 // Notify alarm status
Jeej 7:4226c77951a4 148 check_status(wm1001->notify_filechange(ALARM_DATA_FILE_ID), "ALARM REPORT");
Jeej 5:e18c38942326 149 }
Jeej 5:e18c38942326 150 }
Jeej 5:e18c38942326 151
Jeej 5:e18c38942326 152 // This Thread reads the chip temperature
Jeej 5:e18c38942326 153 // and reports it every 5 minutes
Jeej 5:e18c38942326 154 void temp_thread( const void* args )
Jeej 5:e18c38942326 155 {
Jeej 7:4226c77951a4 156 // Get modem
Jeej 7:4226c77951a4 157 D7_modem* wm1001 = (D7_modem*)args;
Jeej 5:e18c38942326 158
Jeej 5:e18c38942326 159 while(true)
Jeej 5:e18c38942326 160 {
Jeej 7:4226c77951a4 161 temp_data.value = system_get_temperature();
Jeej 7:4226c77951a4 162
mikl_andre 8:9beb450228d4 163 PRINT("NOTIFY TEMPERATURE %d C\r\n", temp_data.value);
Jeej 7:4226c77951a4 164
Jeej 5:e18c38942326 165 // Notify temp value
Jeej 7:4226c77951a4 166 check_status(wm1001->notify_filechange(TEMP_DATA_FILE_ID), "TEMP REPORT");
Jeej 3:b77b01171cc0 167
Jeej 7:4226c77951a4 168 // Wait 5 minutes
Jeej 7:4226c77951a4 169 // The function Thread::wait(...) takes a uin32_t as parameter
Jeej 7:4226c77951a4 170 // but the maximum value is uin16_t (65535)
Jeej 7:4226c77951a4 171 for (uint8_t i=0 ; i<5 ; i++) { Thread::wait(60000); }
Jeej 4:1edd956b015f 172 }
Jeej 4:1edd956b015f 173 }
Jeej 4:1edd956b015f 174
Jeej 0:aa25c4c8ddbf 175 int main()
Jeej 0:aa25c4c8ddbf 176 {
Jeej 0:aa25c4c8ddbf 177 // ----- Debug session over USB Serial ----- //
Jeej 0:aa25c4c8ddbf 178 DBG_OPEN();
Jeej 1:49da0144dd4c 179
Jeej 1:49da0144dd4c 180 // Clear some lines on the terminal
Jeej 7:4226c77951a4 181 PRINT("\r\n\nBOOT\r\n");
Jeej 1:49da0144dd4c 182
Jeej 5:e18c38942326 183 // Initialize system functions
Jeej 5:e18c38942326 184 system_open();
Jeej 7:4226c77951a4 185
Jeej 7:4226c77951a4 186 // Initialize ALP modem
Jeej 7:4226c77951a4 187 D7_modem wm1001(&shield1001_config, PB_0);
Jeej 1:49da0144dd4c 188
Jeej 7:4226c77951a4 189 // Wait for modem to notify its files if there is any
Jeej 10:e16d5cfd4198 190 Thread::wait(500);
Jeej 2:c3cfaa7d5bb8 191
Jeej 7:4226c77951a4 192 // Register the files
Jeej 7:4226c77951a4 193 wm1001.register_file(&revision_device_fh);
Jeej 7:4226c77951a4 194 wm1001.register_file(&alarm_data_fh);
Jeej 7:4226c77951a4 195 wm1001.register_file(&alarm_cmd_fh);
Jeej 10:e16d5cfd4198 196 wm1001.register_file(&temp_data_fh);
Jeej 4:1edd956b015f 197
Jeej 2:c3cfaa7d5bb8 198 // Send the Revision report
mikl_andre 8:9beb450228d4 199 PRINT("NOTIFY REVISION\r\n");
Jeej 7:4226c77951a4 200 check_status(wm1001.notify_filechange(REVISION_DEVICE_FILE_ID), "REPORT REVISION");
Jeej 2:c3cfaa7d5bb8 201
Jeej 5:e18c38942326 202 // Init Threads
Jeej 7:4226c77951a4 203 Thread t_alarm_thread(alarm_thread, &wm1001);
Jeej 7:4226c77951a4 204 Thread t_temp_thread(temp_thread, &wm1001);
Jeej 3:b77b01171cc0 205
Jeej 0:aa25c4c8ddbf 206 // Set main task to lowest priority
Jeej 0:aa25c4c8ddbf 207 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
Jeej 0:aa25c4c8ddbf 208 while(true)
Jeej 0:aa25c4c8ddbf 209 {
Jeej 0:aa25c4c8ddbf 210 // Wait to avoid beeing stuck in loop
Jeej 0:aa25c4c8ddbf 211 Thread::wait(osWaitForever);
Jeej 0:aa25c4c8ddbf 212 }
Jeej 0:aa25c4c8ddbf 213 }