1 #include <sancus/reactive.h> 2 3 #include <stdio.h> 4 5 #include "wan_commands.h" 6 7 #define SMNAME CS 8 9 SM_OUTPUT(SMNAME, load_switch_out); 10 SM_OUTPUT(SMNAME, esme_out); 11 12 13 static int SM_DATA(SMNAME) initialised; 14 static int SM_DATA(SMNAME) time; 15 static int SM_DATA(SMNAME) seq; 16 static int SM_DATA(SMNAME) consumption; 17 18 #define CHANNEL_LS 1 19 #define CHANNEL_ESME 2 20 21 void SM_FUNC(SMNAME) init(void) 22 { 23 if (! initialised) { 24 time = 0; 25 seq = 0; 26 consumption = 0; 27 initialised = 1; 28 } 29 } 30 31 SM_FUNC(SMNAME) void operate_esme_load_switch(uint8_t action) 32 { 33 uint8_t data[] __attribute__((aligned(2))) 34 = { (seq >> (8*0)) & 0xff, 35 (seq >> (8*1)) & 0xff, 36 action, 0 }; 37 38 seq += 1; 39 40 load_switch_out(data, sizeof(data)); 41 } 42 43 void SM_FUNC(SMNAME) get_input(uint8_t channel, const uint8_t *data, 44 size_t len) 45 { 46 if (channel == CHANNEL_ESME) { 47 if (len >= 3 && data[2] == GET_CONSUMPTION_DATA) { 48 consumption = 1; 49 } 50 } 51 } 52 53 SM_FUNC(SMNAME) void get_consumption_data(void) 54 { 55 uint8_t data[4] __attribute__((aligned(2))) 56 = { (seq >> (8*0)) & 0xff, 57 (seq >> (8*1)) & 0xff, 58 GET_CONSUMPTION_DATA, 0 }; 59 60 seq += 1; 61 esme_out(data, sizeof(data)); 62 } 63 64 SM_ENTRY(SMNAME) void advance_time(void) 65 { 66 if (! initialised) { init(); } 67 time++; 68 } 69 70 SM_INPUT(SMNAME, load_switch_in, data, len) 71 { 72 if (! initialised) { init(); } 73 74 get_input(CHANNEL_LS, data, len); 75 } 76 77 SM_INPUT(SMNAME, esme_in, data, len) 78 { 79 if (! initialised) { init(); } 80 81 get_input(CHANNEL_ESME, data, len); 82 } 83