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;
|
||||
};
|
||||
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
|
||||
178
src/main.cpp
178
src/main.cpp
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user