diff --git a/include/EggDuino.h b/include/EggDuino.h index da7275c..b35dd48 100644 --- a/include/EggDuino.h +++ b/include/EggDuino.h @@ -72,8 +72,8 @@ extern SerialCommand SCmd; extern int penMin; extern int penMax; -extern int penUpPos; -extern int penDownPos; +extern int g_iPEN_UP_POS; +extern int g_iPEN_DOWN_POS; extern int servoRateUp; extern int servoRateDown; extern long rotStepError; diff --git a/src/Config_Web.cpp b/src/Config_Web.cpp index c89a8cb..a842a74 100644 --- a/src/Config_Web.cpp +++ b/src/Config_Web.cpp @@ -57,7 +57,7 @@ button { margin-top: 18px; border: 0; background: #0b5ed7; color: white; padding let lastSeq = 0; async function loadConfig() { - const resp = await fetch('/api/config'); + const resp = await fetch('/api/config', { cache: 'no-store' }); if (!resp.ok) throw new Error('Konfiguration konnte nicht geladen werden'); return resp.json(); } @@ -92,6 +92,8 @@ async function saveConfig() { const text = await resp.text(); throw new Error(text || 'Speichern fehlgeschlagen'); } + const saved = await resp.json(); + renderForm(saved); status.textContent = 'Gespeichert'; } @@ -143,6 +145,9 @@ void handleGetConfig() { server.send(500, "text/plain", "Config storage not available"); return; } + server.sendHeader("Cache-Control", "no-store, no-cache, must-revalidate"); + server.sendHeader("Pragma", "no-cache"); + server.sendHeader("Expires", "0"); server.send(200, "application/json", buildConfigJson()); } @@ -159,17 +164,18 @@ void handlePostConfig() { String error; if (!applyConfigJson(server.arg("plain"), error)) { + Log(String("Config JSON fehlerhaft: ") + error); server.send(400, "text/plain", error); return; } if (!saveConfigToFile()) { + Log("Config konnte nicht gespeichert werden"); server.send(500, "text/plain", "Could not save config"); return; } - // penState = penUpPos; - // penServo.write(penState); + Log(String("Config gespeichert: penUpPos=") + g_iPEN_UP_POS + ", penDownPos=" + g_iPEN_DOWN_POS); server.send(200, "application/json", buildConfigJson()); } @@ -180,11 +186,19 @@ void handleGetLogs() { } server.send(200, "application/json", buildLogsJson(since)); } + +void handleNotFound() { + if (server.uri().startsWith("/api/")) { + server.send(404, "text/plain", "API endpoint not found"); + return; + } + handleRoot(); +} } // namespace ConfigParameter configParameters[] = { - {"penUpPos", &penUpPos, "Pen Up Position", 5}, - {"penDownPos", &penDownPos, "Pen Down Position", 20}, + // {"penUpPos", &g_iPEN_UP_POS, "Pen Up Position", 5}, + // {"penDownPos", &g_iPEN_DOWN_POS, "Pen Down Position", 20}, }; const size_t configParameterCount = sizeof(configParameters) / sizeof(configParameters[0]); @@ -203,6 +217,7 @@ bool loadConfigFromFile() { File file = SPIFFS.open(kConfigPath, "r"); if (!file) { + Log("config.json fehlt, defaults werden gespeichert"); return saveConfigToFile(); } @@ -210,6 +225,7 @@ bool loadConfigFromFile() { DeserializationError err = deserializeJson(doc, file); file.close(); if (err) { + Log("config.json ist ungueltig, defaults werden gespeichert"); return saveConfigToFile(); } @@ -230,6 +246,7 @@ bool loadConfigFromFile() { param->description = item["description"].as(); } } + Log(String("Config geladen: penUpPos=") + g_iPEN_UP_POS + ", penDownPos=" + g_iPEN_DOWN_POS); return true; } @@ -237,6 +254,7 @@ bool loadConfigFromFile() { bool saveConfigToFile() { File file = SPIFFS.open(kConfigPath, "w"); if (!file) { + Log("SPIFFS open write failed"); return false; } @@ -250,7 +268,11 @@ bool saveConfigToFile() { } bool ok = serializeJsonPretty(doc, file) > 0; + file.flush(); file.close(); + if (!ok) { + Log("serializeJsonPretty failed"); + } return ok; } @@ -324,7 +346,7 @@ void startWebInterface() { server.on("/api/config", HTTP_GET, handleGetConfig); server.on("/api/config", HTTP_POST, handlePostConfig); server.on("/api/logs", HTTP_GET, handleGetLogs); - server.onNotFound(handleRoot); + server.onNotFound(handleNotFound); server.begin(); } diff --git a/src/Functions.cpp b/src/Functions.cpp index 540a5ee..559f747 100644 --- a/src/Functions.cpp +++ b/src/Functions.cpp @@ -1,84 +1,95 @@ #include "EggDuino.h" - -void queryPen() { +void queryPen() +{ char state; - if (penState==penUpPos) - state='1'; + if (penState == g_iPEN_UP_POS) + state = '1'; else - state='0'; - Serial.print(String(state)+"\r\n"); + state = '0'; + Serial.print(String(state) + "\r\n"); sendAck(); } -void queryButton() { - Serial.print(String(prgButtonState) +"\r\n"); +void queryButton() +{ + Serial.print(String(prgButtonState) + "\r\n"); sendAck(); prgButtonState = 0; } -void queryLayer() { - Serial.print(String(layer) +"\r\n"); +void queryLayer() +{ + Serial.print(String(layer) + "\r\n"); sendAck(); -} +} -void setLayer() { - uint32_t value=0; +void setLayer() +{ + uint32_t value = 0; char *arg1; arg1 = SCmd.next(); - if (arg1 != NULL) { + if (arg1 != NULL) + { value = atoi(arg1); - layer=value; + layer = value; sendAck(); } else sendError(); } -void queryNodeCount() { - Serial.print(String(nodeCount) +"\r\n"); +void queryNodeCount() +{ + Serial.print(String(nodeCount) + "\r\n"); sendAck(); - } -void setNodeCount() { - uint32_t value=0; +void setNodeCount() +{ + uint32_t value = 0; char *arg1; arg1 = SCmd.next(); - if (arg1 != NULL) { + if (arg1 != NULL) + { value = atoi(arg1); - nodeCount=value; + nodeCount = value; sendAck(); } else sendError(); } -void nodeCountIncrement() { - nodeCount=nodeCount++; - sendAck(); -} - -void nodeCountDecrement() { - nodeCount=nodeCount--; +void nodeCountIncrement() +{ + nodeCount = nodeCount++; sendAck(); } -void stepperMove() { - uint16_t duration=0; //in ms - int penStepsEBB=0; //Pen - int rotStepsEBB=0; //Rot +void nodeCountDecrement() +{ + nodeCount = nodeCount--; + sendAck(); +} + +void stepperMove() +{ + uint16_t duration = 0; // in ms + int penStepsEBB = 0; // Pen + int rotStepsEBB = 0; // Rot moveToDestination(); - if (!parseSMArgs(&duration, &penStepsEBB, &rotStepsEBB)) { + if (!parseSMArgs(&duration, &penStepsEBB, &rotStepsEBB)) + { sendError(); return; } sendAck(); - if ( (penStepsEBB==0) && (rotStepsEBB==0) ) { + if ((penStepsEBB == 0) && (rotStepsEBB == 0)) + { delay(duration); return; } @@ -86,48 +97,59 @@ void stepperMove() { prepareMove(duration, penStepsEBB, rotStepsEBB); } -void setPen(){ +void setPen() +{ int cmd; int value; char *arg; + char cstrMsg[20]; moveToDestination(); arg = SCmd.next(); - if (arg != NULL) { + if (arg != NULL) + { cmd = atoi(arg); - switch (cmd) { - case 0: - penServo.write(penUpPos); - penState=penUpPos; - break; + switch (cmd) + { + case 0: + penServo.write(g_iPEN_UP_POS); + penState = g_iPEN_UP_POS; + sprintf(cstrMsg, "PEN down: %d", g_iPEN_UP_POS); + Log(cstrMsg); + break; - case 1: - penServo.write(penDownPos); - penState=penDownPos; - break; + case 1: + penServo.write(g_iPEN_DOWN_POS); + penState = g_iPEN_DOWN_POS; + sprintf(cstrMsg, "PEN up: %d", g_iPEN_DOWN_POS); + Log(cstrMsg); + break; - default: - sendError(); + default: + sendError(); } } char *val; val = SCmd.next(); - if (val != NULL) { + if (val != NULL) + { value = atoi(val); sendAck(); delay(value); } - if (val==NULL && arg !=NULL) { + if (val == NULL && arg != NULL) + { sendAck(); delay(500); } // Serial.println("delay"); - if (val==NULL && arg ==NULL) + if (val == NULL && arg == NULL) sendError(); -} +} -void togglePen(){ +void togglePen() +{ int value; char *arg; @@ -144,17 +166,22 @@ void togglePen(){ delay(value); } -void doTogglePen() { - if (penState==penUpPos) { - penServo.write(penDownPos); - penState=penDownPos; - } else { - penServo.write(penUpPos); - penState=penUpPos; +void doTogglePen() +{ + if (penState == g_iPEN_UP_POS) + { + penServo.write(g_iPEN_DOWN_POS); + penState = g_iPEN_DOWN_POS; + } + else + { + penServo.write(g_iPEN_UP_POS); + penState = g_iPEN_UP_POS; } } -void enableMotors(){ +void enableMotors() +{ int cmd; int value; char *arg; @@ -165,35 +192,44 @@ void enableMotors(){ val = SCmd.next(); if (val != NULL) value = atoi(val); - //values parsed - if ((arg != NULL) && (val == NULL)){ - switch (cmd) { - case 0: motorsOff(); - sendAck(); - break; - case 1: motorsOn(); - sendAck(); - break; - default: - sendError(); + // values parsed + if ((arg != NULL) && (val == NULL)) + { + switch (cmd) + { + case 0: + motorsOff(); + sendAck(); + break; + case 1: + motorsOn(); + sendAck(); + break; + default: + sendError(); } } - //the following implementaion is a little bit cheated, because i did not know, how to implement different values for first and second argument. - if ((arg != NULL) && (val != NULL)){ - switch (value) { - case 0: motorsOff(); - sendAck(); - break; - case 1: motorsOn(); - sendAck(); - break; - default: - sendError(); + // the following implementaion is a little bit cheated, because i did not know, how to implement different values for first and second argument. + if ((arg != NULL) && (val != NULL)) + { + switch (value) + { + case 0: + motorsOff(); + sendAck(); + break; + case 1: + motorsOn(); + sendAck(); + break; + default: + sendError(); } } } -void stepperModeConfigure(){ +void stepperModeConfigure() +{ int cmd; int value; char *arg; @@ -204,63 +240,75 @@ void stepperModeConfigure(){ val = SCmd.next(); if (val != NULL) value = atoi(val); - if ((arg != NULL) && (val != NULL)){ - switch (cmd) { - case 4: penDownPos= (int) ((float) (value-6000)/(float) 133.3); // transformation from EBB to PWM-Servo - storePenDownPosInEE(); - sendAck(); - break; - case 5: penUpPos= (int)((float) (value-6000)/(float) 133.3); // transformation from EBB to PWM-Servo - storePenUpPosInEE(); - sendAck(); - break; - case 6: //rotMin=value; ignored - sendAck(); - break; - case 7: //rotMax=value; ignored - sendAck(); - break; - case 11: servoRateUp=value; - sendAck(); - break; - case 12: servoRateDown=value; - sendAck(); - break; - default: - sendError(); + if ((arg != NULL) && (val != NULL)) + { + switch (cmd) + { + case 4: + g_iPEN_DOWN_POS = (int)((float)(value - 6000) / (float)133.3); // transformation from EBB to PWM-Servo + Log(String("SC set PEN_DOWN_POS -> ") + g_iPEN_DOWN_POS + " (raw " + value + ")"); + storePenDownPosInEE(); + sendAck(); + break; + case 5: + g_iPEN_UP_POS = (int)((float)(value - 6000) / (float)133.3); // transformation from EBB to PWM-Servo + Log(String("SC set PEN_UP_POS -> ") + g_iPEN_UP_POS + " (raw " + value + ")"); + storePenUpPosInEE(); + sendAck(); + break; + case 6: // rotMin=value; ignored + sendAck(); + break; + case 7: // rotMax=value; ignored + sendAck(); + break; + case 11: + servoRateUp = value; + sendAck(); + break; + case 12: + servoRateDown = value; + sendAck(); + break; + default: + sendError(); } } } -void sendVersion(){ +void sendVersion() +{ Serial.print(initSting); Serial.print("\r\n"); } -void unrecognized(const char *command){ +void unrecognized(const char *command) +{ sendError(); } -void ignore(){ +void ignore() +{ sendAck(); } -void makeComInterface(){ - SCmd.addCommand("v",sendVersion); - SCmd.addCommand("EM",enableMotors); - SCmd.addCommand("SC",stepperModeConfigure); - SCmd.addCommand("SP",setPen); - SCmd.addCommand("SM",stepperMove); - SCmd.addCommand("SE",ignore); - SCmd.addCommand("TP",togglePen); - SCmd.addCommand("PO",ignore); //Engraver command, not implemented, gives fake answer - SCmd.addCommand("NI",nodeCountIncrement); - SCmd.addCommand("ND",nodeCountDecrement); - SCmd.addCommand("SN",setNodeCount); - SCmd.addCommand("QN",queryNodeCount); - SCmd.addCommand("SL",setLayer); - SCmd.addCommand("QL",queryLayer); - SCmd.addCommand("QP",queryPen); - SCmd.addCommand("QB",queryButton); //"PRG" Button, +void makeComInterface() +{ + SCmd.addCommand("v", sendVersion); + SCmd.addCommand("EM", enableMotors); + SCmd.addCommand("SC", stepperModeConfigure); + SCmd.addCommand("SP", setPen); + SCmd.addCommand("SM", stepperMove); + SCmd.addCommand("SE", ignore); + SCmd.addCommand("TP", togglePen); + SCmd.addCommand("PO", ignore); // Engraver command, not implemented, gives fake answer + SCmd.addCommand("NI", nodeCountIncrement); + SCmd.addCommand("ND", nodeCountDecrement); + SCmd.addCommand("SN", setNodeCount); + SCmd.addCommand("QN", queryNodeCount); + SCmd.addCommand("SL", setLayer); + SCmd.addCommand("QL", queryLayer); + SCmd.addCommand("QP", queryPen); + SCmd.addCommand("QB", queryButton); //"PRG" Button, SCmd.setDefaultHandler(unrecognized); // Handler for command that isn't matched (says "What?") -} \ No newline at end of file +} diff --git a/src/Helper_Functions.cpp b/src/Helper_Functions.cpp index 0bae1bc..81ee701 100644 --- a/src/Helper_Functions.cpp +++ b/src/Helper_Functions.cpp @@ -4,10 +4,10 @@ void initHardware() { if (!initConfigStore()) { - penUpPos = 5; - penDownPos = 20; + g_iPEN_UP_POS = 5; + g_iPEN_DOWN_POS = 20; } - penState = penUpPos; + penState = g_iPEN_UP_POS; g_stepEngine.init(); g_pStepperRotate = g_stepEngine.stepperConnectToPin(step1); diff --git a/src/main.cpp b/src/main.cpp index 580a9c1..5dc446a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -52,13 +52,13 @@ Button motorsToggle(motorsButton, toggleMotors); // Variables... be careful, by messing around here, everything has a reason and crossrelations... int penMin = 0; int penMax = 0; -int penUpPos = 5; // can be overwritten from EBB-Command SC -int penDownPos = 20; // can be overwritten from EBB-Command SC +int g_iPEN_UP_POS = 5; // can be overwritten from EBB-Command SC +int g_iPEN_DOWN_POS = 20; // can be overwritten from EBB-Command SC int servoRateUp = 0; // from EBB-Protocol not implemented on machine-side int servoRateDown = 0; // from EBB-Protocol not implemented on machine-side long rotStepError = 0; long penStepError = 0; -int penState = penUpPos; +int penState = g_iPEN_UP_POS; uint32_t nodeCount = 0; unsigned int layer = 0; boolean prgButtonState = 0;