mirror of
https://github.com/supleed2/ELEC60013-ES-CW2.git
synced 2024-12-22 21:55:50 +00:00
Core features possibly done
This commit is contained in:
parent
a9c40e69f0
commit
3c8c3def94
|
@ -19,6 +19,7 @@ class Knob {
|
||||||
int getRotation();
|
int getRotation();
|
||||||
|
|
||||||
void updateRotation(bool ANew, bool BNew);
|
void updateRotation(bool ANew, bool BNew);
|
||||||
|
void setRotation(int newRotation);
|
||||||
void changeLimitsVolume(int newMinimum, int newMaximum);
|
void changeLimitsVolume(int newMinimum, int newMaximum);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,11 @@ int Knob::getRotation() {
|
||||||
return Knob::rotation;
|
return Knob::rotation;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void Knob::setRotation(int newRotation) {
|
||||||
|
rotation = newRotation;
|
||||||
|
rotationInternal = newRotation;
|
||||||
|
};
|
||||||
|
|
||||||
void Knob::updateRotation(bool ANew, bool BNew) {
|
void Knob::updateRotation(bool ANew, bool BNew) {
|
||||||
if (A == ANew && B == BNew)
|
if (A == ANew && B == BNew)
|
||||||
return; // No change, do not update values
|
return; // No change, do not update values
|
||||||
|
@ -79,7 +84,8 @@ void Knob::changeLimitsVolume(int newMinimum, int newMaximum) {
|
||||||
rotation = rotation << 1;
|
rotation = rotation << 1;
|
||||||
} else if (newMaximum < maximum) {
|
} else if (newMaximum < maximum) {
|
||||||
rotation = rotation >> 1;
|
rotation = rotation >> 1;
|
||||||
}else{}
|
} else {
|
||||||
|
}
|
||||||
minimum = newMinimum;
|
minimum = newMinimum;
|
||||||
maximum = newMaximum;
|
maximum = newMaximum;
|
||||||
};
|
};
|
30
src/main.cpp
30
src/main.cpp
|
@ -182,6 +182,7 @@ void CAN_RX_ISR() {
|
||||||
uint8_t ISR_RX_Message[8];
|
uint8_t ISR_RX_Message[8];
|
||||||
uint32_t ISR_rxID;
|
uint32_t ISR_rxID;
|
||||||
CAN_RX(ISR_rxID, ISR_RX_Message);
|
CAN_RX(ISR_rxID, ISR_RX_Message);
|
||||||
|
if (isMainSynth)
|
||||||
xQueueSendFromISR(msgInQ, ISR_RX_Message, nullptr);
|
xQueueSendFromISR(msgInQ, ISR_RX_Message, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,12 +194,15 @@ void decodeTask(void *pvParameters) {
|
||||||
activeNotes[(RX_Message[1] - 1) * 12 + RX_Message[2]] = true;
|
activeNotes[(RX_Message[1] - 1) * 12 + RX_Message[2]] = true;
|
||||||
latestKey = (RX_Message[1] - 1) * 12 + RX_Message[2];
|
latestKey = (RX_Message[1] - 1) * 12 + RX_Message[2];
|
||||||
currentStepSize = stepSizes[latestKey];
|
currentStepSize = stepSizes[latestKey];
|
||||||
} else { // Released
|
} else if (RX_Message[0] == 0x52) { // Released
|
||||||
activeNotes[(RX_Message[1] - 1) * 12 + RX_Message[2]] = false;
|
activeNotes[(RX_Message[1] - 1) * 12 + RX_Message[2]] = false;
|
||||||
if (latestKey == (RX_Message[1] - 1) * 12 + RX_Message[2]) {
|
if (latestKey == (RX_Message[1] - 1) * 12 + RX_Message[2]) {
|
||||||
latestKey = 0;
|
latestKey = 0;
|
||||||
currentStepSize = stepSizes[latestKey]; // Atomic Store
|
currentStepSize = stepSizes[latestKey]; // Atomic Store
|
||||||
}
|
}
|
||||||
|
} else if (RX_Message[0] == 0x4D) { // Main Synth Announce
|
||||||
|
isMainSynth = false;
|
||||||
|
K2.setRotation(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -213,6 +217,17 @@ void keyChangedSendTXMessage(uint8_t octave, uint8_t key, bool pressed) {
|
||||||
}
|
}
|
||||||
TX_Message[1] = octave;
|
TX_Message[1] = octave;
|
||||||
TX_Message[2] = key;
|
TX_Message[2] = key;
|
||||||
|
if (isMainSynth) {
|
||||||
|
xQueueSend(msgInQ, TX_Message, 0);
|
||||||
|
} else {
|
||||||
|
CAN_TX(canID, TX_Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void announceMainSynth() {
|
||||||
|
uint8_t TX_Message[8] = {0};
|
||||||
|
TX_Message[0] = 0x4D; // "M"
|
||||||
CAN_TX(canID, TX_Message);
|
CAN_TX(canID, TX_Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,6 +255,9 @@ void scanKeysTask(void *pvParameters) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (keyArray[5] & 0x1 && isMainSynth) {
|
||||||
|
announceMainSynth();
|
||||||
|
}
|
||||||
if (volumeFiner) {
|
if (volumeFiner) {
|
||||||
K3.changeLimitsVolume(0, 10);
|
K3.changeLimitsVolume(0, 10);
|
||||||
} else {
|
} else {
|
||||||
|
@ -294,12 +312,18 @@ void displayUpdateTask(void *pvParameters) {
|
||||||
|
|
||||||
// Print volume indicator above knob 3
|
// Print volume indicator above knob 3
|
||||||
if (!volumeFiner) {
|
if (!volumeFiner) {
|
||||||
u8g2.drawXBM(116, 22, 13, 9, volumes[volume]);
|
u8g2.drawXBM(112, 22, 13, 9, volumes[volume]);
|
||||||
} else {
|
} else {
|
||||||
u8g2.setCursor(117, 30);
|
u8g2.setCursor(117, 30);
|
||||||
u8g2.print(volume);
|
u8g2.print(volume);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isMainSynth) {
|
||||||
|
u8g2.drawHLine(1, 6, 26);
|
||||||
|
u8g2.drawHLine(36, 26, 18);
|
||||||
|
u8g2.drawHLine(110, 26, 16);
|
||||||
|
}
|
||||||
|
|
||||||
u8g2.sendBuffer(); // transfer internal memory to the display
|
u8g2.sendBuffer(); // transfer internal memory to the display
|
||||||
digitalToggle(LED_BUILTIN); // Toggle LED to show display update rate
|
digitalToggle(LED_BUILTIN); // Toggle LED to show display update rate
|
||||||
}
|
}
|
||||||
|
@ -340,7 +364,7 @@ void setup() {
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
#pragma region CAN Setup
|
#pragma region CAN Setup
|
||||||
msgInQ = xQueueCreate(36, 8);
|
msgInQ = xQueueCreate(36, 8);
|
||||||
CAN_Init(true);
|
CAN_Init(false);
|
||||||
setCANFilter(0x123, 0x7ff);
|
setCANFilter(0x123, 0x7ff);
|
||||||
CAN_RegisterRX_ISR(CAN_RX_ISR);
|
CAN_RegisterRX_ISR(CAN_RX_ISR);
|
||||||
CAN_Start();
|
CAN_Start();
|
||||||
|
|
Loading…
Reference in a new issue