b15f/firmware/request_handlers.cpp

356 lines
5.9 KiB
C++
Raw Normal View History

2019-06-21 14:05:57 +02:00
#include "request_handlers.h"
2019-03-26 15:02:58 +01:00
2019-04-03 14:58:50 +02:00
void handleRequest()
{
const uint8_t req = usart.readByte();
wdt_reset();
switch(req)
{
2019-06-21 14:31:14 +02:00
case RQ_DISCARD:
2019-04-03 14:58:50 +02:00
break;
case RQ_TEST:
rqTestConnection();
break;
case RQ_INFO:
rqBoardInfo();
break;
2019-06-21 14:31:14 +02:00
case RQ_INT_TEST:
2019-04-03 14:58:50 +02:00
rqTestIntConv();
break;
2019-06-21 14:31:14 +02:00
case RQ_SELF_TEST:
2019-04-03 14:58:50 +02:00
rqSelfTest();
break;
2019-06-21 14:37:42 +02:00
case RQ_DIGITAL_WRITE_0:
2019-04-03 14:58:50 +02:00
rqDigitalWrite0();
break;
2019-06-21 14:37:42 +02:00
case RQ_DIGITAL_WRITE_1:
2019-04-03 14:58:50 +02:00
rqDigitalWrite1();
break;
2019-06-21 14:37:42 +02:00
case RQ_DIGITAL_READ_0:
2019-04-03 14:58:50 +02:00
rqDigitalRead0();
break;
2019-06-21 14:37:42 +02:00
case RQ_DIGITAL_READ_1:
2019-04-03 14:58:50 +02:00
rqDigitalRead1();
break;
2019-06-21 14:37:42 +02:00
case RQ_READ_DIP_SWITCH:
2019-04-03 14:58:50 +02:00
rqReadDipSwitch();
break;
2019-06-21 14:37:42 +02:00
case RQ_ANALOG_WRITE_0:
2019-04-03 14:58:50 +02:00
rqAnalogWrite0();
break;
2019-06-21 14:37:42 +02:00
case RQ_ANALOG_WRITE_1:
2019-04-03 14:58:50 +02:00
rqAnalogWrite1();
break;
2019-06-21 14:37:42 +02:00
case RQ_ANALOG_READ:
2019-04-03 14:58:50 +02:00
rqAnalogRead();
break;
case RQ_ADC_DAC_STROKE:
rqAdcDacStroke();
break;
2019-05-28 12:32:31 +02:00
case RQ_PWM_SET_FREQ:
rqPwmSetFreq();
break;
case RQ_PWM_SET_VALUE:
rqPwmSetValue();
break;
2019-05-29 10:13:36 +02:00
2019-06-21 16:32:04 +02:00
case RQ_SET_MEM_8:
rqSetMem8();
2019-05-29 10:13:36 +02:00
break;
2019-06-21 16:32:04 +02:00
case RQ_GET_MEM_8:
rqGetMem8();
2019-05-29 10:13:36 +02:00
break;
2019-06-25 11:06:25 +02:00
break;
case RQ_SET_MEM_16:
rqSetMem16();
break;
case RQ_GET_MEM_16:
rqGetMem16();
break;
case RQ_COUNTER_OFFSET:
rqGetInterruptCounterOffset();
break;
2019-06-27 15:29:18 +02:00
case RQ_SERVO_ENABLE:
rqServoEnable();
break;
case RQ_SERVO_DISABLE:
rqServoDisable();
break;
case RQ_SERVO_SET_POS:
rqServoSetPosition();
break;
2019-04-03 14:58:50 +02:00
default:
break;
}
usart.initRX();
wdt_disable();
}
2019-03-26 15:02:58 +01:00
void rqTestConnection()
{
2019-04-02 15:32:51 +02:00
usart.initTX();
uint8_t dummy = usart.readByte();
usart.writeByte(USART::MSG_OK);
usart.writeByte(dummy);
usart.flush();
2019-03-26 15:02:58 +01:00
}
void rqBoardInfo()
{
2019-04-02 15:32:51 +02:00
usart.initTX();
2019-06-28 14:21:10 +02:00
usart.writeByte(4); // Anzahl an Strings
2019-04-02 15:32:51 +02:00
usart.writeStr(DATE, sizeof(DATE));
usart.writeStr(TIME, sizeof(TIME));
usart.writeStr(FSRC, sizeof(FSRC));
2019-06-28 14:21:10 +02:00
usart.writeStr(COMMIT_HASH, sizeof(COMMIT_HASH));
2019-04-02 15:32:51 +02:00
usart.writeByte(USART::MSG_OK);
usart.flush();
2019-03-26 15:02:58 +01:00
}
void rqTestIntConv()
{
2019-04-02 15:32:51 +02:00
usart.initTX();
uint16_t d = usart.readInt();
usart.writeInt(d * 3);
usart.flush();
2019-03-26 15:02:58 +01:00
}
2019-03-26 16:30:49 +01:00
2019-04-03 12:05:08 +02:00
void rqSelfTest()
{
usart.initTX();
usart.writeByte(USART::MSG_OK);
usart.flush();
wdt_disable();
while(1)
{
testAll();
}
}
2019-03-26 16:30:49 +01:00
void rqDigitalWrite0()
{
2019-04-02 15:32:51 +02:00
usart.initTX();
uint8_t port = usart.readByte();
2019-04-03 08:40:14 +02:00
dio0.writePortA(port);
2019-03-26 16:30:49 +01:00
2019-04-02 15:32:51 +02:00
usart.writeByte(USART::MSG_OK);
usart.flush();
2019-03-26 16:30:49 +01:00
}
void rqDigitalWrite1()
{
2019-04-02 15:32:51 +02:00
usart.initTX();
uint8_t port = usart.readByte();
2019-04-03 08:40:14 +02:00
dio1.writePortA(port);
2019-03-26 16:30:49 +01:00
2019-04-02 15:32:51 +02:00
usart.writeByte(USART::MSG_OK);
usart.flush();
2019-03-26 16:30:49 +01:00
}
void rqDigitalRead0()
{
2019-04-02 15:32:51 +02:00
usart.initTX();
2019-04-03 08:40:14 +02:00
uint8_t port = dio0.readPortB();
2019-04-02 15:32:51 +02:00
usart.writeByte(port);
usart.flush();
2019-03-26 16:30:49 +01:00
}
void rqDigitalRead1()
{
2019-04-02 15:32:51 +02:00
usart.initTX();
2019-04-03 08:40:14 +02:00
uint8_t port = dio1.readPortB();
2019-04-02 15:32:51 +02:00
usart.writeByte(port);
usart.flush();
2019-03-26 16:30:49 +01:00
}
2019-04-03 09:34:22 +02:00
void rqReadDipSwitch()
{
usart.initTX();
uint8_t port = dsw.readPortB();
usart.writeByte(port);
usart.flush();
}
2019-03-26 16:30:49 +01:00
void rqAnalogWrite0()
{
2019-04-02 15:32:51 +02:00
usart.initTX();
uint16_t value = usart.readInt();
2019-04-03 08:40:14 +02:00
dac0.setValue(value);
2019-03-26 16:30:49 +01:00
2019-04-02 15:32:51 +02:00
usart.writeByte(USART::MSG_OK);
usart.flush();
2019-03-26 16:30:49 +01:00
}
void rqAnalogWrite1()
{
2019-04-02 15:32:51 +02:00
usart.initTX();
uint16_t value = usart.readInt();
2019-04-03 08:40:14 +02:00
dac1.setValue(value);
2019-03-26 16:30:49 +01:00
2019-04-02 15:32:51 +02:00
usart.writeByte(USART::MSG_OK);
usart.flush();
2019-03-26 16:30:49 +01:00
}
void rqAnalogRead()
{
2019-04-02 15:32:51 +02:00
usart.initTX();
uint8_t channel = usart.readByte();
2019-04-03 08:40:14 +02:00
uint16_t value = adu.getValue(channel);
2019-04-02 15:32:51 +02:00
usart.writeInt(value);
usart.flush();
2019-03-26 16:30:49 +01:00
}
2019-03-27 10:33:26 +01:00
void rqAdcDacStroke()
{
2019-04-02 15:32:51 +02:00
uint8_t channel_a = usart.readByte();
uint8_t channel_b = usart.readByte();
2019-03-27 10:49:26 +01:00
2019-04-02 15:32:51 +02:00
int16_t start = static_cast<int16_t>(usart.readInt());
int16_t delta = static_cast<int16_t>(usart.readInt());
int16_t count = static_cast<int16_t>(usart.readInt());
2019-03-27 10:33:26 +01:00
count *= delta;
2019-03-28 13:32:24 +01:00
for(int16_t i = start; i < count; i += delta)
2019-03-27 10:33:26 +01:00
{
2019-04-03 08:40:14 +02:00
dac0.setValue(i);
2019-03-27 15:48:36 +01:00
wdt_reset();
2019-03-28 15:22:17 +01:00
2019-04-03 08:40:14 +02:00
uint16_t val_a = adu.getValue(channel_a);
uint16_t val_b = adu.getValue(channel_b);
2019-04-02 16:19:42 +02:00
usart.initTX();
2019-04-02 15:32:51 +02:00
usart.writeInt(val_a);
usart.writeInt(val_b);
2019-04-02 16:19:42 +02:00
usart.flush();
2019-03-27 10:33:26 +01:00
}
2019-04-02 16:19:42 +02:00
usart.initTX();
2019-04-02 15:32:51 +02:00
usart.writeByte(USART::MSG_OK);
2019-04-02 16:19:42 +02:00
usart.flush();
2019-03-27 10:33:26 +01:00
}
2019-05-28 11:12:58 +02:00
2019-05-28 12:32:31 +02:00
void rqPwmSetFreq()
{
usart.initTX();
uint32_t freq = usart.readU32();
pwm.setFrequency(freq);
usart.writeByte(pwm.getTop());
usart.flush();
}
void rqPwmSetValue()
2019-05-28 11:12:58 +02:00
{
usart.initTX();
uint16_t value = usart.readByte();
2019-05-28 12:32:31 +02:00
pwm.setValue(value);
2019-05-28 11:12:58 +02:00
usart.writeByte(USART::MSG_OK);
usart.flush();
}
2019-05-29 10:13:36 +02:00
2019-06-21 16:32:04 +02:00
void rqSetMem8()
2019-05-29 10:13:36 +02:00
{
usart.initTX();
2019-06-21 16:32:04 +02:00
uint16_t reg = usart.readInt();
uint8_t val = usart.readByte();
2019-05-29 10:13:36 +02:00
(*(volatile uint8_t *) reg) = val;
usart.writeByte((*(volatile uint8_t *) reg));
usart.flush();
}
2019-06-21 16:32:04 +02:00
void rqGetMem8()
2019-05-29 10:13:36 +02:00
{
usart.initTX();
2019-06-21 16:32:04 +02:00
uint16_t reg = usart.readInt();
2019-05-29 10:13:36 +02:00
usart.writeByte((*(volatile uint8_t *) reg));
usart.flush();
}
2019-06-21 16:32:04 +02:00
void rqSetMem16()
{
usart.initTX();
uint16_t reg = usart.readInt();
uint16_t val = usart.readInt();
(*(volatile uint16_t *) reg) = val;
usart.writeInt((*(volatile uint16_t *) reg));
usart.flush();
}
void rqGetMem16()
{
usart.initTX();
uint16_t reg = usart.readInt();
usart.writeInt((*(volatile uint16_t *) reg));
usart.flush();
}
2019-06-25 11:06:25 +02:00
void rqGetInterruptCounterOffset()
{
usart.initTX();
usart.writeInt((volatile uint16_t) &interruptCounters[0]);
usart.flush();
}
2019-06-27 15:29:18 +02:00
void rqServoEnable()
{
usart.initTX();
servo.enable();
usart.writeByte(USART::MSG_OK);
usart.flush();
}
void rqServoDisable()
{
usart.initTX();
servo.disable();
usart.writeByte(USART::MSG_OK);
usart.flush();
}
void rqServoSetPosition()
{
usart.initTX();
uint16_t pos = usart.readInt();
servo.setPosition(pos);
usart.writeByte(USART::MSG_OK);
usart.flush();
}