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

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@@ -36,7 +36,7 @@ struct ShortText {
int h;
};
struct LongText {
char text[30];
char text[40];
int w;
int h;
};
@@ -60,5 +60,9 @@ bool load_image(const char* filename);
void listSPIFFS();
void handleImageUpload();
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

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
}