320 lines
5.0 KiB
C++
320 lines
5.0 KiB
C++
#include "EggDuino.h"
|
|
|
|
void queryPen()
|
|
{
|
|
Log(__FUNCTION__);
|
|
char state;
|
|
if (g_iPenState == g_iPenUpPos)
|
|
state = '1';
|
|
else
|
|
state = '0';
|
|
Serial.print(String(state) + "\r\n");
|
|
sendAck();
|
|
}
|
|
|
|
void queryButton()
|
|
{
|
|
Serial.print(String(g_bPrgButtonState) + "\r\n");
|
|
sendAck();
|
|
g_bPrgButtonState = 0;
|
|
}
|
|
|
|
void queryLayer()
|
|
{
|
|
Log(__FUNCTION__);
|
|
Serial.print(String(g_uiLayer) + "\r\n");
|
|
sendAck();
|
|
}
|
|
|
|
void setLayer()
|
|
{
|
|
Log(__FUNCTION__);
|
|
uint32_t value = 0;
|
|
char *arg1;
|
|
arg1 = SCmd.next();
|
|
if (arg1 != NULL)
|
|
{
|
|
value = atoi(arg1);
|
|
g_uiLayer = value;
|
|
sendAck();
|
|
}
|
|
else
|
|
sendError();
|
|
}
|
|
|
|
void queryNodeCount()
|
|
{
|
|
Serial.print(String(g_uiNodeCount) + "\r\n");
|
|
sendAck();
|
|
}
|
|
|
|
void setNodeCount()
|
|
{
|
|
Log(__FUNCTION__);
|
|
uint32_t value = 0;
|
|
char *arg1;
|
|
arg1 = SCmd.next();
|
|
if (arg1 != NULL)
|
|
{
|
|
value = atoi(arg1);
|
|
g_uiNodeCount = value;
|
|
sendAck();
|
|
}
|
|
else
|
|
sendError();
|
|
}
|
|
|
|
void nodeCountIncrement()
|
|
{
|
|
g_uiNodeCount = g_uiNodeCount++;
|
|
sendAck();
|
|
}
|
|
|
|
void nodeCountDecrement()
|
|
{
|
|
g_uiNodeCount = g_uiNodeCount--;
|
|
sendAck();
|
|
}
|
|
|
|
void stepperMove()
|
|
{
|
|
Log(__FUNCTION__);
|
|
uint16_t duration = 0; // in ms
|
|
int penStepsEBB = 0; // Pen
|
|
int rotStepsEBB = 0; // Rot
|
|
|
|
moveToDestination();
|
|
|
|
if (!parseSMArgs(&duration, &penStepsEBB, &rotStepsEBB))
|
|
{
|
|
sendError();
|
|
return;
|
|
}
|
|
|
|
sendAck();
|
|
|
|
if ((penStepsEBB == 0) && (rotStepsEBB == 0))
|
|
{
|
|
delay(duration);
|
|
return;
|
|
}
|
|
|
|
prepareMove(duration, penStepsEBB, rotStepsEBB);
|
|
}
|
|
|
|
void setPen()
|
|
{
|
|
Log(__FUNCTION__);
|
|
int cmd;
|
|
int value;
|
|
char *arg;
|
|
char cstrMsg[20];
|
|
|
|
moveToDestination();
|
|
|
|
arg = SCmd.next();
|
|
if (arg != NULL)
|
|
{
|
|
cmd = atoi(arg);
|
|
switch (cmd)
|
|
{
|
|
case 0:
|
|
penServo.write(g_iPenUpPos);
|
|
break;
|
|
|
|
case 1:
|
|
penServo.write(g_iPenDownPos);
|
|
break;
|
|
|
|
default:
|
|
sendError();
|
|
}
|
|
}
|
|
char *val;
|
|
val = SCmd.next();
|
|
if (val != NULL)
|
|
{
|
|
value = atoi(val);
|
|
sendAck();
|
|
delay(value);
|
|
}
|
|
if (val == NULL && arg != NULL)
|
|
{
|
|
sendAck();
|
|
delay(500);
|
|
}
|
|
// Serial.println("delay");
|
|
if (val == NULL && arg == NULL)
|
|
sendError();
|
|
}
|
|
|
|
void togglePen()
|
|
{
|
|
Log(__FUNCTION__);
|
|
int value;
|
|
char *arg;
|
|
|
|
moveToDestination();
|
|
|
|
arg = SCmd.next();
|
|
if (arg != NULL)
|
|
value = atoi(arg);
|
|
else
|
|
value = 500;
|
|
|
|
doTogglePen();
|
|
sendAck();
|
|
delay(value);
|
|
}
|
|
|
|
void doTogglePen()
|
|
{
|
|
Log(__FUNCTION__);
|
|
if (g_iPenState == g_iPenUpPos)
|
|
{
|
|
penServo.write(g_iPenDownPos);
|
|
g_iPenState = g_iPenDownPos;
|
|
}
|
|
else
|
|
{
|
|
penServo.write(g_iPenUpPos);
|
|
g_iPenState = g_iPenUpPos;
|
|
}
|
|
}
|
|
|
|
void enableMotors()
|
|
{
|
|
Log(__FUNCTION__);
|
|
int cmd;
|
|
int value;
|
|
char *arg;
|
|
char *val;
|
|
arg = SCmd.next();
|
|
if (arg != NULL)
|
|
cmd = atoi(arg);
|
|
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();
|
|
}
|
|
}
|
|
// 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()
|
|
{
|
|
Log(__FUNCTION__);
|
|
int cmd;
|
|
int value;
|
|
char *arg;
|
|
arg = SCmd.next();
|
|
if (arg != NULL)
|
|
cmd = atoi(arg);
|
|
char *val;
|
|
val = SCmd.next();
|
|
if (val != NULL)
|
|
value = atoi(val);
|
|
if ((arg != NULL) && (val != NULL))
|
|
{
|
|
switch (cmd)
|
|
{
|
|
case 4:
|
|
g_iPenDownPos = (int)((float)(value - 6000) / (float)133.3); // transformation from EBB to PWM-Servo
|
|
storePenDownPosInEE();
|
|
sendAck();
|
|
break;
|
|
case 5:
|
|
g_iPenUpPos = (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:
|
|
g_iServoRateUp = value;
|
|
sendAck();
|
|
break;
|
|
case 12:
|
|
g_iServoRateDown = value;
|
|
sendAck();
|
|
break;
|
|
default:
|
|
sendError();
|
|
}
|
|
}
|
|
}
|
|
|
|
void sendVersion()
|
|
{
|
|
Log(__FUNCTION__);
|
|
Serial.print(initSting);
|
|
Serial.print("\r\n");
|
|
}
|
|
|
|
void unrecognized(const char *command)
|
|
{
|
|
Log(__FUNCTION__);
|
|
sendError();
|
|
}
|
|
|
|
void ignore()
|
|
{
|
|
Log(__FUNCTION__);
|
|
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,
|
|
SCmd.setDefaultHandler(unrecognized); // Handler for command that isn't matched (says "What?")
|
|
}
|