root / tidsense / report.c @ 172:8c8328364b9d
History | View | Annotate | Download (2.8 kB)
1 | #include "nv.h" |
---|---|
2 | #include "assoc.h" |
3 | #include "node.h" |
4 | #include "network.h" |
5 | #include "power.h" |
6 | #include "tidsense.h" |
7 | #include "debug.h" |
8 | #include "report.h" |
9 | |
10 | static void report_confirm(NWK_DataReq_t *req) { |
11 | static uint8_t error_count = 0; |
12 | |
13 | switch(req->status) {
|
14 | case NWK_SUCCESS_STATUS:
|
15 | app_handle_ack(req->control); |
16 | error_count = 0;
|
17 | break;
|
18 | case NWK_ERROR_STATUS:
|
19 | case NWK_NO_ACK_STATUS:
|
20 | case NWK_PHY_NO_ACK_STATUS:
|
21 | error_count++; |
22 | debugf("nwk: no reply from 0x%04X\n", req->dstAddr);
|
23 | break;
|
24 | default:
|
25 | error_count++; |
26 | debugf("nwk: unhandled status %d\n", req->status);
|
27 | break;
|
28 | } |
29 | |
30 | network_free_request(req); |
31 | if(error_count >= 16) { |
32 | //assoc_unassociate();
|
33 | error_count = 0;
|
34 | } |
35 | } |
36 | |
37 | bool report_start(report_t *r, uint16_t ns) {
|
38 | r->req = network_alloc_request(30);
|
39 | if(!r->req) return false; |
40 | |
41 | r->msg = (sensor_msg_t*)&r->req->data[0];
|
42 | r->payload = r->msg->payload; |
43 | r->payload_size = 0;
|
44 | r->msg->sensor_cmd = SENSOR_CMD_DATA_V2; |
45 | r->msg->next_hop = 0xFFFF;
|
46 | r->msg->ns = ns; |
47 | |
48 | return true; |
49 | } |
50 | |
51 | bool report_add_payload(report_t *r, sensor_flags_t type, void *sample) { |
52 | uint8_t *p = (uint8_t*)r->payload; |
53 | |
54 | if(r->payload_size + sizeof(sensor_flags_t) + SENSOR_SIZE(type) > |
55 | SENSOR_MAX_PAYLOAD_SIZE) { |
56 | return false; |
57 | } |
58 | |
59 | *(sensor_flags_t*)p = type; |
60 | p += sizeof(sensor_flags_t);
|
61 | |
62 | r->payload_size += sizeof(sensor_flags_t);
|
63 | |
64 | switch(type & SENSOR_SIZE_bm) {
|
65 | case SENSOR_SIZE_8BIT:
|
66 | *(uint8_t*)p = *(uint8_t*)sample; |
67 | p += sizeof(uint8_t);
|
68 | r->payload_size += sizeof(uint8_t);
|
69 | break;
|
70 | case SENSOR_SIZE_16BIT:
|
71 | *(uint16_t*)p = *(uint16_t*)sample; |
72 | p += sizeof(uint16_t);
|
73 | r->payload_size += sizeof(uint16_t);
|
74 | break;
|
75 | case SENSOR_SIZE_32BIT:
|
76 | *(uint32_t*)p = *(uint32_t*)sample; |
77 | p += sizeof(uint32_t);
|
78 | r->payload_size += sizeof(uint32_t);
|
79 | break;
|
80 | } |
81 | |
82 | r->payload = (void*)p;
|
83 | return true; |
84 | } |
85 | |
86 | void report_send(report_t *r) {
|
87 | power_radio_on(); |
88 | |
89 | uint16_t dest = nv_get_word(default_basestation); |
90 | if(assoc_get_state() == ASSOC_STATE_ASSOCIATED) {
|
91 | dest = assoc_get_master(); |
92 | } |
93 | r->msg->next_hop = NWK_RouteNextHop(dest, 0);
|
94 | |
95 | r->req->dstAddr = dest; |
96 | r->req->dstEndpoint = SENSOR_DATA_ENDPOINT; |
97 | r->req->srcEndpoint = SENSOR_DATA_ENDPOINT; |
98 | r->req->options = NWK_OPT_ACK_REQUEST; |
99 | r->req->size = SENSOR_HEADER_SIZE + r->payload_size; |
100 | r->req->confirm = report_confirm; |
101 | |
102 | NWK_DataReq(r->req); |
103 | r->payload_size = 0;
|
104 | r->msg = NULL;
|
105 | r->req = NULL;
|
106 | r->payload = NULL;
|
107 | } |
108 |