Statistics
| Branch: | Tag: | Revision:

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