Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 52 additions & 5 deletions src/Devices/EthernetServer_TC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "Devices/Ethernet_TC.h"
#include "Devices/JSONBuilder.h"
#include "Devices/LiquidCrystal_TC.h"
#include "Devices/PID_TC.h"
#include "Serial_TC.h"
#include "TankController.h"

Expand Down Expand Up @@ -94,6 +95,37 @@ void EthernetServer_TC::post() {
}
}

// Handles an HTTP PUT request
void EthernetServer_TC::put() {
enum { Kd, Ki, Kp } var;
if (memcmp_P(buffer + 4, F("/api/1/set?Kd="), 14) == 0) {
var = Kd;
} else if (memcmp_P(buffer + 4, F("/api/1/set?Ki="), 14) == 0) {
var = Ki;
} else if (memcmp_P(buffer + 4, F("/api/1/set?Kp="), 14) == 0) {
var = Kp;
} else {
serial(F("put \"%s\" not recognized!"), buffer + 5);
sendResponse(HTTP_BAD_REQUEST);
state = FINISHED;
return;
}
float value = strtofloat(buffer + 18);
switch (var) {
case Kd:
PID_TC::instance()->setKd(value);
break;
case Ki:
PID_TC::instance()->setKi(value);
break;
case Kp:
PID_TC::instance()->setKp(value);
break;
}
sendCurrentRedirect();
state = FINISHED;
}

/* API Handler
* currently only version 1 is supported
* Calls helper functions
Expand Down Expand Up @@ -167,7 +199,7 @@ void EthernetServer_TC::keypress() {
if (key == '#' || key == '*' || (key >= '0' && key <= '9') || (key >= 'A' && key <= 'D')) {
// States will handle keypresses appropriately
TankController::instance()->setNextKey(key);
sendResponse(HTTP_REDIRECT);
sendDisplayRedirect();
} else {
serial(F("bad character: %c"), key);
sendResponse(HTTP_BAD_REQUEST);
Expand Down Expand Up @@ -379,6 +411,9 @@ void EthernetServer_TC::loop() {
} else if (memcmp_P(buffer, F("POST "), 5) == 0) {
state = POST_REQUEST;
post();
} else if (memcmp_P(buffer, F("PUT "), 4) == 0) {
state = PUT_REQUEST;
put();
} else if (memcmp_P(buffer, F("OPTIONS "), 8) == 0) {
state = OPTIONS_REQUEST;
options();
Expand Down Expand Up @@ -435,12 +470,27 @@ void EthernetServer_TC::sendHeadersWithSize(uint32_t size) {
client.write('\n');
}

void EthernetServer_TC::sendResponse(int code) {
void EthernetServer_TC::sendCurrentRedirect() {
const __FlashStringHelper *response_303 =
F("HTTP/1.1 303 See Other\r\n"
"Location: /api/1/current\r\n"
"Access-Control-Allow-Origin: *\r\n"
"\r\n");
strscpy_P(buffer, response_303, sizeof(buffer));
client.write(buffer);
}

void EthernetServer_TC::sendDisplayRedirect() {
const __FlashStringHelper *response_303 =
F("HTTP/1.1 303 See Other\r\n"
"Location: /api/1/display\r\n"
"Access-Control-Allow-Origin: *\r\n"
"\r\n");
strscpy_P(buffer, response_303, sizeof(buffer));
client.write(buffer);
}

void EthernetServer_TC::sendResponse(int code) {
const __FlashStringHelper *response_400 =
F("HTTP/1.1 400 Bad Request\r\n"
"\r\n");
Expand All @@ -463,9 +513,6 @@ void EthernetServer_TC::sendResponse(int code) {
"\r\n");
char buffer[100]; // Space for longest of above responses
switch (code) {
case HTTP_REDIRECT:
strscpy_P(buffer, response_303, sizeof(buffer));
break;
case HTTP_BAD_REQUEST:
strscpy_P(buffer, response_400, sizeof(buffer));
break;
Expand Down
4 changes: 4 additions & 0 deletions src/Devices/EthernetServer_TC.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ enum serverState_t {
READ_REQUEST,
GET_REQUEST,
POST_REQUEST,
PUT_REQUEST,
OPTIONS_REQUEST,
COUNTING_FILES,
LISTING_FILES,
Expand Down Expand Up @@ -69,10 +70,13 @@ class EthernetServer_TC : public EthernetServer {
// instance methods: utility
void sendHeadersWithSize(uint32_t size);
void sendResponse(int);
void sendCurrentRedirect();
void sendDisplayRedirect();
int weekday(int year, int month, int day);
// instance methods: HTTP
void get();
void post();
void put();
void options();
void echo();
void apiHandler();
Expand Down
15 changes: 15 additions & 0 deletions src/TC_util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,18 @@ int floattostrf(double float_value, int min_width, int num_digits_after_decimal,
return 2;
}
}

float strtofloat(const char *buffer) {
float left = 0, right = 0;
int i, j = 1;
for (i = 0; isDigit(buffer[i]); ++i) {
left = left * 10 + buffer[i] - '0';
}
if (buffer[i] == '.') {
for (i = i + 1; isDigit(buffer[i]); ++i) {
right = right * 10 + buffer[i] - '0';
j = j * 10;
}
}
return left + right / j;
}
1 change: 1 addition & 0 deletions src/TC_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,4 @@ int strscpy(char *destination, const char *source, unsigned long sizeOfDestinati
int strscpy_P(char *destination, const __FlashStringHelper *source, unsigned long sizeOfDestination);
int floattostrf(double float_value, int min_width, int num_digits_after_decimal, char *buffer,
unsigned long buffer_size);
float strtofloat(const char *buffer);
Loading