[NO-PARSE]/*
* Author: AceInfinity (c) 2015
* Date: 2015-01-23 22:56:52
* File: hue.h
* Last Modified time: 2015-01-23 23:32:48
*/
#ifndef __HUE_HTTP_H__
#define __HUE_HTTP_H__
#include "socks.h"
#include "hue_config.h"
#include <stdbool.h>
#include <stdint.h>
bool send_put_request(const char *url, const char *data, const size_t send_max_len, char *recv_buf, const size_t recv_max_len)
{
SOCKET fd; // socket descriptor
if ((fd = ws_socket_create(TCP)) == INVALID_SOCKET)
{
int err = WSAGetLastError();
if (err == WSAETIMEDOUT)
fprintf(stderr, "[Socket Create] Connection timed out.\n");
else
fprintf(stderr, "Failed to create socket: %d\n", err);
return false;
}
if (ws_socket_connect(fd, HUE_HOST, HUE_PORT) != 0)
{
int err = WSAGetLastError();
if (err == WSAETIMEDOUT)
fprintf(stderr, "[Socket Connect] Connection timed out.\n");
else
fprintf(stderr, "Failed to connect socket: %d\n", err);
return false;
}
char send_buf[send_max_len];
memset(send_buf, 0, send_max_len);
sprintf(send_buf, "PUT %s HTTP/1.1\r\nContent-Length:%u\r\n\r\n%s", url, strlen(data), data);
if (ws_socket_send(fd, send_buf, strlen(send_buf)) == SOCKET_ERROR)
{
fprintf(stderr, "send() error: %d\n", WSAGetLastError());
return false;
}
if (ws_socket_recv(fd, recv_buf, recv_max_len) == SOCKET_ERROR)
{
fprintf(stderr, "recv() error: %d\n", WSAGetLastError());
return false;
}
return true;
}
void set_hue_light_opt(const char *url, uint8_t flags, const struct hue_config_t *config)
{
char data[MAX_BUF], recv_buf[MAX_BUF];
/* Transition Time (100ms multiple variant) */
if (flags & SET_TRANSITIONTIME)
{
sprintf(data, "{\"transitiontime\":%u}", config->transitiontime);
send_put_request(url, data, MAX_BUF, recv_buf, MAX_BUF);
}
/* ON(/OFF) */
if (flags & SET_ON)
{
sprintf(data, "{\"on\":%s}", config->on ? "true" : "false");
send_put_request(url, data, MAX_BUF, recv_buf, MAX_BUF);
}
/* Hue */
if (flags & SET_HUE)
{
sprintf(data, "{\"hue\":%u}", config->hue);
send_put_request(url, data, MAX_BUF, recv_buf, MAX_BUF);
}
/* Brightness */
if (flags & SET_BRIGHTNESS)
{
sprintf(data, "{\"bri\":%u}", config->brightness);
send_put_request(url, data, MAX_BUF, recv_buf, MAX_BUF);
}
/* Saturation */
if (flags & SET_SATURATION)
{
sprintf(data, "{\"sat\":%u}", config->saturation);
send_put_request(url, data, MAX_BUF, recv_buf, MAX_BUF);
}
/* Color Temp */
if (flags & SET_COLOR_TEMP)
{
sprintf(data, "{\"ct\":%u}", config->color_temp);
send_put_request(url, data, MAX_BUF, recv_buf, MAX_BUF);
}
/* Alert */
if (flags & SET_ALERT)
{
sprintf(data, "{\"alert\":\"%s\"}", config->alert);
send_put_request(url, data, MAX_BUF, recv_buf, MAX_BUF);
}
/* Effect */
if (flags & SET_EFFECT)
{
sprintf(data, "{\"effect\":\"%s\"}", config->effect);
send_put_request(url, data, MAX_BUF, recv_buf, MAX_BUF);
}
}
#endif // __HUE_HTTP_H__[/NO-PARSE]