#include "calclib.hpp" #include const int buzzer = A0; bool canbuzz = false; char receivedChar; boolean newData = false; uint8_t calcCount = 0; const int bufferSize = 128; Calculator calc; CalculatorVariables vars; void saveEEP() { EEPROM.write(0, canbuzz ? 1 : 0); EEPROM.write(1, calc.cursor); EEPROM.write(2, calc.tokenLength); for (int i = 0; i < bufferSize; i++) { EEPROM.write(3 + i, calc.buffer[i]); } } void loadEEP() { canbuzz = EEPROM.read(0) != 0; calc.cursor = EEPROM.read(1); calc.tokenLength = EEPROM.read(2); for (int i = 0; i < bufferSize; i++) { calc.buffer[i] = EEPROM.read(3 + i); } } void setup() { Serial.begin(115200); calc.InitBuffer(bufferSize); loadEEP(); vars.InitBuffer(2); vars.buffer[0] = CalculatorVariable('e', exp(1.0f)); vars.buffer[1] = CalculatorVariable('p', M_PI); pinMode(buzzer, OUTPUT); } void loop() { recvOneChar(); computeTokenAdd(); } void recvOneChar() { if (Serial.available() > 0) { receivedChar = Serial.read(); if (receivedChar != '\n') newData = true; } } void BuzzerSound(int dv) { if (canbuzz == false) return; tone(buzzer, dv); delay(20); noTone(buzzer); } void reset() { saveEEP(); BuzzerSound(500); asm volatile (" jmp 0"); } void computeTokenAdd() { if (newData == false) return; switch (receivedChar) { case '=': { calcCount++; CalculatorResult r = calc.Parse(vars); char* res = r.Result(); Serial.println(res); free(res); BuzzerSound(3000); if (calcCount == 2) reset(); } break; case 'D': calc.RemoveToken(); BuzzerSound(1000); break; case 'X': BuzzerSound(500); calc.ClearBuffer(); break; case 'V': canbuzz = !canbuzz; BuzzerSound(1000); break; case 'M': calc.useRads = !calc.useRads; if (calc.useRads) { BuzzerSound(2000); } else { BuzzerSound(1500); } break; case '?': Serial.println(calc.buffer); BuzzerSound(2000); break; default: calc.AddToken(receivedChar); BuzzerSound(2500); break; } newData = false; }