DDU_Exammen/ModuleMorse/ModuleMorse.ino

201 lines
3.9 KiB
C++

#include <M5StickCPlus2.h>
#include "MorsePart.h"
#define refreshDelay 1000
#define BTN_A 25
#define BTN_B 26
#define extenderPin 32
int currentlySelected = 1000;
const int numCodes = 11;
const String codes[] = {
"bond", "swap", "call", "repo", "yield", "index", "asset", "bear", "bull", "gain", "loss"};
#define selectedDisplayLength 0 // Used for debug but not used for production
bool isSelectionMode = false;
long onSelectedTime = 0;
int correctIndex;
bool hasWon = false;
void initRandomSeed()
{
M5.Imu.init();
float accX, accY, accZ;
delay(250); // Wait for imu init
M5.Imu.getAccelData(&accX, &accY, &accZ);
float accelSum = accX + accY + accZ;
M5.Imu.sleep();
unsigned long seed = accelSum * 1000000;
randomSeed(seed);
}
void setup()
{
M5.begin();
M5.Lcd.setRotation(3);
M5.Lcd.fillScreen(BLACK);
pinMode(BTN_A, INPUT_PULLUP);
pinMode(BTN_B, INPUT_PULLUP);
pinMode(extenderPin, OUTPUT_OPEN_DRAIN);
Serial.begin(115200);
updateUI();
initRandomSeed();
//correctIndex = 1;
correctIndex = random(0, 12);
morseInit(correctIndex, 0, 0, 300, 100);
}
void updateUI()
{
Serial.println("Next correct: " + codes[correctIndex]);
// Clear screen
M5.Lcd.fillRect(0, 100, 300, 100, BLACK);
if (hasWon)
{
M5.Lcd.fillScreen(GREEN);
digitalWrite(extenderPin, LOW);
delay(3000);
// Wait for reset click
while (digitalRead(BTN_A) == HIGH || digitalRead(BTN_B) == HIGH)
{
delay(10);
}
while (digitalRead(BTN_A) == HIGH || digitalRead(BTN_B) == HIGH)
{
delay(10);
}
digitalWrite(extenderPin, HIGH);
hasWon = false;
M5.Lcd.fillScreen(BLUE);
correctIndex = random(0, 12);
delay(1000);
return;
}
if (!isSelectionMode)
{
// Draw divider
M5.Lcd.drawLine(0, 100, 300, 100, WHITE);
// Draw left text
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(20, 110);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.print(codes[(currentlySelected - 1) % numCodes]);
// Draw selected text
M5.Lcd.fillRect(90, 110 - 5, 14 * 5, 25, WHITE);
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(95, 110);
M5.Lcd.setTextColor(BLACK);
M5.Lcd.print(codes[(currentlySelected) % numCodes]);
// Draw right text
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(175, 110);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.print(codes[(currentlySelected + 1) % numCodes]);
}
else
{
// Draw selected text
M5.Lcd.setTextSize(4);
M5.Lcd.setCursor(10, 20);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.print(codes[(currentlySelected) % numCodes]);
}
}
void onBothPressed()
{
isSelectionMode = true;
Serial.println("Selected: " + codes[(currentlySelected) % numCodes]);
updateUI();
if (correctIndex == (currentlySelected) % numCodes)
hasWon = true;
else
{
M5.Lcd.fillScreen(RED);
delay(3000);
morseDisplayIndex = 0; // Reset morse
}
onSelectedTime = millis();
}
bool isButtonAPressed, isButtonBPressed = false;
void loop()
{
morseUpdate();
if (millis() % refreshDelay < 100)
updateUI();
if (!isButtonAPressed && digitalRead(BTN_A) == LOW)
{
isButtonAPressed = true;
//Serial.println("A pressed");
if (isButtonBPressed)
{
onBothPressed();
return;
}
}
else if (isButtonAPressed && digitalRead(BTN_A) == HIGH)
{
isButtonAPressed = false;
//Serial.println("A released");
if (!isSelectionMode)
{
currentlySelected++;
updateUI();
}
}
if (!isButtonBPressed && digitalRead(BTN_B) == LOW)
{
isButtonBPressed = true;
//Serial.println("B pressed");
if (isButtonAPressed)
{
onBothPressed();
return;
}
}
else if (isButtonBPressed && digitalRead(BTN_B) == HIGH)
{
isButtonBPressed = false;
//Serial.println("B released");
if (!isSelectionMode)
{
currentlySelected--;
updateUI();
}
}
if (isSelectionMode && onSelectedTime + selectedDisplayLength < millis())
{
isSelectionMode = false;
}
}