Receive commands via UDP
This commit is contained in:
parent
9b9f6ee3d6
commit
b3b9d68ad7
92
src/main.c
92
src/main.c
|
@ -1,53 +1,103 @@
|
|||
#include <math.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#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;
|
||||
|
|
Loading…
Reference in a new issue