Add basic terminal
This commit is contained in:
parent
ed4972c87e
commit
af35388505
@ -218,6 +218,9 @@
|
||||
<Compile Include="pwm.hpp">
|
||||
<SubType>compile</SubType>
|
||||
</Compile>
|
||||
<Compile Include="terminal.hpp">
|
||||
<SubType>compile</SubType>
|
||||
</Compile>
|
||||
<Compile Include="thermistor.cpp">
|
||||
<SubType>compile</SubType>
|
||||
</Compile>
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "uart/hardware0.hpp"
|
||||
|
||||
#include "pwm.hpp"
|
||||
#include "terminal.hpp"
|
||||
#include "thermistor.hpp"
|
||||
|
||||
template <typename T>
|
||||
@ -34,9 +35,8 @@ uint8_t temperatureCurve(double temperature)
|
||||
int main()
|
||||
{
|
||||
uart::Uart0<uart::Config<115200>> serial;
|
||||
serial.init();
|
||||
|
||||
serial << F("Thermistor reader\r\n");
|
||||
Terminal<decltype(serial)> terminal;
|
||||
terminal.init();
|
||||
|
||||
using adc_conf = adc::Config<adc::SingleMode>;
|
||||
|
||||
@ -54,7 +54,7 @@ int main()
|
||||
const auto temperature = temp.getTemperature(fantempResistance);
|
||||
const auto fanSpeed = temperatureCurve(temperature);
|
||||
|
||||
char floatBuffer[16];
|
||||
/*char floatBuffer[16];
|
||||
|
||||
sprintf(floatBuffer, "%.2f", adcSample);
|
||||
serial << F("Read ADC: ") << floatBuffer << F("\r\n");
|
||||
@ -62,11 +62,11 @@ int main()
|
||||
serial << F("Resistance: ") << floatBuffer << F("\r\n");
|
||||
sprintf(floatBuffer, "%.2f", temperature);
|
||||
serial << F("Temperature: ") << floatBuffer << F(" C \r\n");
|
||||
serial << F("Fan speed: ") << fanSpeed << F("%\r\n");
|
||||
serial << F("Fan speed: ") << fanSpeed << F("%\r\n");*/
|
||||
|
||||
pwm::setDuty(fanSpeed);
|
||||
|
||||
_delay_ms(1000);
|
||||
terminal.callback();
|
||||
}
|
||||
|
||||
serial.flushTx();
|
||||
|
86
fantemp/terminal.hpp
Normal file
86
fantemp/terminal.hpp
Normal file
@ -0,0 +1,86 @@
|
||||
#pragma once
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "flash/flash.hpp"
|
||||
|
||||
#define ENDL F("\r\n")
|
||||
|
||||
template <class Uart>
|
||||
class Terminal {
|
||||
public:
|
||||
static void init()
|
||||
{
|
||||
m_serial.init();
|
||||
|
||||
m_serial << ENDL << F("FanTemp Control Panel") << ENDL << ENDL << F("$ ");
|
||||
}
|
||||
|
||||
static void callback()
|
||||
{
|
||||
uint8_t inputByte;
|
||||
bool handleInput = false;
|
||||
|
||||
while (m_serial.rxByte(inputByte)) {
|
||||
if (isprint(inputByte) || inputByte == 0x03) {
|
||||
m_inputBuffer[m_inputSize++] = inputByte;
|
||||
|
||||
// Handle Ctrl + C
|
||||
if (inputByte == 0x03) {
|
||||
m_serial << F("^C");
|
||||
handleInput = true;
|
||||
break;
|
||||
}
|
||||
// Echo
|
||||
else {
|
||||
m_serial << static_cast<char>(inputByte);
|
||||
}
|
||||
}
|
||||
|
||||
// Handle backspace
|
||||
if (inputByte == 0x7f && m_inputSize > 0) {
|
||||
m_serial << static_cast<char>(0x7f);
|
||||
--m_inputSize;
|
||||
}
|
||||
// Handle line terminator
|
||||
else if (inputByte == '\r' || inputByte == '\n') {
|
||||
// Consume possible second line terminator
|
||||
if (m_serial.peek(inputByte) && (inputByte == '\r' || inputByte == '\n')) {
|
||||
m_serial.rxByte(inputByte);
|
||||
}
|
||||
handleInput = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (m_inputSize >= INPUT_BUFFER_SIZE) {
|
||||
m_serial << ENDL << F("WARNING: Terminal input buffer overflow!") << ENDL;
|
||||
handleInput = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (handleInput) {
|
||||
parseInput();
|
||||
m_inputSize = 0;
|
||||
m_serial << ENDL << F("$ ");
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
static constexpr auto INPUT_BUFFER_SIZE = 128;
|
||||
|
||||
static Uart m_serial;
|
||||
static char m_inputBuffer[INPUT_BUFFER_SIZE];
|
||||
static uint16_t m_inputSize;
|
||||
|
||||
static void parseInput() {}
|
||||
};
|
||||
|
||||
template <class Uart>
|
||||
char Terminal<Uart>::m_inputBuffer[INPUT_BUFFER_SIZE];
|
||||
|
||||
template <class Uart>
|
||||
uint16_t Terminal<Uart>::m_inputSize = 0;
|
||||
|
||||
#undef ENDL
|
Loading…
Reference in New Issue
Block a user