Implemented processor votes receiving and processing. First revision of v0.2 fully finished.
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -36,7 +36,7 @@ struct ShortText {
|
|||||||
int h;
|
int h;
|
||||||
};
|
};
|
||||||
struct LongText {
|
struct LongText {
|
||||||
char text[30];
|
char text[40];
|
||||||
int w;
|
int w;
|
||||||
int h;
|
int h;
|
||||||
};
|
};
|
||||||
@@ -60,5 +60,9 @@ bool load_image(const char* filename);
|
|||||||
void listSPIFFS();
|
void listSPIFFS();
|
||||||
void handleImageUpload();
|
void handleImageUpload();
|
||||||
void handleUploadComplete();
|
void handleUploadComplete();
|
||||||
|
void update_voting(char load);
|
||||||
|
void voting_setup();
|
||||||
|
bool ask_input(const char* prompt, const char* item_name, char* output, size_t output_size);
|
||||||
|
char get_winner();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
178
src/main.cpp
178
src/main.cpp
@@ -29,6 +29,7 @@ PicoMQTT::Server mqtt_server;
|
|||||||
// Global variables
|
// Global variables
|
||||||
size_t num_badges;
|
size_t num_badges;
|
||||||
size_t curr_vote = 0;
|
size_t curr_vote = 0;
|
||||||
|
size_t final_vote[6] = {};
|
||||||
int start_screen = 0;
|
int start_screen = 0;
|
||||||
int ibvs_mode = 0;
|
int ibvs_mode = 0;
|
||||||
int ping_number = 0;
|
int ping_number = 0;
|
||||||
@@ -41,10 +42,11 @@ bool winnerDone = false;
|
|||||||
bool vote_end = false;
|
bool vote_end = false;
|
||||||
bool wifi_connected = false;
|
bool wifi_connected = false;
|
||||||
char current_screen = 'A';
|
char current_screen = 'A';
|
||||||
char winner = '0';
|
char winner = 'X';
|
||||||
char Badge_ID[9];
|
char Badge_ID[9];
|
||||||
String badges;
|
String badges;
|
||||||
std::vector<String> register_badges;
|
std::vector<String> register_badges;
|
||||||
|
String load = "";
|
||||||
String current;
|
String current;
|
||||||
String topic_test = "voting/ready";
|
String topic_test = "voting/ready";
|
||||||
String topic_winner = "voting/winner";
|
String topic_winner = "voting/winner";
|
||||||
@@ -58,7 +60,7 @@ ShortText item3 = {"Maybe", 4, 140};
|
|||||||
ShortText item4 = {"Abstain", 4, 170};
|
ShortText item4 = {"Abstain", 4, 170};
|
||||||
ShortText item5 = {"Null", 4, 200};
|
ShortText item5 = {"Null", 4, 200};
|
||||||
|
|
||||||
lv_image_dsc_t* dynamic_img_dsc = NULL;
|
//lv_image_dsc_t* dynamic_img_dsc = NULL;
|
||||||
|
|
||||||
WebServer server(80); // For web image uploader
|
WebServer server(80); // For web image uploader
|
||||||
|
|
||||||
@@ -198,7 +200,7 @@ void loop() {
|
|||||||
|
|
||||||
server.handleClient(); // For web image uploader
|
server.handleClient(); // For web image uploader
|
||||||
|
|
||||||
if (winner != '0' && !winnerDone) {
|
if (winner != 'X' && !winnerDone) {
|
||||||
Winner_Screen();
|
Winner_Screen();
|
||||||
winnerDone = true;
|
winnerDone = true;
|
||||||
}
|
}
|
||||||
@@ -210,12 +212,13 @@ void loop() {
|
|||||||
WiFi.config(processor_IP, gateway, subnet);
|
WiFi.config(processor_IP, gateway, subnet);
|
||||||
set_var_ui_ip(WiFi.localIP().toString().c_str());
|
set_var_ui_ip(WiFi.localIP().toString().c_str());
|
||||||
badge_registration();
|
badge_registration();
|
||||||
|
voting_setup();
|
||||||
configDone = true;
|
configDone = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (vote_end) {
|
if (vote_end) {
|
||||||
message = '3';
|
message = get_winner();
|
||||||
mqtt_server.publish(topic_winner, message);
|
mqtt_server.publish(topic_winner, message);
|
||||||
vote_end = false;
|
vote_end = false;
|
||||||
}
|
}
|
||||||
@@ -322,7 +325,7 @@ void serial_config() {
|
|||||||
|
|
||||||
current_screen = 'C';
|
current_screen = 'C';
|
||||||
screenNeedsUpdate = true;
|
screenNeedsUpdate = true;
|
||||||
// DBG_L1("Current screen is: %c\r\n", current_screen); // Debug
|
DBG_L1("Current screen is: %c\r\n", current_screen); // Debug
|
||||||
}
|
}
|
||||||
|
|
||||||
void mqtt_subs() {
|
void mqtt_subs() {
|
||||||
@@ -365,7 +368,6 @@ void mqtt_subs() {
|
|||||||
}
|
}
|
||||||
else if (strcmp(topic, "voting/winner") == 0) {
|
else if (strcmp(topic, "voting/winner") == 0) {
|
||||||
winner = payload[0];
|
winner = payload[0];
|
||||||
// Serial.println("Im in the mqtt receive winner");
|
|
||||||
DBG_L1("Im in the mqtt receive winner");
|
DBG_L1("Im in the mqtt receive winner");
|
||||||
}
|
}
|
||||||
else if (strcmp(topic, "voting/ready") == 0) {
|
else if (strcmp(topic, "voting/ready") == 0) {
|
||||||
@@ -389,6 +391,7 @@ void mqtt_subs() {
|
|||||||
mqtt_server.subscribe("voter#", [](const char * topic, const char * payload) {
|
mqtt_server.subscribe("voter#", [](const char * topic, const char * payload) {
|
||||||
Serial.printf("Received message in topic '%s': %s\r\n", topic, payload);
|
Serial.printf("Received message in topic '%s': %s\r\n", topic, payload);
|
||||||
|
|
||||||
|
// strcpy(load, payload);
|
||||||
String curr_badge(topic);
|
String curr_badge(topic);
|
||||||
curr_badge.replace("voter/", "");
|
curr_badge.replace("voter/", "");
|
||||||
curr_badge = curr_badge.substring(0, 8);
|
curr_badge = curr_badge.substring(0, 8);
|
||||||
@@ -403,6 +406,8 @@ void mqtt_subs() {
|
|||||||
|
|
||||||
if (found) {
|
if (found) {
|
||||||
Serial.println("Badge is authorised");
|
Serial.println("Badge is authorised");
|
||||||
|
char c = payload[0];
|
||||||
|
update_voting(c);
|
||||||
curr_vote++;
|
curr_vote++;
|
||||||
} else {
|
} else {
|
||||||
Serial.println("Badge NOT found");
|
Serial.println("Badge NOT found");
|
||||||
@@ -437,7 +442,7 @@ void Winner_Screen() {
|
|||||||
else if (winner == '5')
|
else if (winner == '5')
|
||||||
set_var_ui_winner(item5.text);
|
set_var_ui_winner(item5.text);
|
||||||
else
|
else
|
||||||
set_var_ui_winner("All losers...");
|
set_var_ui_winner("Its a tie try again...");
|
||||||
|
|
||||||
current_screen = 'F';
|
current_screen = 'F';
|
||||||
screenNeedsUpdate = true;
|
screenNeedsUpdate = true;
|
||||||
@@ -556,7 +561,7 @@ void mqtt_manager(void *pvParameters) {
|
|||||||
mqtt_client.begin();
|
mqtt_client.begin();
|
||||||
mqtt_subs();
|
mqtt_subs();
|
||||||
ibvs_mode_done = true;
|
ibvs_mode_done = true;
|
||||||
DBG_L1("mqtt_subs() done once in badge mode"); // Debug
|
DBG_L1("mqtt_subs() done once in badge mode\r\n"); // Debug
|
||||||
}
|
}
|
||||||
mqtt_client.loop();
|
mqtt_client.loop();
|
||||||
vTaskDelay(5 / portTICK_PERIOD_MS);
|
vTaskDelay(5 / portTICK_PERIOD_MS);
|
||||||
@@ -566,7 +571,7 @@ void mqtt_manager(void *pvParameters) {
|
|||||||
mqtt_server.begin();
|
mqtt_server.begin();
|
||||||
mqtt_subs();
|
mqtt_subs();
|
||||||
ibvs_mode_done = true;
|
ibvs_mode_done = true;
|
||||||
DBG_L1("mqtt_subs() done once in processor mode"); // Debug
|
DBG_L1("mqtt_subs() done once in processor mode\r\n"); // Debug
|
||||||
}
|
}
|
||||||
mqtt_server.loop();
|
mqtt_server.loop();
|
||||||
vTaskDelay(5 / portTICK_PERIOD_MS);
|
vTaskDelay(5 / portTICK_PERIOD_MS);
|
||||||
@@ -725,7 +730,7 @@ if (upload.status == UPLOAD_FILE_START) {
|
|||||||
fs::File root = SPIFFS.open("/");
|
fs::File root = SPIFFS.open("/");
|
||||||
fs::File file = root.openNextFile();
|
fs::File file = root.openNextFile();
|
||||||
while(file) {
|
while(file) {
|
||||||
if (!file.isDirectory()) { // ADD THIS CHECK
|
if (!file.isDirectory()) {
|
||||||
String name = String(file.name());
|
String name = String(file.name());
|
||||||
file.close();
|
file.close();
|
||||||
SPIFFS.remove(name);
|
SPIFFS.remove(name);
|
||||||
@@ -769,4 +774,155 @@ void handleUploadComplete() {
|
|||||||
Serial.println(filename);
|
Serial.println(filename);
|
||||||
load_image(filename.c_str());
|
load_image(filename.c_str());
|
||||||
server.send(200, "text/plain", "Upload OK");
|
server.send(200, "text/plain", "Upload OK");
|
||||||
|
}
|
||||||
|
|
||||||
|
void update_voting(char load) {
|
||||||
|
|
||||||
|
switch (load) {
|
||||||
|
case '1':
|
||||||
|
final_vote[1]++;
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
final_vote[2]++;
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
final_vote[3]++;
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
final_vote[4]++;
|
||||||
|
break;
|
||||||
|
case '5':
|
||||||
|
final_vote[5]++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
final_vote[0]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBG_L1("\r\nCurrent votes:\r\n");
|
||||||
|
DBG_L1("1 -> %zu votes\r\n", final_vote[1]);
|
||||||
|
DBG_L1("2 -> %zu votes\r\n", final_vote[2]);
|
||||||
|
DBG_L1("3 -> %zu votes\r\n", final_vote[3]);
|
||||||
|
DBG_L1("4 -> %zu votes\r\n", final_vote[4]);
|
||||||
|
DBG_L1("5 -> %zu votes\r\n", final_vote[5]);
|
||||||
|
DBG_L1("Null votes -> %zu votes\r\n\r\n", final_vote[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void voting_setup() {
|
||||||
|
Serial.println();
|
||||||
|
char questions_buffer[100];
|
||||||
|
|
||||||
|
if (ask_input("Type the voting question:", "question", questions_buffer, sizeof(questions_buffer))) {
|
||||||
|
strncpy(question.text, questions_buffer, sizeof(question.text) - 1);
|
||||||
|
question.text[sizeof(question.text) - 1] = '\0';
|
||||||
|
mqtt_server.publish("voting/question", question.text);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ask_input("Type item 1 option:", "item1", questions_buffer, sizeof(questions_buffer))) {
|
||||||
|
strncpy(item1.text, questions_buffer, sizeof(item1.text) - 1);
|
||||||
|
item1.text[sizeof(item1.text) - 1] = '\0';
|
||||||
|
mqtt_server.publish("voting/item1", item1.text);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ask_input("Type item 2 option:", "item2", questions_buffer, sizeof(questions_buffer))) {
|
||||||
|
strncpy(item2.text, questions_buffer, sizeof(item2.text) - 1);
|
||||||
|
item2.text[sizeof(item2.text) - 1] = '\0';
|
||||||
|
mqtt_server.publish("voting/item2", item2.text);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ask_input("Type item 3 option:", "item3", questions_buffer, sizeof(questions_buffer))) {
|
||||||
|
strncpy(item3.text, questions_buffer, sizeof(item3.text) - 1);
|
||||||
|
item3.text[sizeof(item3.text) - 1] = '\0';
|
||||||
|
mqtt_server.publish("voting/item3", item3.text);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ask_input("Type the item 4 option:", "item4", questions_buffer, sizeof(questions_buffer))) {
|
||||||
|
strncpy(item4.text, questions_buffer, sizeof(item4.text) - 1);
|
||||||
|
item4.text[sizeof(item4.text) - 1] = '\0';
|
||||||
|
mqtt_server.publish("voting/item4", item4.text);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ask_input("Type item 5 option:", "item5", questions_buffer, sizeof(questions_buffer))) {
|
||||||
|
strncpy(item5.text, questions_buffer, sizeof(item5.text) - 1);
|
||||||
|
item5.text[sizeof(item5.text) - 1] = '\0';
|
||||||
|
mqtt_server.publish("voting/item5", item5.text);
|
||||||
|
}
|
||||||
|
Serial.printf("\r\n\t\t--= Voting session is now starting =--\r\n\r\n");
|
||||||
|
mqtt_server.publish("voting/ready", "start");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ask_input(const char* prompt, const char* item_name, char* output, size_t output_size) {
|
||||||
|
bool confirmed = false;
|
||||||
|
char buffer[100];
|
||||||
|
size_t pos = 0;
|
||||||
|
|
||||||
|
while (!confirmed) {
|
||||||
|
Serial.println(prompt);
|
||||||
|
|
||||||
|
// Clear any existing input
|
||||||
|
while(Serial.available()) Serial.read();
|
||||||
|
|
||||||
|
// Read line
|
||||||
|
pos = 0;
|
||||||
|
memset(buffer, 0, sizeof(buffer));
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (Serial.available() > 0) {
|
||||||
|
char c = Serial.read();
|
||||||
|
if (c == '\n' || c == '\r') {
|
||||||
|
if (pos > 0) {
|
||||||
|
buffer[pos] = '\0';
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
Serial.println(prompt);
|
||||||
|
}
|
||||||
|
} else if (pos < sizeof(buffer) - 1) {
|
||||||
|
buffer[pos++] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delay(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.print("You entered: ");
|
||||||
|
Serial.println(buffer);
|
||||||
|
Serial.println("Is this correct? (y/n)");
|
||||||
|
|
||||||
|
while (Serial.available() == 0) delay(10);
|
||||||
|
|
||||||
|
char response = Serial.read();
|
||||||
|
Serial.println('\n');
|
||||||
|
while(Serial.available()) Serial.read();
|
||||||
|
|
||||||
|
if (response == 'y' || response == 'Y') {
|
||||||
|
confirmed = true;
|
||||||
|
strncpy(output, buffer, output_size - 1);
|
||||||
|
output[output_size - 1] = '\0';
|
||||||
|
Serial.print(item_name);
|
||||||
|
Serial.println(" saved!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char get_winner() {
|
||||||
|
size_t max_votes = 0;
|
||||||
|
char winner = '0';
|
||||||
|
int tie_count = 0;
|
||||||
|
|
||||||
|
// Find max
|
||||||
|
for (int i = 1; i <= 5; i++) {
|
||||||
|
if (final_vote[i] > max_votes) {
|
||||||
|
max_votes = final_vote[i];
|
||||||
|
winner = '0' + i; // Convert 1-5 to '1'-'5'
|
||||||
|
tie_count = 1;
|
||||||
|
} else if (final_vote[i] == max_votes && final_vote[i] > 0) {
|
||||||
|
tie_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tie_count > 1) {
|
||||||
|
return '0'; // '0' means tie
|
||||||
|
}
|
||||||
|
return winner; // '1'-'5' for winner
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user