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