More work on serial communication
Arduino side is nearly working
This commit is contained in:
parent
fa8e3f17cc
commit
d25ca36444
@ -12,9 +12,10 @@ Encoder encoder(3, 2);
|
|||||||
|
|
||||||
// General vars
|
// General vars
|
||||||
unsigned long time;
|
unsigned long time;
|
||||||
int connected = 0;
|
boolean connected = false;
|
||||||
int editing = 0;
|
boolean dataReady = false;
|
||||||
int blink = 0;
|
boolean editing = false;
|
||||||
|
boolean blink = false;
|
||||||
|
|
||||||
// Encoder related vars
|
// Encoder related vars
|
||||||
long position = 0;
|
long position = 0;
|
||||||
@ -25,14 +26,12 @@ char receivedChars[numChars];
|
|||||||
char tempChars[numChars];
|
char tempChars[numChars];
|
||||||
|
|
||||||
char command[numChars] = {0};
|
char command[numChars] = {0};
|
||||||
char data[numChars] = {0};
|
|
||||||
int intData = 0;
|
|
||||||
|
|
||||||
boolean newData = false;
|
boolean newData = false;
|
||||||
|
|
||||||
|
|
||||||
// Set backlight
|
// Set backlight
|
||||||
int light = 0;
|
boolean light = 0;
|
||||||
int timeout = 10000;
|
int timeout = 10000;
|
||||||
|
|
||||||
void toggleBacklight(int value = 128) {
|
void toggleBacklight(int value = 128) {
|
||||||
@ -49,16 +48,16 @@ void toggleBacklight(int value = 128) {
|
|||||||
int programLenght;
|
int programLenght;
|
||||||
int currentProgram = 0;
|
int currentProgram = 0;
|
||||||
char programName[numChars] = {0};
|
char programName[numChars] = {0};
|
||||||
int menuUpdate = 1;
|
boolean menuUpdate = true;
|
||||||
float volume;
|
float volume = -1;
|
||||||
|
|
||||||
// Draw screen
|
// Draw screen
|
||||||
void drawMenu(char name, float percentage) {
|
void drawMenu() {
|
||||||
display.clearDisplay();
|
display.clearDisplay();
|
||||||
display.setFont(&Picopixel);
|
display.setFont(&Picopixel);
|
||||||
|
|
||||||
// Check for connection
|
// Check for connection
|
||||||
if (connected == 1)
|
if (connected && dataReady)
|
||||||
{
|
{
|
||||||
// Draw top bar
|
// Draw top bar
|
||||||
display.setCursor(0, 4);
|
display.setCursor(0, 4);
|
||||||
@ -72,34 +71,41 @@ void drawMenu(char name, float percentage) {
|
|||||||
display.setFont(NULL);
|
display.setFont(NULL);
|
||||||
|
|
||||||
// Check for connection
|
// Check for connection
|
||||||
if (connected == 1) {
|
if (connected && dataReady) {
|
||||||
// Program name
|
// Program name
|
||||||
drawName(name);
|
drawName();
|
||||||
|
|
||||||
// Volume Bar
|
// Volume Bar
|
||||||
drawBar(percentage);
|
drawBar();
|
||||||
} else {
|
} else {
|
||||||
// Blink connection message if not connected
|
// Blink connection message if not connected
|
||||||
if (time % 500 == 0)
|
if (time % 500 == 0)
|
||||||
{
|
{
|
||||||
blink = (blink == 0) ? 1 : 0;
|
blink = (!blink) ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (blink == 0)
|
if (!blink)
|
||||||
{
|
{
|
||||||
display.setCursor(9, 10);
|
display.setCursor(9, 10);
|
||||||
display.print("Waiting for");
|
display.print("Waiting for");
|
||||||
display.setCursor(12, 18);
|
if (!connected)
|
||||||
display.print("Connection");
|
{
|
||||||
|
display.setCursor(12, 18);
|
||||||
|
display.print("Connection");
|
||||||
|
} else if (!dataReady)
|
||||||
|
{
|
||||||
|
display.setCursor(30, 18);
|
||||||
|
display.print("Data");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bottom Bar
|
// Bottom Bar
|
||||||
display.drawLine(0, 38, 84, 38, BLACK);
|
display.drawLine(0, 38, 84, 38, BLACK);
|
||||||
if (connected == 1)
|
if (connected && dataReady)
|
||||||
{
|
{
|
||||||
display.setCursor(0, 40);
|
display.setCursor(0, 40);
|
||||||
if (editing == 1)
|
if (editing)
|
||||||
{
|
{
|
||||||
display.print(" - OK + ");
|
display.print(" - OK + ");
|
||||||
} else {
|
} else {
|
||||||
@ -114,30 +120,30 @@ void drawMenu(char name, float percentage) {
|
|||||||
const int pos[2] = { 4, 26 };
|
const int pos[2] = { 4, 26 };
|
||||||
|
|
||||||
// Draw volume bar and text
|
// Draw volume bar and text
|
||||||
void drawBar(float percentage) {
|
void drawBar() {
|
||||||
// Set fonts and size
|
// Set fonts and size
|
||||||
display.setFont(&Picopixel);
|
display.setFont(&Picopixel);
|
||||||
display.setCursor(4, pos[1] - 2);
|
display.setCursor(4, pos[1] - 2);
|
||||||
display.print("Volume:");
|
display.print("Volume:");
|
||||||
|
|
||||||
// Blink percentage if editing
|
// Blink percentage if editing
|
||||||
if (editing == 1 && time % 500 == 0)
|
if (editing && time % 500 == 0)
|
||||||
{
|
{
|
||||||
blink = (blink == 0) ? 1 : 0;
|
blink = (!blink) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Center percentage
|
// Center percentage
|
||||||
if (percentage == 0) {
|
if (volume == 0) {
|
||||||
display.setCursor(39, pos[1] - 2);
|
display.setCursor(39, pos[1] - 2);
|
||||||
} else if (percentage == 100) {
|
} else if (volume == 100) {
|
||||||
display.setCursor(36, pos[1] - 2);
|
display.setCursor(36, pos[1] - 2);
|
||||||
} else {
|
} else {
|
||||||
display.setCursor(37, pos[1] - 2);
|
display.setCursor(37, pos[1] - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (blink == 0)
|
if (!blink)
|
||||||
{
|
{
|
||||||
display.print((String)round(percentage) + "%");
|
display.print((String)round(volume) + "%");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw volume bar
|
// Draw volume bar
|
||||||
@ -148,14 +154,22 @@ void drawBar(float percentage) {
|
|||||||
display.drawPixel(pos[0] + (76 / 4) * 3 - 1, pos[1] + 8, BLACK);
|
display.drawPixel(pos[0] + (76 / 4) * 3 - 1, pos[1] + 8, BLACK);
|
||||||
display.drawLine(pos[0] + 75, pos[1] + 8, pos[0] + 75, pos[1] + 9, BLACK);
|
display.drawLine(pos[0] + 75, pos[1] + 8, pos[0] + 75, pos[1] + 9, BLACK);
|
||||||
|
|
||||||
display.fillRect(pos[0], pos[1], round(percentage / 100 * 76), 8, BLACK);
|
display.fillRect(pos[0], pos[1], round(volume / 100 * 76), 8, BLACK);
|
||||||
display.setFont(NULL);
|
display.setFont(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw program name in the middle of the display or scroll it
|
// Draw program name in the middle of the display or scroll it
|
||||||
// TODO: Fix char lenght
|
// TODO: Fix char lenght
|
||||||
void drawName(char name) {
|
void drawName() {
|
||||||
int width = name.length() * 6;
|
int width = 0;
|
||||||
|
for (size_t i = 0; i < sizeof(programName); i++)
|
||||||
|
{
|
||||||
|
if (programName[i] != NULL)
|
||||||
|
{
|
||||||
|
width = width + 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (width > 84)
|
if (width > 84)
|
||||||
{
|
{
|
||||||
// TODO: Make the text scroll if the name is too long
|
// TODO: Make the text scroll if the name is too long
|
||||||
@ -163,97 +177,48 @@ void drawName(char name) {
|
|||||||
int x = (84 / 2) - (width / 2);
|
int x = (84 / 2) - (width / 2);
|
||||||
display.setCursor(x, 10);
|
display.setCursor(x, 10);
|
||||||
}
|
}
|
||||||
display.print(name);
|
display.print(programName);
|
||||||
}
|
|
||||||
|
|
||||||
// Check for button input
|
|
||||||
// TODO: Improve encoder input
|
|
||||||
void checkInput(unsigned long time) {
|
|
||||||
long newPosition = encoder.read();
|
|
||||||
if (newPosition != position) {
|
|
||||||
menuUpdate = 1;
|
|
||||||
if (newPosition < position) // Rotating anti-clockwise
|
|
||||||
{
|
|
||||||
if (editing != 1)
|
|
||||||
{
|
|
||||||
if (currentProgram == 0)
|
|
||||||
{
|
|
||||||
currentProgram = programLenght - 1;
|
|
||||||
} else {
|
|
||||||
currentProgram--;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
volume--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (newPosition > position) // Rotating clockwise
|
|
||||||
{
|
|
||||||
if (editing != 1)
|
|
||||||
{
|
|
||||||
if (currentProgram == programLenght - 1)
|
|
||||||
{
|
|
||||||
currentProgram = 0;
|
|
||||||
} else {
|
|
||||||
currentProgram++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
volume++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
position = newPosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (button.pressed())
|
|
||||||
{
|
|
||||||
editing = (editing == 1) ? 0 : 1;
|
|
||||||
blink = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void processData() {
|
void processData() {
|
||||||
if (newData == true) {
|
if (newData == true) {
|
||||||
Serial.print("Raw data recieved: ");
|
|
||||||
Serial.println(receivedChars);
|
|
||||||
|
|
||||||
strcpy(tempChars, receivedChars);
|
strcpy(tempChars, receivedChars);
|
||||||
|
|
||||||
char * strtokIndx;
|
char * strtokIndx;
|
||||||
|
|
||||||
strtokIndx = strtok(tempChars,",");
|
strtokIndx = strtok(tempChars,",");
|
||||||
strcpy(command, strtokIndx);
|
strcpy(command, strtokIndx);
|
||||||
Serial.print("Command: ");
|
|
||||||
Serial.println(command);
|
|
||||||
|
|
||||||
strtokIndx = strtok(NULL, ",");
|
strtokIndx = strtok(NULL, ",");
|
||||||
if (atoi(strtokIndx) > 0) // Integer data
|
|
||||||
{
|
|
||||||
intData = atoi(strtokIndx);
|
|
||||||
Serial.print("Int data: ");
|
|
||||||
Serial.println(intData);
|
|
||||||
} else { // String data
|
|
||||||
strcpy(data, strtokIndx);
|
|
||||||
Serial.print("String data: ");
|
|
||||||
Serial.println(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp("HELLO", command) == 0)
|
if (strcmp("HELLO", command) == 0)
|
||||||
{
|
{
|
||||||
|
connected = true;
|
||||||
Serial.println("<OK>");
|
Serial.println("<OK>");
|
||||||
}
|
}
|
||||||
else if (strcmp("COUNT", command) == 0)
|
else if (strcmp("COUNT", command) == 0)
|
||||||
{
|
{
|
||||||
programLenght = intData;
|
programLenght = atoi(strtokIndx);
|
||||||
|
Serial.println("<OK>");
|
||||||
|
}
|
||||||
|
else if (strcmp("CURRENT", command) == 0)
|
||||||
|
{
|
||||||
|
currentProgram = atoi(strtokIndx);
|
||||||
|
Serial.println("<OK>");
|
||||||
}
|
}
|
||||||
else if (strcmp("NAME", command) == 0)
|
else if (strcmp("NAME", command) == 0)
|
||||||
{
|
{
|
||||||
// Set program name
|
strcpy(programName, strtokIndx);
|
||||||
|
Serial.println("<OK>");
|
||||||
}
|
}
|
||||||
else if (strcmp("GETVOL", command) == 0)
|
else if (strcmp("GETVOL", command) == 0)
|
||||||
{
|
{
|
||||||
// Set volume
|
volume = atoi(strtokIndx);
|
||||||
|
Serial.println("<OK>");
|
||||||
}
|
}
|
||||||
|
|
||||||
newData = false;
|
newData = false;
|
||||||
|
dataReady = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -291,6 +256,58 @@ void checkSerial() {
|
|||||||
processData();
|
processData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for button input
|
||||||
|
// TODO: Improve encoder input
|
||||||
|
void checkInput(unsigned long time) {
|
||||||
|
long newPosition = encoder.read();
|
||||||
|
if (newPosition != position) {
|
||||||
|
menuUpdate = true;
|
||||||
|
if (newPosition < position - 3) // Rotating anti-clockwise
|
||||||
|
{
|
||||||
|
if (!editing)
|
||||||
|
{
|
||||||
|
if (currentProgram == 0)
|
||||||
|
{
|
||||||
|
currentProgram = programLenght - 1;
|
||||||
|
} else {
|
||||||
|
currentProgram--;
|
||||||
|
}
|
||||||
|
Serial.println("<NAME," + (String)currentProgram + ">");
|
||||||
|
} else {
|
||||||
|
if (volume != 0)
|
||||||
|
{
|
||||||
|
Serial.println("<SETVOL," + (String)(volume - 1) + ">");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
position = newPosition;
|
||||||
|
}
|
||||||
|
if (newPosition > position + 3) // Rotating clockwise
|
||||||
|
{
|
||||||
|
if (!editing)
|
||||||
|
{
|
||||||
|
if (currentProgram == programLenght - 1)
|
||||||
|
{
|
||||||
|
currentProgram = 0;
|
||||||
|
} else {
|
||||||
|
currentProgram++;
|
||||||
|
}
|
||||||
|
Serial.println("<NAME," + (String)currentProgram + ">");
|
||||||
|
} else {
|
||||||
|
if (volume != 100)
|
||||||
|
{
|
||||||
|
Serial.println("<SETVOL," + (String)(volume + 1) + ">");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
position = newPosition;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (button.pressed())
|
||||||
|
{
|
||||||
|
editing = (editing) ? 0 : 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Init arduino
|
// Init arduino
|
||||||
void setup() {
|
void setup() {
|
||||||
// Start serial connection
|
// Start serial connection
|
||||||
@ -307,38 +324,47 @@ void setup() {
|
|||||||
display.display();
|
display.display();
|
||||||
|
|
||||||
// TODO: Remove testing variables
|
// TODO: Remove testing variables
|
||||||
programLenght = 3;
|
|
||||||
currentProgram = 0;
|
currentProgram = 0;
|
||||||
volume = 50;
|
|
||||||
connected = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
// Check time
|
// Check time
|
||||||
time = millis();
|
time = millis();
|
||||||
menuUpdate = (time % 1000 == 0) ? 1 : 0;
|
menuUpdate = (time % 1000 == 0) ? true : false;
|
||||||
|
|
||||||
|
if (programLenght == 0 || volume == -1 || strcmp("", programName) == 0)
|
||||||
|
{
|
||||||
|
dataReady = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!editing && connected && dataReady)
|
||||||
|
{
|
||||||
|
blink = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Check for serial data or commands
|
// Check for serial data or commands
|
||||||
checkSerial();
|
checkSerial();
|
||||||
|
|
||||||
// Check if serial connection is established
|
// Check if serial connection is established
|
||||||
if (connected == 1)
|
if (connected)
|
||||||
{
|
{
|
||||||
// Draw menu every second or every 0.1 second when editing
|
// Draw menu every second or every 0.1 second when editing
|
||||||
if (menuUpdate == 1 || (editing == 1 && time % 100 == 0)) {
|
if (menuUpdate || (editing && time % 100 == 0)) {
|
||||||
menuUpdate = 0;
|
menuUpdate = false;
|
||||||
drawMenu(programName, volume);
|
drawMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check input
|
// Check input
|
||||||
checkInput(time);
|
checkInput(time);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (menuUpdate == 1)
|
if (menuUpdate)
|
||||||
{
|
{
|
||||||
// Draw menu with "Waiting for connection", name and volume are ignored bij drawMenu()
|
// Draw menu with "Waiting for connection", name and volume are ignored bij drawMenu()
|
||||||
menuUpdate = 0;
|
menuUpdate = false;
|
||||||
drawMenu("", 0.0);
|
drawMenu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,12 @@ def main():
|
|||||||
board.port = input("\nSelect COM port: ")
|
board.port = input("\nSelect COM port: ")
|
||||||
board.open()
|
board.open()
|
||||||
|
|
||||||
|
print ("Waiting for arduino...")
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
board.write("HELLO".encode("utf-8"))
|
board.write("<HELLO>".encode("utf-8"))
|
||||||
|
board.write("<COUNT,3>".encode("utf-8"))
|
||||||
|
board.write("<GETVOL,50>".encode("utf-8"))
|
||||||
|
board.write("<NAME,Test>".encode("utf-8"))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
Loading…
Reference in New Issue
Block a user