From b3b9d68ad7e11dfb91372ba10b7d98c442132cf9 Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Fri, 12 Apr 2013 19:26:02 +0200 Subject: [PATCH] Receive commands via UDP --- src/main.c | 92 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 71 insertions(+), 21 deletions(-) diff --git a/src/main.c b/src/main.c index afe9de7..260bee3 100644 --- a/src/main.c +++ b/src/main.c @@ -1,53 +1,103 @@ #include -#include + #include #include #include -#include #include +#include +#include +#include +#include +#include + #include "../include/ws2801.h" #include "../include/logger.h" -#define PI 3.141592654f +#define PORT 2703 -void set_all(uint8_t r, uint8_t g, uint8_t b) -{ - for(uint8_t i = 0; i < 20; i++) { - ws2801_set_colour(i, r, g, b); - } -} +#define NUM_MODULES 20 -float sin_off(float phase) -{ - return 255 * (0.5f + 0.5f * sin(phase)); -} +#define SET_COLOUR 0 +#define FADE_COLOUR 1 +#define ADD_COLOUR 2 +#define SET_FADESTEP 3 int main(void) { - float phase = 0; + int sock; + socklen_t remote_addr_len; + struct sockaddr_in listen_addr, remote_addr; + uint8_t pkgbuf[256]; + ssize_t rcvbytes, offset = 0; + uint8_t cmd, r, g, b, action, module; + + // initialize logger logger_init(); - if(ws2801_init(20) == -1) { + // initialize UDP server socket + sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if(sock == -1) { + LOG(LVL_FATAL, "Could not initialize UDP socket: %s.", strerror(errno)); + return 1; + } + + memset(&listen_addr, 0, sizeof(listen_addr)); + listen_addr.sin_family = AF_INET; + listen_addr.sin_port = htons(PORT); + listen_addr.sin_addr.s_addr = htonl(INADDR_ANY); + + if(bind(sock, (struct sockaddr*)&listen_addr, sizeof(listen_addr)) == -1) { + LOG(LVL_FATAL, "Could not bind socket to port %i: %s.", PORT, strerror(errno)); + return 1; + } + + // initialize ws2801 library + if(ws2801_init(NUM_MODULES) == -1) { LOG(LVL_FATAL, "Could not initialize WS2801 library."); return 1; } + LOG(LVL_INFO, "Initialisation complete."); + while(1) { - //phase += PI/1000; + remote_addr_len = sizeof(remote_addr); + rcvbytes = recvfrom(sock, pkgbuf, 256, 0, (struct sockaddr*)&remote_addr, &remote_addr_len); + if(rcvbytes == -1) { + LOG(LVL_ERR, "recvfrom() failed: %s. Shutting down.", strerror(errno)); + break; + } - for(uint8_t i = 0; i < 20; i++) { - ws2801_set_colour(i, sin_off(i * PI / 10 + phase), sin_off(i * PI / 10 + 1.241*phase), sin_off(i * PI / 10 + 1.537*phase)); + pkgbuf[rcvbytes] = 0; + + // commands from packet + offset = 0; + while(offset <= rcvbytes - 3) { + cmd = pkgbuf[offset + 0]; + r = pkgbuf[offset + 1]; + g = pkgbuf[offset + 2]; + b = pkgbuf[offset + 3]; + offset += 4; + + action = (cmd & 0xC0) >> 6; // the upper 2 bits + module = cmd & 0x3F; // the lower 6 bits + + if(action != SET_COLOUR) { + // action not implemented yet -> ignore + LOG(LVL_DEBUG, "Action %u not implemented yet.", action); + continue; + } + + ws2801_set_colour(module, r, g, b); } ws2801_send_update(); - - static const struct timespec sleepval = {0, 40000000}; - nanosleep(&sleepval, NULL); } + close(sock); + ws2801_shutdown(); return 0;