diff --git a/Devices/Control/Firmware/src/main.cpp b/Devices/Control/Firmware/src/main.cpp index c22aacb..45ac483 100644 --- a/Devices/Control/Firmware/src/main.cpp +++ b/Devices/Control/Firmware/src/main.cpp @@ -1,119 +1,27 @@ #include -#include -#include +#include +#include +#include -#define SLAVE_ADDR 9 -const int bjtCount = 4; - -const int bjtPin[bjtCount] = {6, 5, 3, 10}; -int bjtState[bjtCount] = {255, 255, 255, 255}; //255 -> bjt max "open" - -char receivedSerialData[4]; -char receivedI2cData[4]; -String pendingSerialData; - -void changeLights(char data[]) -{ - for (int i = 0; i < bjtCount; i++) - { - char numChar[2]; - itoa(i, numChar, 10); - - if (data[0] == numChar[0]) - { - if (data[1] == 't') - { - if (bjtState[i] != 0) - { - bjtState[i] = 0; - } - else - { - bjtState[i] = 255; - } - } - else if (data[1] == 'i') - { - bjtState[i] += 5; - } - else if (data[1] == 'd') - { - bjtState[i] -= 5; - } - } - - //clamp state between 0 and 255 - if (bjtState[i] > 255) - { - bjtState[i] = 255; - } - - if (bjtState[i] < 0) - { - bjtState[i] = 0; - } - - //set absolute state for all - if (!strcmp(data, "off")) - { - bjtState[i] = 0; - } - - if (!strcmp(data, "on")) - { - bjtState[i] = 255; - } - - analogWrite(bjtPin[i], bjtState[i]); - EEPROM.update(i, bjtState[i]); - } - - memset(data, ' ', 3); -} - -void receiveEvent(int byteCount) -{ - char buffer[byteCount]; - for (int i = 0; i < byteCount; i++) - { - buffer[i] = Wire.read(); - } - memset(receivedI2cData, ' ', 3); - strcpy(receivedI2cData, buffer); -} +StreamCommunicator *computer; +StreamCommunicator *console; +LightController *light; +const int STEPS = 5; void setup() { - Serial.begin(9600); - Serial.setTimeout(5); - Wire.begin(SLAVE_ADDR); - Wire.onReceive(receiveEvent); - - for (int i = 0; i < bjtCount; i++) - { - pinMode(bjtPin[i], OUTPUT); - bjtState[i] = EEPROM.read(i); - analogWrite(bjtPin[i], bjtState[i]); - } + int bjtCount = 4; + const int bjtPin[bjtCount] = {6, 5, 3, 10}; + computer = new SerialCommunicator(Serial, 9600, 5, 50); + console = new I2CCommunicator(Wire, 9, 5, 50); + light = new LightController(bjtPin, bjtCount); } void loop() { - while (Serial.available()) - { - strcpy(receivedSerialData, Serial.readString().c_str()); - } - - changeLights(receivedSerialData); - changeLights(receivedI2cData); - - pendingSerialData = ""; - for (int i = 0; i < bjtCount; i++) - { - noInterrupts(); - pendingSerialData += String(bjtState[i]) + ","; - interrupts(); - } - pendingSerialData.remove(pendingSerialData.length() - 1); - Serial.println(pendingSerialData); + light->updateState(console->receiveMessage(), STEPS); + light->updateState(computer->receiveMessage(), STEPS); + computer->sendMessage(light->getBjtState(), light->getBjtCount()); + computer->clearBuffer(); + console->clearBuffer(); } \ No newline at end of file