-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpiface-mqtt.c
57 lines (51 loc) · 1.48 KB
/
piface-mqtt.c
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libpiface-1.0/pfio.h>
#include <mosquitto.h>
char *host = "localhost";
char *on = "1";
char *off = "0";
void my_message_callback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message) {
unsigned char channel;
sscanf(message->topic, "piface/output/%u", &channel);
if(channel<8 && message->payloadlen==1) {
if(strncmp(message->payload, on, 1)==0)
pfio_digital_write(channel, 1);
if(strncmp(message->payload, off, 1)==0)
pfio_digital_write(channel, 0);
}
}
int main(int argc, char*argv[]) {
struct mosquitto *mosq = NULL;
char *buffer = malloc(16);
unsigned char i;
unsigned char input_status, input_status_old;
pfio_init();
mosquitto_lib_init();
mosq = mosquitto_new(NULL, true, NULL);
if(!mosq) {
fprintf(stderr, "MQTT Error: Out of memory.\n");
return 1;
}
mosquitto_message_callback_set(mosq, my_message_callback);
if(mosquitto_connect_async(mosq, host, 1883, 60)) {
fprintf(stderr, "MQTT Error: Unable to connect.\n");
return 1;
}
mosquitto_subscribe(mosq, NULL, "piface/output/+", 1);
mosquitto_loop_start(mosq);
while(1) {
input_status = pfio_read_input();
for(i=0;i<8;i++) {
if((input_status_old^input_status) & (1<<i)) {
sprintf(buffer, "piface/input/%u", i);
if(input_status&(1<<i))
mosquitto_publish(mosq, NULL, buffer, 2, on, 1, 0);
else
mosquitto_publish(mosq, NULL, buffer, 2, off, 1, 0);
}
}
input_status_old = input_status;
}
}