,
+) {
+ if (typeof body === "object") {
+ body = JSON.stringify(body);
+ }
+ const response = await fetch(root + path, {
+ method,
+ body,
+ headers: {
+ ...headers,
+ "Content-Type": "application/json",
+ },
+ });
+ const json = await response.json();
+ return json;
+}
diff --git a/App/src/index.html b/App/src/index.html
index 34358d7..32d44e8 100644
--- a/App/src/index.html
+++ b/App/src/index.html
@@ -4,7 +4,7 @@
- Writer
+ Eggbot
diff --git a/Firmware/EggbotWireless/include/WebAPI.h b/Firmware/EggbotWireless/include/WebAPI.h
index 1ed65db..4cd1bef 100644
--- a/Firmware/EggbotWireless/include/WebAPI.h
+++ b/Firmware/EggbotWireless/include/WebAPI.h
@@ -10,6 +10,8 @@ class WebAPI {
void handleNotFound();
void handlePutCommand();
void handleGetStatus();
+ void sendCORS();
+
String getStatusJson();
public:
WebAPI();
diff --git a/Firmware/EggbotWireless/src/QueueManager.cpp b/Firmware/EggbotWireless/src/QueueManager.cpp
index 7fc4900..566f203 100644
--- a/Firmware/EggbotWireless/src/QueueManager.cpp
+++ b/Firmware/EggbotWireless/src/QueueManager.cpp
@@ -37,16 +37,19 @@ void QueueManager::loopRoutine() {
}
void QueueManager::putCommand(std::string cmd) {
+ if (!std::isalnum(cmd[0])) {
+ return;
+ }
+
if (toupper(cmd[0]) == 'L') {
lCommandQueue.emplace(cmd);
} else {
- commandQueue.push(parseGCode(cmd));
+ Command cmdp = parseGCode(cmd);
+ commandQueue.push(cmdp);
}
}
-uint8_t QueueManager::execQueueSize() {
- return commandQueue.size();
-}
+uint8_t QueueManager::execQueueSize() { return commandQueue.size(); }
void QueueManager::putCommand(char *cmd) { putCommand(std::string(cmd)); }
diff --git a/Firmware/EggbotWireless/src/WebAPI.cpp b/Firmware/EggbotWireless/src/WebAPI.cpp
index 835057d..d1f7e6d 100644
--- a/Firmware/EggbotWireless/src/WebAPI.cpp
+++ b/Firmware/EggbotWireless/src/WebAPI.cpp
@@ -23,16 +23,33 @@ String WebAPI::getStatusJson() {
return out;
}
+void WebAPI::sendCORS() {
+ server.sendHeader("Access-Control-Allow-Origin", "*");
+ server.sendHeader("Access-Control-Max-Age", "10000");
+ server.sendHeader("Access-Control-Allow-Methods", "PUT,POST,GET,OPTIONS");
+ server.sendHeader("Access-Control-Allow-Headers",
+ "X-Requested-With, X-HTTP-Method-Override, "
+ "Content-Type, Cache-Control, Accept");
+}
+
void WebAPI::handleNotFound() {
- server.send(404, "text/plain", "File Not Found\n\n");
+ if (server.method() == HTTP_OPTIONS) {
+ sendCORS();
+ server.send(204);
+ } else {
+ server.send(404, "text/plain", "");
+ }
}
void WebAPI::handlePutCommand() {
- queueManager.putCommand(server.arg("plain").c_str());
+ sendCORS();
+ String cmd = server.arg("plain");
+ queueManager.putCommand(cmd.c_str());
server.send(200, "application/json", getStatusJson());
}
void WebAPI::handleGetStatus() {
+ sendCORS();
server.send(200, "application/json", getStatusJson());
}
diff --git a/Firmware/MotorControl/include/Globals.h b/Firmware/MotorControl/include/Globals.h
index 9040a98..5a047cb 100644
--- a/Firmware/MotorControl/include/Globals.h
+++ b/Firmware/MotorControl/include/Globals.h
@@ -8,19 +8,16 @@
#define STEPS_PER_REVOLUTION (360/1.8) * 32
-Stepper eggStepper(6, 5, STEPS_PER_REVOLUTION, 0, defYDegPerMM);
-Stepper servoStepper(4, 3, STEPS_PER_REVOLUTION, xLimit,
- defXDegPerMM);
+extern Stepper eggStepper;
+extern Stepper servoStepper;
-Pen pen(7, 120, 180);
+extern unsigned int eggStepperDelay;
+extern unsigned int servoStepperDelay;
-unsigned int eggStepperDelay;
-unsigned int servoStepperDelay;
+extern unsigned int eggDia;
+extern unsigned int eggLength;
-unsigned int eggDia;
-unsigned int eggLength;
-
-float eggStepperRPM;
-float servoStepperRPM;
+extern float eggStepperRPM;
+extern float servoStepperRPM;
#endif
\ No newline at end of file
diff --git a/Firmware/MotorControl/include/Pen.h b/Firmware/MotorControl/include/Pen.h
index 7b75032..641b072 100644
--- a/Firmware/MotorControl/include/Pen.h
+++ b/Firmware/MotorControl/include/Pen.h
@@ -17,7 +17,8 @@ class Pen {
void disengage();
void init();
bool getEngaged();
- ~Pen();
};
+extern Pen pen;
+
#endif
\ No newline at end of file
diff --git a/Firmware/MotorControl/src/Globals.cpp b/Firmware/MotorControl/src/Globals.cpp
new file mode 100644
index 0000000..0b99aa9
--- /dev/null
+++ b/Firmware/MotorControl/src/Globals.cpp
@@ -0,0 +1,13 @@
+#include "Globals.h"
+
+Stepper eggStepper(6, 5, STEPS_PER_REVOLUTION, 0, defYDegPerMM);
+Stepper servoStepper(4, 3, STEPS_PER_REVOLUTION, xLimit, defXDegPerMM);
+
+unsigned int eggStepperDelay;
+unsigned int servoStepperDelay;
+
+unsigned int eggDia;
+unsigned int eggLength;
+
+float eggStepperRPM;
+float servoStepperRPM;
diff --git a/Firmware/MotorControl/src/Pen.cpp b/Firmware/MotorControl/src/Pen.cpp
index 2339bfc..855e40e 100644
--- a/Firmware/MotorControl/src/Pen.cpp
+++ b/Firmware/MotorControl/src/Pen.cpp
@@ -3,27 +3,19 @@
#include "Pen.h"
-#define DELAY 15
-
Pen::Pen(int pin, int posEngaged, int posDisengaged)
: posEngaged(posEngaged), posDisengaged(posDisengaged), pin(pin) {}
void Pen::engage() {
if (!engaged) {
- for (int i = posDisengaged; i > posEngaged; i--) {
- servo.write(i);
- delay(DELAY);
- }
+ servo.write(posEngaged);
}
engaged = true;
}
void Pen::disengage() {
if (engaged) {
- for (int i = posEngaged; i < posDisengaged; i++) {
- servo.write(i);
- delay(DELAY);
- }
+ servo.write(posDisengaged);
}
engaged = false;
}
@@ -36,4 +28,4 @@ void Pen::init() {
bool Pen::getEngaged() { return engaged; }
-Pen::~Pen() {}
+Pen pen(7, 120, 170);
diff --git a/Firmware/MotorControl/src/main.cpp b/Firmware/MotorControl/src/main.cpp
index e7974b7..55b3757 100644
--- a/Firmware/MotorControl/src/main.cpp
+++ b/Firmware/MotorControl/src/main.cpp
@@ -35,10 +35,8 @@ void adjustRPM() {
calculateDelay(eggStepperRPM, STEPS_PER_REVOLUTION);
int newServoStepperDelay =
calculateDelay(servoStepperRPM, STEPS_PER_REVOLUTION);
- ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
- eggStepperDelay = newEggStepperDelay;
- servoStepperDelay = newServoStepperDelay;
- }
+ eggStepperDelay = newEggStepperDelay;
+ servoStepperDelay = newServoStepperDelay;
}
Command command;
@@ -67,36 +65,36 @@ byte txBuffer[i2cStsBytes];
Status sts;
void requestEvent() { Wire.write(txBuffer, i2cStsBytes); }
-void execCommand() {
+void execCommand(Command cmd) {
executing = true;
+ newCommand = false;
- if (command.type == CommandType::G01 || command.type == CommandType::G00) {
- newCommand = false;
- if (command.type == CommandType::G01) {
+ if (cmd.type == CommandType::G01 || cmd.type == CommandType::G00) {
+ if (cmd.type == CommandType::G01) {
needAdjust = true;
} else {
needAdjust = false;
}
- if (!isnan(command.arg1)) {
- servoStepper.moveTo(command.arg1);
+ if (!isnan(cmd.arg1)) {
+ servoStepper.moveTo(cmd.arg1);
}
- if (!isnan(command.arg2)) {
- eggStepper.moveTo(command.arg2);
+ if (!isnan(cmd.arg2)) {
+ eggStepper.moveTo(cmd.arg2);
}
- if (!isnan(command.arg3)) {
- if (command.arg3 < 0) {
+ if (!isnan(cmd.arg3)) {
+ if (cmd.arg3 < 0) {
pen.engage();
}
- if (command.arg3 >= 0) {
+ if (cmd.arg3 >= 0) {
pen.disengage();
}
}
- if (!isnan(command.arg4)) {
- curRPM = command.arg4;
+ if (!isnan(cmd.arg4)) {
+ curRPM = cmd.arg4;
}
adjustRPM();
@@ -157,6 +155,8 @@ void steppersRoutine() {
sts.mmS = servoStepper.getPosMm();
sts.mmE = eggStepper.getPosMm();
+ sts.feedrate = curRPM;
+
sts.pEng = (float)pen.getEngaged();
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { sts.toBytes(txBuffer); }
@@ -171,7 +171,7 @@ void steppersRoutine() {
void loop() {
if (newCommand) {
- execCommand();
+ execCommand(command);
}
steppersRoutine();
}