Implemented processor votes receiving and processing. First revision of v0.2 fully finished.

This commit is contained in:
2025-11-10 21:53:16 +00:00
parent dbcb8c50f7
commit 7ea89993d7
7 changed files with 36988 additions and 36758 deletions

View File

@@ -29,6 +29,7 @@ PicoMQTT::Server mqtt_server;
// Global variables
size_t num_badges;
size_t curr_vote = 0;
size_t final_vote[6] = {};
int start_screen = 0;
int ibvs_mode = 0;
int ping_number = 0;
@@ -41,10 +42,11 @@ bool winnerDone = false;
bool vote_end = false;
bool wifi_connected = false;
char current_screen = 'A';
char winner = '0';
char winner = 'X';
char Badge_ID[9];
String badges;
std::vector<String> register_badges;
String load = "";
String current;
String topic_test = "voting/ready";
String topic_winner = "voting/winner";
@@ -58,7 +60,7 @@ ShortText item3 = {"Maybe", 4, 140};
ShortText item4 = {"Abstain", 4, 170};
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
@@ -198,7 +200,7 @@ void loop() {
server.handleClient(); // For web image uploader
if (winner != '0' && !winnerDone) {
if (winner != 'X' && !winnerDone) {
Winner_Screen();
winnerDone = true;
}
@@ -210,12 +212,13 @@ void loop() {
WiFi.config(processor_IP, gateway, subnet);
set_var_ui_ip(WiFi.localIP().toString().c_str());
badge_registration();
voting_setup();
configDone = true;
}
if (vote_end) {
message = '3';
if (vote_end) {
message = get_winner();
mqtt_server.publish(topic_winner, message);
vote_end = false;
}
@@ -322,7 +325,7 @@ void serial_config() {
current_screen = 'C';
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() {
@@ -365,7 +368,6 @@ void mqtt_subs() {
}
else if (strcmp(topic, "voting/winner") == 0) {
winner = payload[0];
// Serial.println("Im in the mqtt receive winner");
DBG_L1("Im in the mqtt receive winner");
}
else if (strcmp(topic, "voting/ready") == 0) {
@@ -389,6 +391,7 @@ void mqtt_subs() {
mqtt_server.subscribe("voter#", [](const char * topic, const char * payload) {
Serial.printf("Received message in topic '%s': %s\r\n", topic, payload);
// strcpy(load, payload);
String curr_badge(topic);
curr_badge.replace("voter/", "");
curr_badge = curr_badge.substring(0, 8);
@@ -403,6 +406,8 @@ void mqtt_subs() {
if (found) {
Serial.println("Badge is authorised");
char c = payload[0];
update_voting(c);
curr_vote++;
} else {
Serial.println("Badge NOT found");
@@ -437,7 +442,7 @@ void Winner_Screen() {
else if (winner == '5')
set_var_ui_winner(item5.text);
else
set_var_ui_winner("All losers...");
set_var_ui_winner("Its a tie try again...");
current_screen = 'F';
screenNeedsUpdate = true;
@@ -556,7 +561,7 @@ void mqtt_manager(void *pvParameters) {
mqtt_client.begin();
mqtt_subs();
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();
vTaskDelay(5 / portTICK_PERIOD_MS);
@@ -566,7 +571,7 @@ void mqtt_manager(void *pvParameters) {
mqtt_server.begin();
mqtt_subs();
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();
vTaskDelay(5 / portTICK_PERIOD_MS);
@@ -725,7 +730,7 @@ if (upload.status == UPLOAD_FILE_START) {
fs::File root = SPIFFS.open("/");
fs::File file = root.openNextFile();
while(file) {
if (!file.isDirectory()) { // ADD THIS CHECK
if (!file.isDirectory()) {
String name = String(file.name());
file.close();
SPIFFS.remove(name);
@@ -769,4 +774,155 @@ void handleUploadComplete() {
Serial.println(filename);
load_image(filename.c_str());
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
}