X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=serial_console%2Fsample_sensors.c;fp=serial_console%2Fsample_sensors.c;h=d81daa1267480416ad99d1f65646a55f9d27ee15;hb=249ad38e27bf865a50112a5b4b58e8c590923034;hp=0000000000000000000000000000000000000000;hpb=8b8bab09ff860da5804edf220740564c28ba9827;p=svn42.git diff --git a/serial_console/sample_sensors.c b/serial_console/sample_sensors.c new file mode 100644 index 0000000..d81daa1 --- /dev/null +++ b/serial_console/sample_sensors.c @@ -0,0 +1,161 @@ +#include "sample_sensors.h" + +unsigned int collect_data(char *buffer, unsigned int size) +{ + char *cmd; + if (size >= 8 && strncmp("movement", buffer, 8) == 0) + return 1; + + if (size > 16 && strncmp("temp0:", buffer, 5) == 0) + { + if (asprintf(&cmd, "rrdtool update %s -t temp N:%s", rrd_temp_, buffer + 15)) + { + /*printf("%s\n",cmd);*/ + system(cmd); + free(cmd); + } + } + + if (size > 16 && strncmp("photo0:", buffer, 6) == 0) + { + if (asprintf(&cmd, "rrdtool update %s -t light N:%s", rrd_light_, buffer + 15)) + { + /*printf("%s\n",cmd);*/ + system(cmd); + free(cmd); + } + } + return 0; +} + +void sample_sensors(int fd) +{ + if (fd < 3) + return; + struct timespec timeout; + fd_set fds_r; + unsigned int const buffer_size=1024; + unsigned int buffer_offset=0; + char buffer[1024]; + char *cmd; + unsigned int movement_count=0; + int num_byte=0; + time_t last_sample_time, curr_time; + + send(fd,"listen sensor\n",14,0); + send(fd,"listen movement\n",16,0); + + FD_ZERO(&fds_r); + FD_SET(fd,&fds_r); + timeout.tv_sec=1; + timeout.tv_nsec=0; + last_sample_time=time(0); + while (select(fd+1,&fds_r,0,0,0) > 0) + { + curr_time=time(0); + if (FD_ISSET(fd,&fds_r)) + { + if ((num_byte = recv(fd, buffer+buffer_offset , buffer_size - buffer_offset ,0)) > 0) + { + buffer_offset+=num_byte; + } + + if (num_byte == 0 || (num_byte <0 && errno != EAGAIN)) + return; + + char linebreak_found=0; + if (buffer_offset > 0) + { + do + { + int c=0; + linebreak_found=0; + for (c=0; c < buffer_offset; c++) + if (buffer[c] == '\n') + { + buffer[c]='\0'; + linebreak_found=1; + break; + } + + if (linebreak_found) + { + movement_count += collect_data(buffer, buffer_offset+c); + if (c < buffer_offset) + { + memmove(buffer, buffer + c + 1, buffer_size - c - 1); + } + buffer_offset -= c + 1; + } + } while (linebreak_found); + } + + } + + if (curr_time - last_sample_time > sample_interval_s_) + { + last_sample_time=curr_time; + if (asprintf(&cmd,"rrdtool update %s -t movement N:%d", rrd_movement_, movement_count)) + { + /*printf("%s\n",cmd);*/ + system(cmd); + free(cmd); + movement_count=0; + } + } + + FD_SET(fd,&fds_r); + timeout.tv_sec=1; + timeout.tv_nsec=0; + } +} + +int establish_socket_connection(const char* path) +{ + int fd = socket(AF_UNIX, SOCK_STREAM, 0); + if(fd < 0) { + fprintf(stderr, "unable to open socket: %s\n", strerror(errno)); + return -1; + } + struct sockaddr_un local; + local.sun_family = AF_UNIX; + if(sizeof(local.sun_path) <= strlen(path)) { + fprintf(stderr, "socket path is to long (max %lu)\n", sizeof(local.sun_path)-1); + return -1; + } + strcpy(local.sun_path, path); + int len = SUN_LEN(&local); + int ret = connect(fd, (struct sockaddr*) &local, len); + if(ret) { + fprintf(stderr, "unable to connect to '%s': %s\n", local.sun_path, strerror(errno)); + return -1; + } + return fd; +} + +int main(int argc, char* argv[]) +{ + int ret = 0; + int socket_fd = 0; + char *socket_file; + if (argc > 1) + socket_file = argv[1]; + else + socket_file = default_socket_file_; + + socket_fd = establish_socket_connection(socket_file); + if(socket_fd) + { + sample_sensors(socket_fd); + } + else + { + fprintf(stderr, "%s error, aborting..\n", socket_file); + ret=2; + } + + if(socket_fd > 0) + shutdown(socket_fd,SHUT_RDWR); + return(ret); +} +