forked from microsoft/devicescript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdevscloud.c
More file actions
91 lines (77 loc) · 2.53 KB
/
devscloud.c
File metadata and controls
91 lines (77 loc) · 2.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "devs_internal.h"
#include "jacdac/dist/c/cloudadapter.h"
#include "jacdac/dist/c/wssk.h"
#define LOG_TAG "devscloud"
#include "devs_logging.h"
struct srv_state {
SRV_COMMON;
const devscloud_api_t *api;
};
static srv_t *_devscloud_state;
void devscloud_process(srv_t *state) {}
static void devscloud_upload(srv_t *state, int type, jd_packet_t *pkt) {
int ep = 0;
while (ep < pkt->service_size && pkt->data[ep])
ep++;
ep++;
if (ep > pkt->service_size) {
LOG("invalid cloud upload format");
return;
}
if (!state->api->is_connected())
return;
int r =
state->api->send_message(type, (char *)pkt->data, pkt->data + ep, pkt->service_size - ep);
if (r) {
LOG("failed upload");
jd_blink(JD_BLINK_CLOUD_ERROR);
} else {
jd_blink(JD_BLINK_CLOUD_UPLOADED);
}
}
void devscloud_handle_packet(srv_t *state, jd_packet_t *pkt) {
switch (pkt->service_command) {
case JD_CLOUD_ADAPTER_CMD_UPLOAD_JSON:
devscloud_upload(state, JD_WSSK_DATA_TYPE_JSON, pkt);
return;
case JD_CLOUD_ADAPTER_CMD_UPLOAD_BINARY:
devscloud_upload(state, JD_WSSK_DATA_TYPE_BINARY, pkt);
return;
case JD_GET(JD_CLOUD_ADAPTER_REG_CONNECTED):
jd_respond_u8(pkt, state->api->is_connected());
return;
default:
if (state->api->service_query && state->api->service_query(pkt) > 0)
return;
jd_send_not_implemented(pkt);
return;
}
}
void devscloud_on_message(int data_type, const void *data, unsigned datasize) {
srv_t *state = _devscloud_state;
if (data_type == JD_WSSK_DATA_TYPE_JSON)
jd_send_event_ext(state, JD_CLOUD_ADAPTER_EV_ON_JSON, data, datasize);
else if (data_type == JD_WSSK_DATA_TYPE_BINARY)
jd_send_event_ext(state, JD_CLOUD_ADAPTER_EV_ON_BINARY, data, datasize);
}
SRV_DEF(devscloud, JD_SERVICE_CLASS_CLOUD_ADAPTER);
void devscloud_init(const devscloud_api_t *cloud_api) {
SRV_ALLOC(devscloud);
state->api = cloud_api;
_devscloud_state = state;
}
static int send_message(int data_type, const char *topic, const void *data, unsigned datasize) {
return 0;
}
static int is_connected(void) {
return 1;
}
const devscloud_api_t noop_cloud = {
.send_message = send_message,
.is_connected = is_connected,
.max_bin_upload_size = 1024,
};
void devs_track_exception(devs_ctx_t *ctx) {
if (_devscloud_state && _devscloud_state->api && _devscloud_state->api->track_exception)
_devscloud_state->api->track_exception(ctx);
}