From 13d37fecdc5904bc3ec1b2f3d8e01d841ddf8f2c Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Tue, 14 Aug 2018 12:00:36 +0200 Subject: [PATCH] Clock: MQTT daemon --- usb/host/Makefile | 8 +- usb/host/burrow-clock.c | 166 ++++++++++++++++++++++++++++++++++++++++ usb/host/test.c | 4 +- 3 files changed, 175 insertions(+), 3 deletions(-) create mode 100644 usb/host/burrow-clock.c diff --git a/usb/host/Makefile b/usb/host/Makefile index a31dce1..aebb0d5 100644 --- a/usb/host/Makefile +++ b/usb/host/Makefile @@ -4,6 +4,12 @@ UCWLF:=$(shell PKG_CONFIG_PATH=$(LIBUCW)/lib/pkgconfig pkg-config --libs libucw) CFLAGS=-std=gnu99 -O2 -Wall -Wextra -Wno-parentheses $(UCWCF) LDLIBS=-lusb-1.0 $(UCWLF) -all: test +all: test burrow-clock test: test.c + +burrow-clock: burrow-clock.c +burrow-clock: LDLIBS += -lmosquitto + +install: all + install burrow-clock /usr/local/sbin/ diff --git a/usb/host/burrow-clock.c b/usb/host/burrow-clock.c new file mode 100644 index 0000000..62a1e8c --- /dev/null +++ b/usb/host/burrow-clock.c @@ -0,0 +1,166 @@ +/* + * MJ's desktop clock daemon + * + * (c) 2018 Martin Mares + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +static struct mosquitto *mosq; + +struct libusb_context *usb_ctxt; +struct libusb_device_handle *devh; + +static libusb_device *find_device(void) +{ + libusb_device **devlist; + ssize_t devn = libusb_get_device_list(usb_ctxt, &devlist); + if (devn < 0) { + fprintf(stderr, "Cannot enumerate USB devices: error %d\n", (int) devn); + exit(1); + } + + for (ssize_t i=0; ilevels &= ~(1U << L_DEBUG); + + mosquitto_lib_init(); + mosq = mosquitto_new("clock", 1, NULL); + if (!mosq) + die("Mosquitto: initialization failed"); + + mosquitto_connect_callback_set(mosq, mqtt_conn_callback); + + if (mosquitto_will_set(mosq, "status/clock", 4, "dead", 0, true) != MOSQ_ERR_SUCCESS) + die("Mosquitto: unable to set will"); + + if (mosquitto_connect_async(mosq, "10.32.184.5", 1883, 60) != MOSQ_ERR_SUCCESS) + die("Mosquitto: connect failed"); + + if (mosquitto_loop_start(mosq)) + die("Mosquitto: cannot start service thread"); + + int err; + if (err = libusb_init(&usb_ctxt)) + die("Cannot initialize libusb: error %d", err); + libusb_set_debug(usb_ctxt, 3); + + libusb_device *dev = find_device(); + + if (err = libusb_open(dev, &devh)) + die("Cannot open device: error %d", err); + libusb_reset_device(devh); + if (err = libusb_claim_interface(devh, 0)) + die("Cannot claim interface: error %d", err); + + uint cnt = 0; + for (;;) { + time_t t = time(NULL); + struct tm *tm = localtime(&t); + + unsigned char req[8] = { + tm->tm_hour / 10, + tm->tm_hour % 10, + (tm->tm_sec % 2 ? 10 : 0xff), + tm->tm_min / 10, + tm->tm_min % 10, + }; + int transferred; + if (err = libusb_bulk_transfer(devh, 0x01, req, 8, &transferred, 2000)) + die("Transfer failed: error %d", err); + + unsigned char resp[64]; + int received; + if (err = libusb_bulk_transfer(devh, 0x82, resp, 64, &received, 2000)) + die("Receive failed: error %d\n", err); + // printf("Received %d bytes\n", received); + if (received >= 12) { + int temp = get_u32_be(resp); + int press = get_u32_be(resp + 4); + uint cycle = get_u32_be(resp + 8); + msg(L_DEBUG, "Temperature %d ddegC, pressure %d Pa, cycle %u", temp, press, cycle); + if (!(cnt % 10)) { + mqtt_publish("burrow/temp/clock", "%.1f %llu", temp / 10., (long long) t); + mqtt_publish("burrow/pressure/clock", "%d %llu", press, (long long) t); + } + } + + sleep(1); + cnt++; + } + + return 0; +} diff --git a/usb/host/test.c b/usb/host/test.c index 2d94a98..455d8e2 100644 --- a/usb/host/test.c +++ b/usb/host/test.c @@ -79,13 +79,13 @@ int main(void) }; int transferred; if (err = libusb_bulk_transfer(devh, 0x01, req, 8, &transferred, 2000)) - die("Transfer failed: error %d\n", err); + die("Transfer failed: error %d", err); // printf("Transferred %d bytes\n", transferred); unsigned char resp[64]; int received; if (err = libusb_bulk_transfer(devh, 0x82, resp, 64, &received, 2000)) - die("Receive failed: error %d\n", err); + die("Receive failed: error %d", err); // printf("Received %d bytes\n", received); if (received >= 12) { -- 2.39.2