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 Nov 19 17:29:09 2015 +0000
Revision:
3:b77b01171cc0
Parent:
2:c3cfaa7d5bb8
Child:
4:1edd956b015f
Added alarm button.

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 1:49da0144dd4c 4 #include "shield.h"
Jeej 1:49da0144dd4c 5 #include "alp_serial.h"
Jeej 1:49da0144dd4c 6 #include "alp_device.h"
Jeej 2:c3cfaa7d5bb8 7 #include "alp_file.h"
Jeej 2:c3cfaa7d5bb8 8 #include "alp_report.h"
Jeej 3:b77b01171cc0 9 #include "DebouncedInterrupt.h"
Jeej 3:b77b01171cc0 10
Jeej 2:c3cfaa7d5bb8 11
Jeej 2:c3cfaa7d5bb8 12 /*
Jeej 2:c3cfaa7d5bb8 13 These data are user defined and will be used by the dash7board
Jeej 2:c3cfaa7d5bb8 14 to identify the device
Jeej 2:c3cfaa7d5bb8 15 */
Jeej 2:c3cfaa7d5bb8 16
Jeej 2:c3cfaa7d5bb8 17 #define __MANUFACTURER_ID__ 0x01234567 // Identify the manufacturer
Jeej 2:c3cfaa7d5bb8 18 #define __DEVICE_ID__ 0x89ABCDEF // Identify the device type
Jeej 2:c3cfaa7d5bb8 19
Jeej 3:b77b01171cc0 20 #define __FW_ID__ 0x01 // Firmware ID
Jeej 2:c3cfaa7d5bb8 21
Jeej 3:b77b01171cc0 22 // Firmware version
Jeej 2:c3cfaa7d5bb8 23 #define __FW_MAJOR__ 0x02
Jeej 2:c3cfaa7d5bb8 24 #define __FW_MINOR__ 0x03
Jeej 3:b77b01171cc0 25 #define __FW_PATCH__ 0x0045
Jeej 2:c3cfaa7d5bb8 26 #define __FW_HASH__ 0x86605dba
Jeej 2:c3cfaa7d5bb8 27
Jeej 2:c3cfaa7d5bb8 28 #define __HW_ID__ 0x01520C02 // Hardware ID
Jeej 2:c3cfaa7d5bb8 29
Jeej 2:c3cfaa7d5bb8 30 revision_t revision = {
Jeej 2:c3cfaa7d5bb8 31 // The two first bytes must be present in all reported files
Jeej 2:c3cfaa7d5bb8 32 // They are parsed by the dash7board
Jeej 2:c3cfaa7d5bb8 33 .nw_stat = 0,
Jeej 2:c3cfaa7d5bb8 34 .nw_seq = 255,
Jeej 2:c3cfaa7d5bb8 35 // These data are parsed to identify the device
Jeej 2:c3cfaa7d5bb8 36 .manufacturer_id = __MANUFACTURER_ID__,
Jeej 2:c3cfaa7d5bb8 37 .device_id = __DEVICE_ID__,
Jeej 2:c3cfaa7d5bb8 38 .fw_version.fw_id = __FW_ID__,
Jeej 2:c3cfaa7d5bb8 39 .fw_version.major = __FW_MAJOR__,
Jeej 2:c3cfaa7d5bb8 40 .fw_version.minor = __FW_MINOR__,
Jeej 2:c3cfaa7d5bb8 41 .fw_version.patch = __FW_PATCH__,
Jeej 2:c3cfaa7d5bb8 42 .fw_version.hash = __FW_HASH__,
Jeej 2:c3cfaa7d5bb8 43 .hw_version = __HW_ID__,
Jeej 2:c3cfaa7d5bb8 44 .fs_crc = 0
Jeej 2:c3cfaa7d5bb8 45 };
Jeej 2:c3cfaa7d5bb8 46
Jeej 3:b77b01171cc0 47 // Alarm data structure
Jeej 3:b77b01171cc0 48 TYPEDEF_STRUCT_PACKED
Jeej 3:b77b01171cc0 49 {
Jeej 3:b77b01171cc0 50 uint8_t nw_stat;
Jeej 3:b77b01171cc0 51 uint8_t nw_seq;
Jeej 3:b77b01171cc0 52 uint8_t status; // Alarm state true/false
Jeej 3:b77b01171cc0 53 } alarm_data_t;
Jeej 3:b77b01171cc0 54
Jeej 3:b77b01171cc0 55 #define ALARM_DATA_FILE_ID (224)
Jeej 3:b77b01171cc0 56 #define ALARM_DATA_FILE_SIZE ((uint16_t) sizeof(alarm_data_t))
Jeej 3:b77b01171cc0 57
Jeej 3:b77b01171cc0 58 alarm_data_t alarm_data = {
Jeej 3:b77b01171cc0 59 .nw_stat = 0,
Jeej 3:b77b01171cc0 60 .nw_seq = 255,
Jeej 3:b77b01171cc0 61 .status = 0
Jeej 3:b77b01171cc0 62 };
Jeej 3:b77b01171cc0 63
Jeej 2:c3cfaa7d5bb8 64 // Checks the status of the report send.
Jeej 2:c3cfaa7d5bb8 65 void check_status( AlpReport* report, void* param )
Jeej 2:c3cfaa7d5bb8 66 {
Jeej 2:c3cfaa7d5bb8 67 char* message = (char*)param;
Jeej 2:c3cfaa7d5bb8 68 uint8_t status = report->get_status();
Jeej 2:c3cfaa7d5bb8 69 switch (status)
Jeej 2:c3cfaa7d5bb8 70 {
Jeej 2:c3cfaa7d5bb8 71 case ALP_CMD_OK: // message is send and acknowleged
Jeej 2:c3cfaa7d5bb8 72 DPRINT("%s OK\r\n", message);
Jeej 2:c3cfaa7d5bb8 73 break;
Jeej 2:c3cfaa7d5bb8 74 case ALP_CMD_TIMEOUT: // message has not been acknowleged by modem
Jeej 2:c3cfaa7d5bb8 75 DPRINT("%s CMD TIMEOUT\r\n", message);
Jeej 2:c3cfaa7d5bb8 76 break;
Jeej 2:c3cfaa7d5bb8 77 case ALP_CMD_ERROR: // message has been acknowleged by modem but returned an error
Jeej 2:c3cfaa7d5bb8 78 DPRINT("%s CMD ERROR\r\n", message);
Jeej 2:c3cfaa7d5bb8 79 break;
Jeej 2:c3cfaa7d5bb8 80 case ALP_D7_TIMEOUT: // message has not been acknowleged by gateway
Jeej 2:c3cfaa7d5bb8 81 DPRINT("%s D7 TIMEOUT\r\n", message);
Jeej 2:c3cfaa7d5bb8 82 break;
Jeej 2:c3cfaa7d5bb8 83 case ALP_D7_ERROR: // message has been acknowleged by gateway but returned an error
Jeej 2:c3cfaa7d5bb8 84 DPRINT("%s D7 ERROR\r\n", message);
Jeej 2:c3cfaa7d5bb8 85 break;
Jeej 2:c3cfaa7d5bb8 86 default:
Jeej 2:c3cfaa7d5bb8 87 DPRINT("%s UNKNOWN ERROR %d\r\n", message, status);
Jeej 2:c3cfaa7d5bb8 88 break;
Jeej 2:c3cfaa7d5bb8 89 }
Jeej 2:c3cfaa7d5bb8 90 }
Jeej 0:aa25c4c8ddbf 91
Jeej 3:b77b01171cc0 92
Jeej 3:b77b01171cc0 93 // Semaphore for notifiying button presses
Jeej 3:b77b01171cc0 94 Semaphore button_user(1);
Jeej 3:b77b01171cc0 95
Jeej 3:b77b01171cc0 96
Jeej 3:b77b01171cc0 97 // Prints the alarm status.
Jeej 3:b77b01171cc0 98 void print_alarm( AlpReport* report, void* param )
Jeej 3:b77b01171cc0 99 {
Jeej 3:b77b01171cc0 100 alarm_data_t* alarm = (alarm_data_t*)report->get_content();
Jeej 3:b77b01171cc0 101 DPRINT("SENDING REPORT ALARM %d\r\n", alarm->status);
Jeej 3:b77b01171cc0 102 }
Jeej 3:b77b01171cc0 103
Jeej 3:b77b01171cc0 104 // Interrupt Service Routine on button press.
Jeej 3:b77b01171cc0 105 // Inverts alarm status and releases button Semaphore.
Jeej 3:b77b01171cc0 106 void button_push_isr( void )
Jeej 3:b77b01171cc0 107 {
Jeej 3:b77b01171cc0 108 DPRINT("BUTTON PUSH\r\n");
Jeej 3:b77b01171cc0 109 // Retrieve file content
Jeej 3:b77b01171cc0 110 alarm_data_t* alarm = (alarm_data_t*)alp_file_get_content(ALARM_DATA_FILE_ID);
Jeej 3:b77b01171cc0 111 // Invert alarm status
Jeej 3:b77b01171cc0 112 alarm->status = !alarm->status;
Jeej 3:b77b01171cc0 113 // Release button Semaphore
Jeej 3:b77b01171cc0 114 button_user.release();
Jeej 3:b77b01171cc0 115 }
Jeej 3:b77b01171cc0 116
Jeej 3:b77b01171cc0 117 // This Thread monitors the user button
Jeej 3:b77b01171cc0 118 // and reports the alarm status
Jeej 3:b77b01171cc0 119 void alarm_thread( const void* args )
Jeej 3:b77b01171cc0 120 {
Jeej 3:b77b01171cc0 121 // Get shield device
Jeej 3:b77b01171cc0 122 AlpDevice* shield = (AlpDevice*)args;
Jeej 3:b77b01171cc0 123
Jeej 3:b77b01171cc0 124 // Create new report
Jeej 3:b77b01171cc0 125 AlpReport report_alarm(shield, ALARM_DATA_FILE_ID);
Jeej 3:b77b01171cc0 126 report_alarm.attach_before(print_alarm, NULL);
Jeej 3:b77b01171cc0 127 report_alarm.attach_after(check_status, (void*)"REPORT ALARM");
Jeej 3:b77b01171cc0 128
Jeej 3:b77b01171cc0 129 // Enable interrupt on User button
Jeej 3:b77b01171cc0 130 //__enable_irq(); // Enable Interrupts
Jeej 3:b77b01171cc0 131 DebouncedInterrupt button(USER_BUTTON);
Jeej 3:b77b01171cc0 132 button.attach(&button_push_isr, IRQ_FALL, 200);
Jeej 3:b77b01171cc0 133
Jeej 3:b77b01171cc0 134 while(true)
Jeej 3:b77b01171cc0 135 {
Jeej 3:b77b01171cc0 136 // Wait for button press
Jeej 3:b77b01171cc0 137 button_user.wait();
Jeej 3:b77b01171cc0 138
Jeej 3:b77b01171cc0 139 // Notify alarm status
Jeej 3:b77b01171cc0 140 report_alarm.send();
Jeej 3:b77b01171cc0 141 }
Jeej 3:b77b01171cc0 142 }
Jeej 3:b77b01171cc0 143
Jeej 0:aa25c4c8ddbf 144 int main()
Jeej 0:aa25c4c8ddbf 145 {
Jeej 0:aa25c4c8ddbf 146 // ----- Debug session over USB Serial ----- //
Jeej 0:aa25c4c8ddbf 147 DBG_OPEN();
Jeej 1:49da0144dd4c 148
Jeej 1:49da0144dd4c 149 // Clear some lines on the terminal
Jeej 1:49da0144dd4c 150 DPRINT("\r\n\nBOOT\r\n");
Jeej 0:aa25c4c8ddbf 151
Jeej 1:49da0144dd4c 152 // Declare Shield NRST pin
Jeej 1:49da0144dd4c 153 DigitalOut shield_nrst(PB_0);
Jeej 1:49da0144dd4c 154
Jeej 1:49da0144dd4c 155 // Reset shield
Jeej 1:49da0144dd4c 156 shield_nrst = 0;
Jeej 1:49da0144dd4c 157
Jeej 1:49da0144dd4c 158 // Open ALP port over serial
Jeej 1:49da0144dd4c 159 // This is the physical ALP serial port
Jeej 1:49da0144dd4c 160 AlpSerial serial_shield;
Jeej 1:49da0144dd4c 161
Jeej 1:49da0144dd4c 162 // Initialize ALP device
Jeej 1:49da0144dd4c 163 // This creates an AlpDevice object abstracting the shield1001
Jeej 1:49da0144dd4c 164 // The parameters describe how to access it
Jeej 1:49da0144dd4c 165 AlpDevice shield(&serial_shield, 0, ACCESS_CLASS_EP, ALP_FILE_BLOCK_ISFB, true);
Jeej 1:49da0144dd4c 166
Jeej 1:49da0144dd4c 167 // Release reset
Jeej 1:49da0144dd4c 168 shield_nrst = 1;
Jeej 1:49da0144dd4c 169
Jeej 1:49da0144dd4c 170 // Check the shield boot packets
Jeej 1:49da0144dd4c 171 shield_check_boot(&shield);
Jeej 1:49da0144dd4c 172
Jeej 1:49da0144dd4c 173 // Wait for Shield to notify its files if there is any
Jeej 1:49da0144dd4c 174 Thread::wait(1000);
Jeej 0:aa25c4c8ddbf 175
Jeej 3:b77b01171cc0 176 // Add the files to the file system
Jeej 3:b77b01171cc0 177 alp_file_add(ALARM_DATA_FILE_ID, ALARM_DATA_FILE_SIZE, (uint8_t*)&alarm_data);
Jeej 2:c3cfaa7d5bb8 178 alp_file_add(REVISION_DEVICE_FILE_ID, REVISION_DEVICE_FILE_SIZE, (uint8_t*)&revision);
Jeej 2:c3cfaa7d5bb8 179
Jeej 2:c3cfaa7d5bb8 180 // Create the Revision report
Jeej 2:c3cfaa7d5bb8 181 AlpReport report_revision(&shield, REVISION_DEVICE_FILE_ID);
Jeej 2:c3cfaa7d5bb8 182
Jeej 2:c3cfaa7d5bb8 183 // Attach callback after report is send
Jeej 2:c3cfaa7d5bb8 184 report_revision.attach_after(check_status, (void*)"REPORT REVISION");
Jeej 2:c3cfaa7d5bb8 185
Jeej 2:c3cfaa7d5bb8 186 // Send the Revision report
Jeej 2:c3cfaa7d5bb8 187 DPRINT("SENDING REPORT REVISION\r\n");
Jeej 2:c3cfaa7d5bb8 188 report_revision.send();
Jeej 2:c3cfaa7d5bb8 189
Jeej 3:b77b01171cc0 190 // Init Thread
Jeej 3:b77b01171cc0 191 Thread t_alarm_thread(alarm_thread, &shield);
Jeej 3:b77b01171cc0 192
Jeej 0:aa25c4c8ddbf 193 // Set main task to lowest priority
Jeej 0:aa25c4c8ddbf 194 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
Jeej 0:aa25c4c8ddbf 195 while(true)
Jeej 0:aa25c4c8ddbf 196 {
Jeej 0:aa25c4c8ddbf 197 // Wait to avoid beeing stuck in loop
Jeej 0:aa25c4c8ddbf 198 Thread::wait(osWaitForever);
Jeej 0:aa25c4c8ddbf 199 }
Jeej 0:aa25c4c8ddbf 200 }