diff options
author | David Lamparter <equinox@diac24.net> | 2013-03-25 23:01:50 +0100 |
---|---|---|
committer | David Lamparter <equinox@diac24.net> | 2013-03-25 23:01:50 +0100 |
commit | 1b5e4f4ba195ad4ed02cfac6129c386c4aeaf7cd (patch) | |
tree | 585729717365831250afc150b95f51809d1330f5 /cethcan/light.c | |
parent | 2de09bbd1dc380734946b2389f1177f48ae0b4e5 (diff) |
cethcan: more code
Diffstat (limited to 'cethcan/light.c')
-rw-r--r-- | cethcan/light.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/cethcan/light.c b/cethcan/light.c new file mode 100644 index 0000000..2bc6b2f --- /dev/null +++ b/cethcan/light.c @@ -0,0 +1,69 @@ +#include "cethcan.h" + +struct value { + uint8_t val; + time_t change, valid; +}; + +struct light { + struct can_user *u; + + char *name; + unsigned logical_addr; + + struct value set, actual; +}; + +static void light_can_handler(void *arg, struct can_message *msg) +{ + struct light *l = arg; + struct value *v = NULL; + unsigned laddr; + uint8_t dval; + + if ((msg->daddr & CANA_PROTOCOL) == CANA_LIGHT) + v = &l->set; + if ((msg->daddr & CANA_PROTOCOL) == CANA_SENSOR) + v = &l->actual; + if (!v) + return; + + laddr = msg->daddr & 0xfff; + if (l->logical_addr < laddr) + return; + if (l->logical_addr - laddr >= msg->dlc) + return; + dval = msg->bytes[l->logical_addr - laddr]; + + time(&v->valid); + if (dval != v->val || v->change == 0) { + v->val = dval; + time(&v->change); + lprintf("%s: set %02x", l->u->name, dval); + } +} + +int light_init_conf(json_t *config) +{ + struct light *l; + + if (!json_is_object(config)) { + lprintf("light config must be an object/dictionary"); + return 1; + } + if (!json_is_integer(json_object_get(config, "addr"))) { + lprintf("light config must have an 'addr' key"); + return 1; + } + if (!json_is_string(json_object_get(config, "name"))) { + lprintf("light config must have a 'name' key"); + return 1; + } + + l = calloc(sizeof(*l), 1); + l->name = strdup(json_string_value(json_object_get(config, "name"))); + l->logical_addr = json_integer_value(json_object_get(config, "addr")); + + l->u = can_register_alloc(l, light_can_handler, "light[%s]", l->name); + return 0; +} |