From 2278c768e7c49bbee4ab03a531059145d747b055 Mon Sep 17 00:00:00 2001 From: Aadi Desai <21363892+supleed2@users.noreply.github.com> Date: Wed, 23 Mar 2022 12:48:26 +0000 Subject: [PATCH 1/7] Add Note stepSize Calculation Sheet --- docs/Note Step Calculation.xlsx | Bin 0 -> 13131 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/Note Step Calculation.xlsx diff --git a/docs/Note Step Calculation.xlsx b/docs/Note Step Calculation.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b2b11f4ebc2c14e22bbd93065a92e8bdd546020d GIT binary patch literal 13131 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 Date: Wed, 23 Mar 2022 12:48:52 +0000 Subject: [PATCH 2/7] Now pulls stepSize from array and prints to screen --- src/main.cpp | 54 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 593349b..3f3e97e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,8 +3,22 @@ #include #include +volatile int32_t currentStepSize; + #pragma region Config Values -const uint32_t interval = 10; // Display update interval +const uint32_t interval = 10; // Display update interval +const uint8_t octave = 4; // Octave to start on +const uint32_t samplingRate = 44100; // Sampling rate +const int32_t stepSizes[] = { + 6370029, 6748811, 7150116, 7575284, 8025734, 8502969, 9008582, + 9544260, 10111791, 10713070, 11350102, 12025014, 12740059, 13497622, + 14300233, 15150569, 16051469, 17005939, 18017164, 19088521, 20223583, + 21426140, 22700205, 24050029, 25480118, 26995245, 28600466, 30301138, + 32102938, 34011878, 36034329, 38177042, 40447167, 42852281, 45400410, + 48100059, 50960237, 53990491, 57200933, 60602277, 64205876, 68023756, + 72068659, 76354085, 80894335, 85704562, 90800821, 96200119, 101920475, + 107980982, 114401866, 121204555, 12841175, 136047513, 144137319, 152708170, + 161788670, 171409125, 181601642, 192400238}; // Step sizes for each note #pragma endregion #pragma region Pin Definitions @@ -46,25 +60,6 @@ void setOutMuxBit(const uint8_t bitIdx, const bool value) { digitalWrite(REN_PIN, LOW); } -// Function to read keys from key matrix -uint32_t readKeys() { - uint32_t keys = 0; - for (uint8_t i = 0; i < 3; i++) { - digitalWrite(REN_PIN, LOW); - digitalWrite(RA0_PIN, i & 0x01); - digitalWrite(RA1_PIN, i & 0x02); - digitalWrite(RA2_PIN, i & 0x04); - digitalWrite(REN_PIN, HIGH); - delayMicroseconds(5); - keys |= !digitalRead(C0_PIN) << (i * 4); - keys |= !digitalRead(C1_PIN) << (i * 4 + 1); - keys |= !digitalRead(C2_PIN) << (i * 4 + 2); - keys |= !digitalRead(C3_PIN) << (i * 4 + 3); - } - digitalWrite(REN_PIN, LOW); - return keys; -} - // Read key values in currently set row uint8_t readCols() { uint8_t row = 0; @@ -84,6 +79,18 @@ void setRow(const uint8_t rowIdx) { digitalWrite(REN_PIN, HIGH); } +uint16_t getTopKey(const uint8_t array[]) { + uint16_t topKey = 0; + for (uint8_t i = 0; i < 3; i++) { + for (uint8_t j = 0; j < 4; j++) { + if (array[i] & (0x1 << j)) { + topKey = (octave - 2) * 12 + i * 4 + j; + } + } + } + return topKey; +} + void setup() { #pragma region Pin Setup pinMode(RA0_PIN, OUTPUT); @@ -130,9 +137,10 @@ void loop() { if (millis() > next) { next += interval; - u8g2.clearBuffer(); // clear the internal memory - u8g2.setFont(u8g2_font_profont12_mf); // choose a suitable font - u8g2.drawStr(2, 10, "Hello World!"); // write something to the internal memory + u8g2.clearBuffer(); // clear the internal memory + u8g2.setFont(u8g2_font_profont12_mf); // choose a suitable font + u8g2.setCursor(2, 10); // set the cursor position + u8g2.print(stepSizes[getTopKey(keyArray)]); // Print the current frequency digitalToggle(LED_BUILTIN); u8g2.setCursor(2, 20); for (uint8_t i = 0; i < 7; i++) { From c0fb7678303200434e4ac828ea7188c8fa9ab543 Mon Sep 17 00:00:00 2001 From: Aadi Desai <21363892+supleed2@users.noreply.github.com> Date: Wed, 23 Mar 2022 17:52:33 +0000 Subject: [PATCH 3/7] Catch up to P1S5 --- platformio.ini | 3 +- src/main.cpp | 131 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 87 insertions(+), 47 deletions(-) diff --git a/platformio.ini b/platformio.ini index cd3edda..d545dc8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -13,5 +13,6 @@ platform = ststm32 board = nucleo_l432kc framework = arduino monitor_speed = 115200 -lib_deps = +lib_deps = olikraus/U8g2@^2.32.10 + stm32duino/STM32duino FreeRTOS@^10.3.1 diff --git a/src/main.cpp b/src/main.cpp index 3f3e97e..580eba1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,25 +1,26 @@ -// https://github.com/adamb314/ThreadHandler - #include +#include #include +#include +#include -volatile int32_t currentStepSize; +volatile std::atomic currentStepSize; +static std::atomic keyArray[7]; -#pragma region Config Values const uint32_t interval = 10; // Display update interval const uint8_t octave = 4; // Octave to start on const uint32_t samplingRate = 44100; // Sampling rate -const int32_t stepSizes[] = { - 6370029, 6748811, 7150116, 7575284, 8025734, 8502969, 9008582, - 9544260, 10111791, 10713070, 11350102, 12025014, 12740059, 13497622, - 14300233, 15150569, 16051469, 17005939, 18017164, 19088521, 20223583, - 21426140, 22700205, 24050029, 25480118, 26995245, 28600466, 30301138, - 32102938, 34011878, 36034329, 38177042, 40447167, 42852281, 45400410, - 48100059, 50960237, 53990491, 57200933, 60602277, 64205876, 68023756, - 72068659, 76354085, 80894335, 85704562, 90800821, 96200119, 101920475, - 107980982, 114401866, 121204555, 12841175, 136047513, 144137319, 152708170, - 161788670, 171409125, 181601642, 192400238}; // Step sizes for each note -#pragma endregion +typedef struct { + int32_t stepSize; + std::string note; +} Note; +const Note notes[] = { + {0, "None"}, {3185014, "C1"}, {3374405, "C1#"}, {3575058, "D1"}, {3787642, "D1#"}, {4012867, "E1"}, {4251484, "F1"}, {4504291, "F1#"}, {4772130, "G1"}, {5055895, "G1#"}, {5356535, "A1"}, {5675051, "A1#"}, {6012507, "B1"}, {6370029, "C2"}, {6748811, "C2#"}, {7150116, "D2"}, {7575284, "D2#"}, {8025734, "E2"}, {8502969, "F2"}, {9008582, "F2#"}, {9544260, "G2"}, {10111791, "G2#"}, {10713070, "A2"}, {11350102, "A2#"}, {12025014, "B2"}, {12740059, "C3"}, {13497622, "C3#"}, {14300233, "D3"}, {15150569, "D3#"}, {16051469, "E3"}, {17005939, "F3"}, {18017164, "F3#"}, {19088521, "G3"}, {20223583, "G3#"}, {21426140, "A3"}, {22700205, "A3#"}, {24050029, "B3"}, {25480118, "C4"}, {26995245, "C4#"}, {28600466, "D4"}, {30301138, "D4#"}, {32102938, "E4"}, {34011878, "F4"}, {36034329, "F4#"}, {38177042, "G4"}, {40447167, "G4#"}, {42852281, "A4"}, {45400410, "A4#"}, {48100059, "B4"}, {50960237, "C5"}, {53990491, "C5#"}, {57200933, "D5"}, {60602277, "D5#"}, {64205876, "E5"}, {68023756, "F5"}, {72068659, "F5#"}, {76354085, "G5"}, {80894335, "G5#"}, {85704562, "A5"}, {90800821, "A5#"}, {96200119, "B5"}, {101920475, "C6"}, {107980982, "C6#"}, {114401866, "D6"}, {121204555, "D6#"}, {128411753, "E6"}, {136047513, "F6"}, {144137319, "F6#"}, {152708170, "G6"}, {161788670, "G6#"}, {171409125, "A6"}, {181601642, "A6#"}, {192400238, "B6"}, {203840951, "C7"}, {215961965, "C7#"}, {228803732, "D7"}, {242409110, "D7#"}, {256823506, "E7"}, {272095026, "F7"}, {288274638, "F7#"}, {305416340, "G7"}, {323577341, "G7#"}, {342818251, "A7"}, {363203285, "A7#"}, {384800476, "B7"}}; +#define icon_width 10 +#define icon_height 10 +const unsigned char icon_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x01, 0x02, 0x01, 0xfe, 0x01, 0x00, 0x00}; #pragma region Pin Definitions // Row select and enable @@ -79,18 +80,57 @@ void setRow(const uint8_t rowIdx) { digitalWrite(REN_PIN, HIGH); } -uint16_t getTopKey(const uint8_t array[]) { +uint16_t getTopKey() { uint16_t topKey = 0; for (uint8_t i = 0; i < 3; i++) { for (uint8_t j = 0; j < 4; j++) { - if (array[i] & (0x1 << j)) { - topKey = (octave - 2) * 12 + i * 4 + j; + if (keyArray[i] & (0x1 << j)) { + topKey = (octave - 2) * 12 + i * 4 + j + 1; } } } return topKey; } +void sampleISR() { + static int32_t phaseAcc = 0; + phaseAcc += currentStepSize; + int32_t Vout = phaseAcc >> 24; + analogWrite(OUTR_PIN, Vout + 128); +} + +void scanKeysTask(void *pvParameters) { + const TickType_t xFrequency = 50 / portTICK_PERIOD_MS; + TickType_t xLastWakeTime = xTaskGetTickCount(); + while (1) { + vTaskDelayUntil(&xLastWakeTime, xFrequency); + for (uint8_t i = 0; i < 3; i++) { + setRow(i); + delayMicroseconds(3); + keyArray[i] = readCols(); + } + currentStepSize = notes[getTopKey()].stepSize; // Atomic Store + } +} + +void displayUpdateTask(void *pvParameters) { + const TickType_t xFrequency = 100 / portTICK_PERIOD_MS; + TickType_t xLastWakeTime = xTaskGetTickCount(); + while (1) { + vTaskDelayUntil(&xLastWakeTime, xFrequency); + u8g2.clearBuffer(); // clear the internal memory + u8g2.setFont(u8g2_font_profont12_mf); // choose a suitable font + u8g2.drawStr(2, 10, notes[getTopKey()].note.c_str()); // Print the current key + digitalToggle(LED_BUILTIN); + u8g2.setCursor(2, 20); + for (uint8_t i = 0; i < 7; i++) { + u8g2.print(keyArray[i], HEX); + } + u8g2.drawXBM(118, 0, 10, 10, icon_bits); + u8g2.sendBuffer(); // transfer internal memory to the display + } +} + void setup() { #pragma region Pin Setup pinMode(RA0_PIN, OUTPUT); @@ -119,33 +159,32 @@ void setup() { // Initialise UART Serial.begin(115200); Serial.println("Hello World"); + + TIM_TypeDef *Instance = TIM1; + HardwareTimer *sampleTimer = new HardwareTimer(Instance); + sampleTimer->setOverflow(samplingRate, HERTZ_FORMAT); + sampleTimer->attachInterrupt(sampleISR); + sampleTimer->resume(); + + TaskHandle_t scanKeysHandle = NULL; + TaskHandle_t displayUpdateHandle = NULL; + xTaskCreate( + scanKeysTask, // Function that implements the task + "scanKeys", // Text name for the task + 64, // Stack size in words, not bytes + NULL, // Parameter passed into the task + 2, // Task priority + &scanKeysHandle // Pointer to store the task handle + ); + xTaskCreate( + displayUpdateTask, // Function that implements the task + "displayUpdate", // Text name for the task + 256, // Stack size in words, not bytes + NULL, // Parameter passed into the task + 1, // Task priority + &displayUpdateHandle // Pointer to store the task handle + ); + vTaskStartScheduler(); } -void loop() { - static uint32_t next = millis(); - static uint8_t keyArray[7]; - for (uint8_t i = 0; i < 3; i++) { - setRow(i); - delayMicroseconds(3); - keyArray[i] = readCols(); - } - for (uint8_t i = 3; i < 7; i++) { - setRow(i); - delayMicroseconds(3); - keyArray[i] = readCols(); - } - - if (millis() > next) { - next += interval; - u8g2.clearBuffer(); // clear the internal memory - u8g2.setFont(u8g2_font_profont12_mf); // choose a suitable font - u8g2.setCursor(2, 10); // set the cursor position - u8g2.print(stepSizes[getTopKey(keyArray)]); // Print the current frequency - digitalToggle(LED_BUILTIN); - u8g2.setCursor(2, 20); - for (uint8_t i = 0; i < 7; i++) { - u8g2.print(keyArray[i], HEX); - } - u8g2.sendBuffer(); // transfer internal memory to the display - } -} \ No newline at end of file +void loop() {} \ No newline at end of file From d5f583cefa7602188e1c377a3af8dd7dfbb51b09 Mon Sep 17 00:00:00 2001 From: Aadi Desai <21363892+supleed2@users.noreply.github.com> Date: Wed, 23 Mar 2022 17:52:51 +0000 Subject: [PATCH 4/7] Add Note Calculation Doc --- docs/Note Step Calculation.xlsx | Bin 13131 -> 14698 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/Note Step Calculation.xlsx b/docs/Note Step Calculation.xlsx index b2b11f4ebc2c14e22bbd93065a92e8bdd546020d..c15c705e4dc5008a261c85069cfa8c3f5fdd6461 100644 GIT binary patch delta 8088 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 SNZy+jjAs&L#7-2xyZJwj{fW{5 delta 6510 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 A4gdfE From c51638ee4fd86273ccd71c7278bffb372526f1d8 Mon Sep 17 00:00:00 2001 From: Aadi Desai <21363892+supleed2@users.noreply.github.com> Date: Wed, 23 Mar 2022 18:23:26 +0000 Subject: [PATCH 5/7] Knob Driver to be fixed --- lib/knob/knob | 19 +++++++++++++++++++ lib/knob/knob.cpp | 48 +++++++++++++++++++++++++++++++++++++++++++++++ src/main.cpp | 9 +++++++-- 3 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 lib/knob/knob create mode 100644 lib/knob/knob.cpp diff --git a/lib/knob/knob b/lib/knob/knob new file mode 100644 index 0000000..9c035a1 --- /dev/null +++ b/lib/knob/knob @@ -0,0 +1,19 @@ +#ifndef KNOB_H +#define KNOB_H + +class Knob { + private: + int rotation; + int minimum, maximum; + bool A, B; + bool rotPlusOnePrev, rotMinOnePrev; + + public: + Knob(int minimum, int max); + + int getRotation(); + + void updateRotation(bool ANew, bool BNew); +}; + +#endif \ No newline at end of file diff --git a/lib/knob/knob.cpp b/lib/knob/knob.cpp new file mode 100644 index 0000000..25bf475 --- /dev/null +++ b/lib/knob/knob.cpp @@ -0,0 +1,48 @@ +#include + +Knob::Knob(int minimum, int maximum) { + Knob::minimum = minimum; + Knob::maximum = maximum; + Knob::A = false; + Knob::B = false; + Knob::rotPlusOnePrev = false; + Knob::rotMinOnePrev = false; + Knob::rotation = 0; +} + +int Knob::getRotation() { + return Knob::rotation; +}; + +void Knob::updateRotation(bool ANew, bool BNew) { + bool rotPlusOneNew = (!B && !A && !BNew && ANew) || + (!B && A && BNew && ANew) || + (B && !A && !BNew && !ANew) || + (B && A && BNew && !ANew); + + bool rotMinOneNew = (!B && !A && BNew && !ANew) || + (!B && A && !BNew && !ANew) || + (B && !A && BNew && ANew) || + (B && A && !BNew && ANew); + + bool impossibleState = (!B && !A && BNew && ANew) || + (!B && A && BNew && !ANew) || + (B && !A && !BNew && ANew) || + (B && A && !BNew && !ANew); + + if (rotPlusOneNew || (impossibleState && rotPlusOnePrev)) + rotation += 2; + if (rotMinOneNew || (impossibleState && rotMinOnePrev)) + rotation -= 2; + if (rotation < minimum) + rotation = minimum; + if (rotation > maximum) + rotation = maximum; + + A = ANew; + B = BNew; + if (!impossibleState) { + rotPlusOnePrev = rotPlusOneNew; + rotMinOnePrev = rotMinOneNew; + } +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 580eba1..b796a80 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include volatile std::atomic currentStepSize; @@ -48,6 +49,7 @@ const int HKOE_BIT = 6; #pragma endregion U8G2_SSD1305_128X32_NONAME_F_HW_I2C u8g2(U8G2_R0); // Display driver object +Knob K3 = Knob(0, 16); // Knob driver object // Function to set outputs using key matrix void setOutMuxBit(const uint8_t bitIdx, const bool value) { @@ -95,7 +97,7 @@ uint16_t getTopKey() { void sampleISR() { static int32_t phaseAcc = 0; phaseAcc += currentStepSize; - int32_t Vout = phaseAcc >> 24; + int32_t Vout = phaseAcc >> (32 - K3.getRotation() / 2); analogWrite(OUTR_PIN, Vout + 128); } @@ -104,12 +106,13 @@ void scanKeysTask(void *pvParameters) { TickType_t xLastWakeTime = xTaskGetTickCount(); while (1) { vTaskDelayUntil(&xLastWakeTime, xFrequency); - for (uint8_t i = 0; i < 3; i++) { + for (uint8_t i = 0; i < 7; i++) { setRow(i); delayMicroseconds(3); keyArray[i] = readCols(); } currentStepSize = notes[getTopKey()].stepSize; // Atomic Store + K3.updateRotation(keyArray[3] & 0x1, keyArray[3] & 0x2); } } @@ -127,6 +130,8 @@ void displayUpdateTask(void *pvParameters) { u8g2.print(keyArray[i], HEX); } u8g2.drawXBM(118, 0, 10, 10, icon_bits); + u8g2.setCursor(2, 30); + u8g2.print(K3.getRotation()); u8g2.sendBuffer(); // transfer internal memory to the display } } From e952f4ccb67cee356a58db9926ed6d28ebd19887 Mon Sep 17 00:00:00 2001 From: Aadi Desai <21363892+supleed2@users.noreply.github.com> Date: Thu, 24 Mar 2022 18:21:34 +0000 Subject: [PATCH 6/7] Partial Merge Knob Driver to be rewritten --- lib/ES_CAN/ES_CAN.cpp | 214 ------------------------------------------ lib/ES_CAN/ES_CAN.h | 24 ----- src/main.cpp | 73 ++++++++++---- 3 files changed, 55 insertions(+), 256 deletions(-) delete mode 100644 lib/ES_CAN/ES_CAN.cpp delete mode 100644 lib/ES_CAN/ES_CAN.h diff --git a/lib/ES_CAN/ES_CAN.cpp b/lib/ES_CAN/ES_CAN.cpp deleted file mode 100644 index 6061069..0000000 --- a/lib/ES_CAN/ES_CAN.cpp +++ /dev/null @@ -1,214 +0,0 @@ -#include -#include -#include -#include - -//Overwrite the weak default IRQ Handlers and callabcks -extern "C" void CAN1_RX0_IRQHandler(void); -extern "C" void CAN1_TX_IRQHandler(void); - -//Pointer to user ISRS -void (*CAN_RX_ISR)() = NULL; -void (*CAN_TX_ISR)() = NULL; - -//CAN handle struct with initialisation parameters -//Timing from http://www.bittiming.can-wiki.info/ with bit rate = 125kHz and clock frequency = 80MHz -CAN_HandleTypeDef CAN_Handle = { - CAN1, - { - 40, //Prescaler - CAN_MODE_NORMAL, //Normal/loopback/silent mode - CAN_SJW_2TQ, //SyncJumpWidth - CAN_BS1_13TQ, //TimeSeg1 - CAN_BS2_2TQ, //TimeSeg2 - DISABLE, //TimeTriggeredMode - DISABLE, //AutoBusOff - ENABLE, //AutoWakeUp - ENABLE, //AutoRetransmission - DISABLE, //ReceiveFifoLocked - ENABLE //TransmitFifoPriority - }, - HAL_CAN_STATE_RESET, //State - HAL_CAN_ERROR_NONE //Error Code -}; - - -//Initialise CAN dependencies: GPIO and clock -void HAL_CAN_MspInit(CAN_HandleTypeDef* CAN_Handle) { - - //Set up the pin initialisation - GPIO_InitTypeDef GPIO_InitCAN_TX = { - GPIO_PIN_12, //PA12 is CAN TX - GPIO_MODE_AF_PP, //Alternate function, push-pull driver - GPIO_NOPULL, //No pull-up - GPIO_SPEED_FREQ_MEDIUM, //Medium slew rate - GPIO_AF9_CAN1 //Alternate function is CAN - }; - - GPIO_InitTypeDef GPIO_InitCAN_RX = { - GPIO_PIN_11, //PA11 is CAN RX - GPIO_MODE_AF_PP, //Alternate function, push-pull driver - GPIO_PULLUP, //Pull-up enabled - GPIO_SPEED_FREQ_MEDIUM, //Medium slew rate - GPIO_AF9_CAN1 //Alternate function is CAN - }; - - //Enable the CAN and GPIO clocks - __HAL_RCC_CAN1_CLK_ENABLE(); //Enable the CAN interface clock - __HAL_RCC_GPIOA_CLK_ENABLE(); //Enable the clock for the CAN GPIOs - - //Initialise the pins - HAL_GPIO_Init(GPIOA, &GPIO_InitCAN_TX); //Configure CAN pin - HAL_GPIO_Init(GPIOA, &GPIO_InitCAN_RX); //Configure CAN pin -} - - -uint32_t CAN_Init(bool loopback=false) { - if (loopback) - CAN_Handle.Init.Mode = CAN_MODE_LOOPBACK; - return (uint32_t) HAL_CAN_Init(&CAN_Handle); -} - - -uint32_t setCANFilter(uint32_t filterID, uint32_t maskID, uint32_t filterBank) { - - //Set up the filter definition - CAN_FilterTypeDef filterInfo = { - (filterID << 5) & 0xffe0, //Filter ID - 0, //Filter ID LSBs = 0 - (maskID << 5) & 0xffe0, //Mask MSBs - 0, //Mask LSBs = 0 - 0, //FIFO selection - filterBank & 0xf, //Filter bank selection - CAN_FILTERMODE_IDMASK, //Mask mode - CAN_FILTERSCALE_32BIT, //32 bit IDs - CAN_FILTER_ENABLE, //Enable filter - 0 //uint32_t SlaveStartFilterBank - }; - - return (uint32_t) HAL_CAN_ConfigFilter(&CAN_Handle, &filterInfo); -} - - -uint32_t CAN_Start() { - return (uint32_t) HAL_CAN_Start(&CAN_Handle); -} - - -uint32_t CAN_TX(uint32_t ID, uint8_t data[8]) { - - //Set up the message header - CAN_TxHeaderTypeDef txHeader = { - ID & 0x7ff, //Standard ID - 0, //Ext ID = 0 - CAN_ID_STD, //Use Standard ID - CAN_RTR_DATA, //Data Frame - 8, //Send 8 bytes - DISABLE //No time triggered mode - }; - - //Wait for free mailbox - while (!HAL_CAN_GetTxMailboxesFreeLevel(&CAN_Handle)); - - //Start the transmission - return (uint32_t) HAL_CAN_AddTxMessage(&CAN_Handle, &txHeader, data, NULL); -} - - -uint32_t CAN_CheckRXLevel() { - return HAL_CAN_GetRxFifoFillLevel(&CAN_Handle, 0); -} - - -uint32_t CAN_RX(uint32_t &ID, uint8_t data[8]) { - CAN_RxHeaderTypeDef rxHeader; - - //Wait for message in FIFO - while (!HAL_CAN_GetRxFifoFillLevel(&CAN_Handle, 0)); - - //Get the message from the FIFO - uint32_t result = (uint32_t) HAL_CAN_GetRxMessage(&CAN_Handle, 0, &rxHeader, data); - - //Store the ID from the header - ID = rxHeader.StdId; - - return result; -} - - -uint32_t CAN_RegisterRX_ISR(void(& callback)()) { - //Store pointer to user ISR - CAN_RX_ISR = &callback; - - //Enable message received interrupt in HAL - uint32_t status = (uint32_t) HAL_CAN_ActivateNotification (&CAN_Handle, CAN_IT_RX_FIFO0_MSG_PENDING); - - //Switch on the interrupt - HAL_NVIC_SetPriority (CAN1_RX0_IRQn, 6, 0); - HAL_NVIC_EnableIRQ (CAN1_RX0_IRQn); - - return status; -} - - -uint32_t CAN_RegisterTX_ISR(void(& callback)()) { - //Store pointer to user ISR - CAN_TX_ISR = &callback; - - //Enable message received interrupt in HAL - uint32_t status = (uint32_t) HAL_CAN_ActivateNotification (&CAN_Handle, CAN_IT_TX_MAILBOX_EMPTY); - - //Switch on the interrupt - HAL_NVIC_SetPriority (CAN1_TX_IRQn, 6, 0); - HAL_NVIC_EnableIRQ (CAN1_TX_IRQn); - - return status; -} - - -void HAL_CAN_RxFifo0MsgPendingCallback (CAN_HandleTypeDef * hcan){ - - //Call the user ISR if it has been registered - if (CAN_RX_ISR) - CAN_RX_ISR(); -} - - -void HAL_CAN_TxMailbox0CompleteCallback (CAN_HandleTypeDef * hcan){ - - //Call the user ISR if it has been registered - if (CAN_TX_ISR) - CAN_TX_ISR(); -} - - -void HAL_CAN_TxMailbox1CompleteCallback (CAN_HandleTypeDef * hcan){ - - //Call the user ISR if it has been registered - if (CAN_TX_ISR) - CAN_TX_ISR(); -} - - -void HAL_CAN_TxMailbox2CompleteCallback (CAN_HandleTypeDef * hcan){ - - //Call the user ISR if it has been registered - if (CAN_TX_ISR) - CAN_TX_ISR(); -} - - -//This is the base ISR at the interrupt vector -void CAN1_RX0_IRQHandler(void){ - - //Use the HAL interrupt handler - HAL_CAN_IRQHandler(&CAN_Handle); -} - - -//This is the base ISR at the interrupt vector -void CAN1_TX_IRQHandler(void){ - - //Use the HAL interrupt handler - HAL_CAN_IRQHandler(&CAN_Handle); -} diff --git a/lib/ES_CAN/ES_CAN.h b/lib/ES_CAN/ES_CAN.h deleted file mode 100644 index add9c50..0000000 --- a/lib/ES_CAN/ES_CAN.h +++ /dev/null @@ -1,24 +0,0 @@ -//Initialise the CAN module -uint32_t CAN_Init(bool loopback=false); - -//Enable the CAN module -uint32_t CAN_Start(); - -//Set up a recevie filter -//Defaults to receive everything -uint32_t setCANFilter(uint32_t filterID=0, uint32_t maskID=0, uint32_t filterBank=0); - -//Send a message -uint32_t CAN_TX(uint32_t ID, uint8_t data[8]); - -//Get the number of received messages -uint32_t CAN_CheckRXLevel(); - -//Get a received message from the FIFO -uint32_t CAN_RX(uint32_t &ID, uint8_t data[8]); - -//Set up an interrupt on received messages -uint32_t CAN_RegisterRX_ISR(void(& callback)()); - -//Set up an interrupt on transmitted messages -uint32_t CAN_RegisterTX_ISR(void(& callback)()); \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index b796a80..5f7427e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,23 +5,58 @@ #include #include -volatile std::atomic currentStepSize; -static std::atomic keyArray[7]; - +#pragma region Globals(Config values, Variables, Objects, Types, etc.) +// Config values const uint32_t interval = 10; // Display update interval const uint8_t octave = 4; // Octave to start on const uint32_t samplingRate = 44100; // Sampling rate +// Variables +std::atomic currentStepSize; +std::atomic keyArray[7]; +// Objects +U8G2_SSD1305_128X32_NONAME_F_HW_I2C u8g2(U8G2_R0); // Display driver object +Knob K3 = Knob(0, 16); // Knob driver object +// Program Specific Structures typedef struct { int32_t stepSize; std::string note; } Note; const Note notes[] = { {0, "None"}, {3185014, "C1"}, {3374405, "C1#"}, {3575058, "D1"}, {3787642, "D1#"}, {4012867, "E1"}, {4251484, "F1"}, {4504291, "F1#"}, {4772130, "G1"}, {5055895, "G1#"}, {5356535, "A1"}, {5675051, "A1#"}, {6012507, "B1"}, {6370029, "C2"}, {6748811, "C2#"}, {7150116, "D2"}, {7575284, "D2#"}, {8025734, "E2"}, {8502969, "F2"}, {9008582, "F2#"}, {9544260, "G2"}, {10111791, "G2#"}, {10713070, "A2"}, {11350102, "A2#"}, {12025014, "B2"}, {12740059, "C3"}, {13497622, "C3#"}, {14300233, "D3"}, {15150569, "D3#"}, {16051469, "E3"}, {17005939, "F3"}, {18017164, "F3#"}, {19088521, "G3"}, {20223583, "G3#"}, {21426140, "A3"}, {22700205, "A3#"}, {24050029, "B3"}, {25480118, "C4"}, {26995245, "C4#"}, {28600466, "D4"}, {30301138, "D4#"}, {32102938, "E4"}, {34011878, "F4"}, {36034329, "F4#"}, {38177042, "G4"}, {40447167, "G4#"}, {42852281, "A4"}, {45400410, "A4#"}, {48100059, "B4"}, {50960237, "C5"}, {53990491, "C5#"}, {57200933, "D5"}, {60602277, "D5#"}, {64205876, "E5"}, {68023756, "F5"}, {72068659, "F5#"}, {76354085, "G5"}, {80894335, "G5#"}, {85704562, "A5"}, {90800821, "A5#"}, {96200119, "B5"}, {101920475, "C6"}, {107980982, "C6#"}, {114401866, "D6"}, {121204555, "D6#"}, {128411753, "E6"}, {136047513, "F6"}, {144137319, "F6#"}, {152708170, "G6"}, {161788670, "G6#"}, {171409125, "A6"}, {181601642, "A6#"}, {192400238, "B6"}, {203840951, "C7"}, {215961965, "C7#"}, {228803732, "D7"}, {242409110, "D7#"}, {256823506, "E7"}, {272095026, "F7"}, {288274638, "F7#"}, {305416340, "G7"}, {323577341, "G7#"}, {342818251, "A7"}, {363203285, "A7#"}, {384800476, "B7"}}; -#define icon_width 10 -#define icon_height 10 +enum waveform { + SQUARE = 0, + SAWTOOTH, + TRIANGLE, + SINE +}; +const unsigned char waveforms[4][18] = { + {0x7f, 0x10, 0x41, 0x10, 0x41, 0x10, 0x41, 0x10, 0x41, + 0x10, 0x41, 0x10, 0x41, 0x10, 0x41, 0x10, 0xc1, 0x1f}, // Square Wave + {0x70, 0x10, 0x58, 0x18, 0x48, 0x08, 0x4c, 0x0c, 0x44, + 0x04, 0x46, 0x06, 0x42, 0x02, 0x43, 0x03, 0xc1, 0x01}, // Sawtooth Wave + {0x08, 0x00, 0x1c, 0x00, 0x36, 0x00, 0x63, 0x00, 0xc1, + 0x00, 0x80, 0x11, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x04}, // Triangle Wave + {0x1c, 0x00, 0x36, 0x00, 0x22, 0x00, 0x63, 0x00, 0x41, + 0x10, 0xc0, 0x18, 0x80, 0x08, 0x80, 0x0d, 0x00, 0x07} // Sine Wave +}; +const unsigned char volumes[6][18] = { + {0x10, 0x02, 0x98, 0x04, 0x1c, 0x05, 0x5f, 0x09, 0x5f, + 0x09, 0x5f, 0x09, 0x1c, 0x05, 0x98, 0x04, 0x10, 0x02}, // volume max + {0x10, 0x00, 0x98, 0x00, 0x1c, 0x01, 0x5f, 0x01, 0x5f, + 0x01, 0x5f, 0x01, 0x1c, 0x01, 0x98, 0x00, 0x10, 0x00}, // volume mid higher + {0x10, 0x00, 0x18, 0x00, 0x1c, 0x01, 0x5f, 0x01, 0x5f, + 0x01, 0x5f, 0x01, 0x1c, 0x01, 0x18, 0x00, 0x10, 0x00}, // volume mid lower + {0x10, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x5f, 0x00, 0x5f, + 0x00, 0x5f, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x10, 0x00}, // volume low + {0x10, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x5f, + 0x00, 0x1f, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x10, 0x00}, // volume lowest + {0x10, 0x00, 0x18, 0x00, 0x5c, 0x04, 0x9f, 0x02, 0x1f, + 0x01, 0x9f, 0x02, 0x5c, 0x04, 0x18, 0x00, 0x10, 0x00} // mute +}; const unsigned char icon_bits[] = { 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x02, 0x01, 0xfe, 0x01, 0x00, 0x00}; +#pragma endregion #pragma region Pin Definitions // Row select and enable @@ -48,9 +83,6 @@ const int HKOW_BIT = 5; const int HKOE_BIT = 6; #pragma endregion -U8G2_SSD1305_128X32_NONAME_F_HW_I2C u8g2(U8G2_R0); // Display driver object -Knob K3 = Knob(0, 16); // Knob driver object - // Function to set outputs using key matrix void setOutMuxBit(const uint8_t bitIdx, const bool value) { digitalWrite(REN_PIN, LOW); @@ -73,7 +105,7 @@ uint8_t readCols() { return row; } -// Set current row +// Set multiplexer bits to select row void setRow(const uint8_t rowIdx) { digitalWrite(REN_PIN, LOW); digitalWrite(RA0_PIN, rowIdx & 0x01); @@ -82,6 +114,7 @@ void setRow(const uint8_t rowIdx) { digitalWrite(REN_PIN, HIGH); } +// Returns key value (as notes[] index) of highest currently pressed key uint16_t getTopKey() { uint16_t topKey = 0; for (uint8_t i = 0; i < 3; i++) { @@ -94,13 +127,15 @@ uint16_t getTopKey() { return topKey; } +// Interrupt driven routine to send waveform to DAC void sampleISR() { static int32_t phaseAcc = 0; phaseAcc += currentStepSize; - int32_t Vout = phaseAcc >> (32 - K3.getRotation() / 2); + int32_t Vout = phaseAcc >> (32 - K3.getRotation() / 2); // Volume range from (>> 32) to (>> 24), range of 8 analogWrite(OUTR_PIN, Vout + 128); } +// Task to update keyArray values at a higher priority void scanKeysTask(void *pvParameters) { const TickType_t xFrequency = 50 / portTICK_PERIOD_MS; TickType_t xLastWakeTime = xTaskGetTickCount(); @@ -116,14 +151,16 @@ void scanKeysTask(void *pvParameters) { } } +// Task containing display graphics and update code void displayUpdateTask(void *pvParameters) { const TickType_t xFrequency = 100 / portTICK_PERIOD_MS; TickType_t xLastWakeTime = xTaskGetTickCount(); while (1) { vTaskDelayUntil(&xLastWakeTime, xFrequency); - u8g2.clearBuffer(); // clear the internal memory - u8g2.setFont(u8g2_font_profont12_mf); // choose a suitable font - u8g2.drawStr(2, 10, notes[getTopKey()].note.c_str()); // Print the current key + u8g2.clearBuffer(); // clear the internal memory + u8g2.setFont(u8g2_font_profont12_mf); // choose a suitable font + uint16_t key = getTopKey(); + u8g2.drawStr(2, 10, notes[key].note.c_str()); // Print the current key digitalToggle(LED_BUILTIN); u8g2.setCursor(2, 20); for (uint8_t i = 0; i < 7; i++) { @@ -160,17 +197,16 @@ void setup() { u8g2.begin(); setOutMuxBit(DEN_BIT, HIGH); // Enable display power supply #pragma endregion - - // Initialise UART +#pragma region UART Setup Serial.begin(115200); Serial.println("Hello World"); - +#pragma endregion +#pragma region Task Scheduler Setup TIM_TypeDef *Instance = TIM1; HardwareTimer *sampleTimer = new HardwareTimer(Instance); sampleTimer->setOverflow(samplingRate, HERTZ_FORMAT); sampleTimer->attachInterrupt(sampleISR); sampleTimer->resume(); - TaskHandle_t scanKeysHandle = NULL; TaskHandle_t displayUpdateHandle = NULL; xTaskCreate( @@ -190,6 +226,7 @@ void setup() { &displayUpdateHandle // Pointer to store the task handle ); vTaskStartScheduler(); +#pragma endregion } -void loop() {} \ No newline at end of file +void loop() {} // No code in loop, as everything is done in the tasks From 5a6c49ca89671e3f28530606412be82d0d847f16 Mon Sep 17 00:00:00 2001 From: Aadi Desai <21363892+supleed2@users.noreply.github.com> Date: Thu, 24 Mar 2022 21:05:37 +0000 Subject: [PATCH 7/7] Merge to main --- lib/es_can/es_can | 31 +++++++ lib/es_can/es_can.cpp | 202 ++++++++++++++++++++++++++++++++++++++++++ src/main.cpp | 72 +++++++++++++-- 3 files changed, 298 insertions(+), 7 deletions(-) create mode 100644 lib/es_can/es_can create mode 100644 lib/es_can/es_can.cpp diff --git a/lib/es_can/es_can b/lib/es_can/es_can new file mode 100644 index 0000000..8b49002 --- /dev/null +++ b/lib/es_can/es_can @@ -0,0 +1,31 @@ +#include + +#ifndef ES_CAN_H +#define ES_CAN_H + +// Initialise the CAN module +uint32_t CAN_Init(bool loopback = false); + +// Enable the CAN module +uint32_t CAN_Start(); + +// Set up a recevie filter +// Defaults to receive everything +uint32_t setCANFilter(uint32_t filterID = 0, uint32_t maskID = 0, uint32_t filterBank = 0); + +// Send a message +uint32_t CAN_TX(uint32_t ID, uint8_t data[8]); + +// Get the number of received messages +uint32_t CAN_CheckRXLevel(); + +// Get a received message from the FIFO +uint32_t CAN_RX(uint32_t &ID, uint8_t data[8]); + +// Set up an interrupt on received messages +uint32_t CAN_RegisterRX_ISR(void (&callback)()); + +// Set up an interrupt on transmitted messages +uint32_t CAN_RegisterTX_ISR(void (&callback)()); + +#endif \ No newline at end of file diff --git a/lib/es_can/es_can.cpp b/lib/es_can/es_can.cpp new file mode 100644 index 0000000..677d27d --- /dev/null +++ b/lib/es_can/es_can.cpp @@ -0,0 +1,202 @@ +#include +#include +#include +#include +#include + +// Overwrite the weak default IRQ Handlers and callabcks +extern "C" void CAN1_RX0_IRQHandler(void); +extern "C" void CAN1_TX_IRQHandler(void); + +// Pointer to user ISRS +void (*CAN_RX_ISR)() = NULL; +void (*CAN_TX_ISR)() = NULL; + +// CAN handle struct with initialisation parameters +// Timing from http://www.bittiming.can-wiki.info/ with bit rate = 125kHz and clock frequency = 80MHz +CAN_HandleTypeDef CAN_Handle = { + CAN1, + { + 40, // Prescaler + CAN_MODE_NORMAL, // Normal/loopback/silent mode + CAN_SJW_2TQ, // SyncJumpWidth + CAN_BS1_13TQ, // TimeSeg1 + CAN_BS2_2TQ, // TimeSeg2 + DISABLE, // TimeTriggeredMode + DISABLE, // AutoBusOff + ENABLE, // AutoWakeUp + ENABLE, // AutoRetransmission + DISABLE, // ReceiveFifoLocked + ENABLE // TransmitFifoPriority + }, + HAL_CAN_STATE_RESET, // State + HAL_CAN_ERROR_NONE // Error Code +}; + +// Initialise CAN dependencies: GPIO and clock +void HAL_CAN_MspInit(CAN_HandleTypeDef *CAN_Handle) { + + // Set up the pin initialisation + GPIO_InitTypeDef GPIO_InitCAN_TX = { + GPIO_PIN_12, // PA12 is CAN TX + GPIO_MODE_AF_PP, // Alternate function, push-pull driver + GPIO_NOPULL, // No pull-up + GPIO_SPEED_FREQ_MEDIUM, // Medium slew rate + GPIO_AF9_CAN1 // Alternate function is CAN + }; + + GPIO_InitTypeDef GPIO_InitCAN_RX = { + GPIO_PIN_11, // PA11 is CAN RX + GPIO_MODE_AF_PP, // Alternate function, push-pull driver + GPIO_PULLUP, // Pull-up enabled + GPIO_SPEED_FREQ_MEDIUM, // Medium slew rate + GPIO_AF9_CAN1 // Alternate function is CAN + }; + + // Enable the CAN and GPIO clocks + __HAL_RCC_CAN1_CLK_ENABLE(); // Enable the CAN interface clock + __HAL_RCC_GPIOA_CLK_ENABLE(); // Enable the clock for the CAN GPIOs + + // Initialise the pins + HAL_GPIO_Init(GPIOA, &GPIO_InitCAN_TX); // Configure CAN pin + HAL_GPIO_Init(GPIOA, &GPIO_InitCAN_RX); // Configure CAN pin +} + +uint32_t CAN_Init(bool loopback) { + if (loopback) + CAN_Handle.Init.Mode = CAN_MODE_LOOPBACK; + return (uint32_t)HAL_CAN_Init(&CAN_Handle); +} + +uint32_t setCANFilter(uint32_t filterID, uint32_t maskID, uint32_t filterBank) { + + // Set up the filter definition + CAN_FilterTypeDef filterInfo = { + (filterID << 5) & 0xffe0, // Filter ID + 0, // Filter ID LSBs = 0 + (maskID << 5) & 0xffe0, // Mask MSBs + 0, // Mask LSBs = 0 + 0, // FIFO selection + filterBank & 0xf, // Filter bank selection + CAN_FILTERMODE_IDMASK, // Mask mode + CAN_FILTERSCALE_32BIT, // 32 bit IDs + CAN_FILTER_ENABLE, // Enable filter + 0 // uint32_t SlaveStartFilterBank + }; + + return (uint32_t)HAL_CAN_ConfigFilter(&CAN_Handle, &filterInfo); +} + +uint32_t CAN_Start() { + return (uint32_t)HAL_CAN_Start(&CAN_Handle); +} + +uint32_t CAN_TX(uint32_t ID, uint8_t data[8]) { + + // Set up the message header + CAN_TxHeaderTypeDef txHeader = { + ID & 0x7ff, // Standard ID + 0, // Ext ID = 0 + CAN_ID_STD, // Use Standard ID + CAN_RTR_DATA, // Data Frame + 8, // Send 8 bytes + DISABLE // No time triggered mode + }; + + // Wait for free mailbox + while (!HAL_CAN_GetTxMailboxesFreeLevel(&CAN_Handle)) + ; + + // Start the transmission + return (uint32_t)HAL_CAN_AddTxMessage(&CAN_Handle, &txHeader, data, NULL); +} + +uint32_t CAN_CheckRXLevel() { + return HAL_CAN_GetRxFifoFillLevel(&CAN_Handle, 0); +} + +uint32_t CAN_RX(uint32_t &ID, uint8_t data[8]) { + CAN_RxHeaderTypeDef rxHeader; + + // Wait for message in FIFO + while (!HAL_CAN_GetRxFifoFillLevel(&CAN_Handle, 0)) + ; + + // Get the message from the FIFO + uint32_t result = (uint32_t)HAL_CAN_GetRxMessage(&CAN_Handle, 0, &rxHeader, data); + + // Store the ID from the header + ID = rxHeader.StdId; + + return result; +} + +uint32_t CAN_RegisterRX_ISR(void (&callback)()) { + // Store pointer to user ISR + CAN_RX_ISR = &callback; + + // Enable message received interrupt in HAL + uint32_t status = (uint32_t)HAL_CAN_ActivateNotification(&CAN_Handle, CAN_IT_RX_FIFO0_MSG_PENDING); + + // Switch on the interrupt + HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 6, 0); + HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn); + + return status; +} + +uint32_t CAN_RegisterTX_ISR(void (&callback)()) { + // Store pointer to user ISR + CAN_TX_ISR = &callback; + + // Enable message received interrupt in HAL + uint32_t status = (uint32_t)HAL_CAN_ActivateNotification(&CAN_Handle, CAN_IT_TX_MAILBOX_EMPTY); + + // Switch on the interrupt + HAL_NVIC_SetPriority(CAN1_TX_IRQn, 6, 0); + HAL_NVIC_EnableIRQ(CAN1_TX_IRQn); + + return status; +} + +void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { + + // Call the user ISR if it has been registered + if (CAN_RX_ISR) + CAN_RX_ISR(); +} + +void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) { + + // Call the user ISR if it has been registered + if (CAN_TX_ISR) + CAN_TX_ISR(); +} + +void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) { + + // Call the user ISR if it has been registered + if (CAN_TX_ISR) + CAN_TX_ISR(); +} + +void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) { + + // Call the user ISR if it has been registered + if (CAN_TX_ISR) + CAN_TX_ISR(); +} + +// This is the base ISR at the interrupt vector +void CAN1_RX0_IRQHandler(void) { + + // Use the HAL interrupt handler + HAL_CAN_IRQHandler(&CAN_Handle); +} + +// This is the base ISR at the interrupt vector +void CAN1_TX_IRQHandler(void) { + + // Use the HAL interrupt handler + HAL_CAN_IRQHandler(&CAN_Handle); +} diff --git a/src/main.cpp b/src/main.cpp index 5f7427e..f929162 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -10,9 +11,12 @@ const uint32_t interval = 10; // Display update interval const uint8_t octave = 4; // Octave to start on const uint32_t samplingRate = 44100; // Sampling rate +const uint32_t canID = 0x123; // Variables std::atomic currentStepSize; std::atomic keyArray[7]; +QueueHandle_t msgInQ; +uint8_t RX_Message[8] = {0}; // Objects U8G2_SSD1305_128X32_NONAME_F_HW_I2C u8g2(U8G2_R0); // Display driver object Knob K3 = Knob(0, 16); // Knob driver object @@ -120,7 +124,7 @@ uint16_t getTopKey() { for (uint8_t i = 0; i < 3; i++) { for (uint8_t j = 0; j < 4; j++) { if (keyArray[i] & (0x1 << j)) { - topKey = (octave - 2) * 12 + i * 4 + j + 1; + topKey = (octave - 1) * 12 + i * 4 + j + 1; } } } @@ -135,6 +139,36 @@ void sampleISR() { analogWrite(OUTR_PIN, Vout + 128); } +void CAN_RX_ISR() { + uint8_t ISR_RX_Message[8]; + uint32_t ISR_rxID; + CAN_RX(ISR_rxID, ISR_RX_Message); + xQueueSendFromISR(msgInQ, ISR_RX_Message, nullptr); +} + +void decodeTask(void *pvParameters) { + while (1) { + xQueueReceive(msgInQ, RX_Message, portMAX_DELAY); + if (RX_Message[0] == 0x50) { // Pressed + currentStepSize = notes[(RX_Message[1] - 1) * 12 + RX_Message[2]].stepSize; + } else { // Released + currentStepSize = 0; + } + } +} + +void keyChangedSendTXMessage(uint8_t octave, uint8_t key, bool pressed) { + uint8_t TX_Message[8] = {0}; + if (pressed) { + TX_Message[0] = 0x50; // "P" + } else { + TX_Message[0] = 0x52; // "R" + } + TX_Message[1] = octave; + TX_Message[2] = key; + CAN_TX(canID, TX_Message); +} + // Task to update keyArray values at a higher priority void scanKeysTask(void *pvParameters) { const TickType_t xFrequency = 50 / portTICK_PERIOD_MS; @@ -143,8 +177,19 @@ void scanKeysTask(void *pvParameters) { vTaskDelayUntil(&xLastWakeTime, xFrequency); for (uint8_t i = 0; i < 7; i++) { setRow(i); + uint8_t oldRow = keyArray[i]; delayMicroseconds(3); - keyArray[i] = readCols(); + uint8_t newRow = readCols(); + if (oldRow == newRow) { + continue; + } else { + keyArray[i] = newRow; + for (uint8_t j = 0; j < 4; j++) { + if ((oldRow & (0x1 << j)) ^ (newRow & (0x1 << j))) { + keyChangedSendTXMessage(octave, i * 4 + j + 1, newRow & (0x1 << j)); + } + } + } } currentStepSize = notes[getTopKey()].stepSize; // Atomic Store K3.updateRotation(keyArray[3] & 0x1, keyArray[3] & 0x2); @@ -157,6 +202,8 @@ void displayUpdateTask(void *pvParameters) { TickType_t xLastWakeTime = xTaskGetTickCount(); while (1) { vTaskDelayUntil(&xLastWakeTime, xFrequency); + uint32_t rxID; + u8g2.clearBuffer(); // clear the internal memory u8g2.setFont(u8g2_font_profont12_mf); // choose a suitable font uint16_t key = getTopKey(); @@ -166,7 +213,11 @@ void displayUpdateTask(void *pvParameters) { for (uint8_t i = 0; i < 7; i++) { u8g2.print(keyArray[i], HEX); } - u8g2.drawXBM(118, 0, 10, 10, icon_bits); + // u8g2.drawXBM(118, 0, 10, 10, icon_bits); + u8g2.setCursor(100, 10); + u8g2.print((char)RX_Message[0]); + u8g2.print(RX_Message[1]); + u8g2.print(RX_Message[2], HEX); u8g2.setCursor(2, 30); u8g2.print(K3.getRotation()); u8g2.sendBuffer(); // transfer internal memory to the display @@ -201,19 +252,26 @@ void setup() { Serial.begin(115200); Serial.println("Hello World"); #pragma endregion +#pragma region CAN Setup + msgInQ = xQueueCreate(36, 8); + CAN_Init(true); + setCANFilter(0x123, 0x7ff); + CAN_RegisterRX_ISR(CAN_RX_ISR); + CAN_Start(); +#pragma endregion #pragma region Task Scheduler Setup TIM_TypeDef *Instance = TIM1; HardwareTimer *sampleTimer = new HardwareTimer(Instance); sampleTimer->setOverflow(samplingRate, HERTZ_FORMAT); sampleTimer->attachInterrupt(sampleISR); sampleTimer->resume(); - TaskHandle_t scanKeysHandle = NULL; - TaskHandle_t displayUpdateHandle = NULL; + TaskHandle_t scanKeysHandle = nullptr; + TaskHandle_t displayUpdateHandle = nullptr; xTaskCreate( scanKeysTask, // Function that implements the task "scanKeys", // Text name for the task 64, // Stack size in words, not bytes - NULL, // Parameter passed into the task + nullptr, // Parameter passed into the task 2, // Task priority &scanKeysHandle // Pointer to store the task handle ); @@ -221,7 +279,7 @@ void setup() { displayUpdateTask, // Function that implements the task "displayUpdate", // Text name for the task 256, // Stack size in words, not bytes - NULL, // Parameter passed into the task + nullptr, // Parameter passed into the task 1, // Task priority &displayUpdateHandle // Pointer to store the task handle );