diff --git a/beerbox.h b/beerbox.h index 6c2c0e1..1ee1182 100644 --- a/beerbox.h +++ b/beerbox.h @@ -1,12 +1,17 @@ +#include +//#include +//#include + #ifndef BEERBOX_IS_INCLUDED #define BEERBOX_IS_INCLUDED + #define NUM_OF_PEOPLE 25 #define NUM_OF_DRINKS 10 #define DRINK_NAME_MAX_LENGTH 13 #define FILE_NAME_LEN 4 #define FILE_EXTENSION_LEN 4 -#define FILE_EXTENSION "pers" +#define FILE_EXTENSION "per" #define NAME_LEN 10 extern int __drinks_taken; diff --git a/beerbox.ino b/beerbox.ino index 216ff51..072db24 100644 --- a/beerbox.ino +++ b/beerbox.ino @@ -1,9 +1,15 @@ #include #include +#include +#include +#include +#include "beerbox.h" File myFile; const int chipSelect = 53; +char leckmich[255]; +Beerbox *box; @@ -30,8 +36,8 @@ void setup() { check_for_file("p001", "per"); - - + box = new Beerbox; + box = read_beerbox(box); } @@ -39,7 +45,14 @@ void setup() { void loop() { - + + Person myPerson = read_person(box, "p001"); + //read_person(box, "p002"); + + while(1); + + + }//end loop @@ -55,3 +68,285 @@ void check_for_file(String filename, String extension){ Serial.println(str + " doesn't exist."); } } + +//BEYOND THIS POINT IS THE LEYER OF BEERBOX -- ENTER AT YOUR OWN RISK + +char tmp_filename[FILE_NAME_LEN + FILE_EXTENSION_LEN + 2]; + + + +Beerbox* read_beerbox(Beerbox *box){ + + File read; + int num_read = 0; + int index; + + char tmp[(DRINK_NAME_MAX_LENGTH + 1) * NUM_OF_DRINKS]; + + int i = 0; + + + read = SD.open("bb.con", FILE_READ); + if(read == false){ + + Serial.print("error while reading!\n"); + Serial.print("-ABORT!\n\n"); + while(1); + + } + + for(i = 0 ; i < NUM_OF_DRINKS ; i++){ + + read_line_from_file(read, tmp, sizeof(tmp)); + + if(strlen(tmp)){ + sscanf(tmp, " drink number %d: %s",&index,box->drinks[i].name); + + read_line_from_file(read, tmp, sizeof(tmp)); + sscanf(tmp, " %*s %d ",&box->drinks[i].price); + + read_line_from_file(read, tmp, sizeof(tmp)); + sscanf(tmp, " %*s %d",&box->drinks[i].quantity); + }else{ + strcpy(box->drinks[i].name, "slot empty"); + box->drinks[i].price = -1; + box->drinks[i].quantity = -1; + } + + } + + Serial.print(i + " drinks read!\n\n"); + + for(i = 0; (i < NUM_OF_DRINKS)&&(box->drinks[i].price != -1); i++){ + + + sprintf(leckmich, "drink number : %s\nprice: %d\nquantity: %d\n\n",box->drinks[i].name,box->drinks[i].price,box->drinks[i].quantity); + Serial.print(leckmich); + } + + if(i < NUM_OF_DRINKS){ + sprintf(leckmich, "Slots %d - %d are not in use!\n", i+1, NUM_OF_DRINKS); + Serial.print(leckmich); + } + + read.close(); + return box; + +} + +Person read_person(Beerbox *box, char *filename){ + + Person aperson; + + File read; + + int num_read = 0; + int index; + int tmp_int = 0; + + char tmp[(DRINK_NAME_MAX_LENGTH + 1) * NUM_OF_DRINKS]; + char tmp_drink_name[DRINK_NAME_MAX_LENGTH + 1]; + + int i = 0; + int j = 0; + + memset(tmp_filename, 0, FILE_NAME_LEN + FILE_EXTENSION_LEN + 2); + + strcat(tmp_filename, filename); + strcat(tmp_filename, "."); + strcat(tmp_filename, FILE_EXTENSION); + + read = SD.open(tmp_filename, FILE_READ); + if(read == false){ + + Serial.print("error while reading!\n"); + Serial.print("ABORT!\n\n"); + while(-1); + + } + + strcpy(aperson.file_name, filename); + + for(i = 0; i < NUM_OF_DRINKS; i++){ + aperson.drinks_taken[i] = -1; + } + + + read_line_from_file(read, tmp, sizeof(tmp)); + strcpy(aperson.name, tmp); + + read_line_from_file(read, tmp, sizeof(tmp)); + sscanf(tmp, " %*s %d", &aperson.rfid_uuid); + Serial.print(aperson.rfid_uuid); + + read_line_from_file(read, tmp, sizeof(tmp)); + sscanf(tmp, " %*s %d", &aperson.finger_uuid); + Serial.println(aperson.finger_uuid); + + + j = 0; + while(read_line_from_file(read, tmp, sizeof(tmp)), strlen(tmp) > 0){ + + i = 0; + sscanf(tmp, " %*s %s", tmp_drink_name); + + for(i = 0;(i < NUM_OF_DRINKS)&&(strcmp(box->drinks[i].name, tmp_drink_name)); i++){ + //Serial.print("It´s not drink No %d: %s\n", i+1, box->drinks[i].name ); + + } + + if(i == NUM_OF_DRINKS){ + //Is it in? + //Serial.print("Drink \"%s\" does not exist in box!\n", tmp_drink_name); + }else{ + + read_line_from_file(read, tmp, sizeof(tmp)); + sscanf(tmp, " %*s %d", &aperson.drinks_taken[i]); + //Serial.print(">>Quantity: %d\n", aperson.drinks_taken[i].quantity); + read_line_from_file(read, tmp, sizeof(tmp)); + //Serial.print(">>Total: %d\n\n", aperson.drinks_taken[i].total); + } + + } + + + print_person(box, &aperson); +//comment back in once it is fixed + //update_pers_file(box, &aperson); + + read.close(); + + return aperson; +} + +void print_person(Beerbox *box, Person *aperson){ + + int i = 0; + + memset(tmp_filename, 0, FILE_NAME_LEN + FILE_EXTENSION_LEN + 2); + strcat(tmp_filename, aperson->file_name); + strcat(tmp_filename, "."); + strcat(tmp_filename, FILE_EXTENSION); + + + sprintf(leckmich,"\nPerson is called \"%s\" and has the filename \"%s\".\n", aperson->name, tmp_filename); + Serial.write(leckmich); + sprintf(leckmich, "rfid_uuid: %d\n", aperson->rfid_uuid); + Serial.write(leckmich); + sprintf(leckmich, "finger_uuid: %d\n", aperson->finger_uuid); + Serial.print(leckmich); + + + for(i = 0; i < NUM_OF_DRINKS; i++){ + + if(aperson->drinks_taken[i] != -1){ + + sprintf(leckmich, "\nDrink: %s\n", box->drinks[i].name); + Serial.write(leckmich); + sprintf(leckmich, "Consumed: %d\n", aperson->drinks_taken[i]); + Serial.write(leckmich); + sprintf(leckmich, "Total: %d.%02d Euro\n", aperson->drinks_taken[i]*box->drinks[i].price/100, (aperson->drinks_taken[i]*box->drinks[i].price)%100); + Serial.write(leckmich); + + } + + } + + +} + + +int update_pers_file(Beerbox *box, Person *aperson){ + File write; + char *tmp = NULL; + //write = fopen() + int i = 0; + + memset(tmp_filename, 0, FILE_NAME_LEN + FILE_EXTENSION_LEN + 2); + strcat(tmp_filename, aperson->file_name); + strcat(tmp_filename, "."); + strcat(tmp_filename, FILE_EXTENSION); + + write = SD.open(tmp_filename, FILE_WRITE); + write.seek(0); + + if(write == NULL){ + Serial.print("error while reading!\n"); + Serial.print("ABORT!\n\n"); + while(-1); + + } + + sprintf(leckmich, " %s\n", aperson->name); + write.write(tmp, strlen(tmp)); + sprintf(leckmich, "rfid_uuid: %d\n", aperson->rfid_uuid); + write.write(tmp, strlen(tmp)); + sprintf(leckmich, "finger_uuid: %d\n", aperson->finger_uuid); + write.write(tmp, strlen(tmp)); + + for(i = 0; i < NUM_OF_DRINKS; i++){ + + if(aperson->drinks_taken[i] != -1){ + + sprintf(leckmich, "\nDrink: %s\n", box->drinks[i].name); + write.write(tmp, strlen(tmp)); + sprintf(leckmich, "Consumed: %d\n", aperson->drinks_taken[i]); + write.write(tmp, strlen(tmp)); + sprintf(leckmich, "Total: %d\n\n", aperson->drinks_taken[i]*box->drinks[i].price); + write.write(tmp, strlen(tmp)); + + } + + } + + + write.close(); + + return 0; + +} + + +char* read_from_file_until(File stream, char *str, int max_len, char until){ + + int i = 0; + int tmp_int = 0; + + memset(str, 0, max_len); + + for(i = 0; (tmp_int != until)&&(i < (max_len-1))&&(tmp_int != -1); i++){ + tmp_int = stream.read(); + //Serial.print("%c", tmp_int); + str[i] = tmp_int; + } + + + if(tmp_int == -1){ + + //May occur more often as the function tries to read a certain number of drinks. + //Serial.print("END OF FILE REACHED!\nABORT!!\n\n"); + + str[0] = 0; + return str; + } + + if(str[0] != '\n')str[i-1] = 0; + + + return str; +} + +char *read_line_from_file(File stream, char *str, int max_len){ + + do{ + str = read_from_file_until(stream, str, max_len, '\n'); + }while((str[0] == '\n')); + + + return str; +} +// +//@Lukas +//Funktion schreiben, welche ein Array vom struct Person (Beliebige Groesse) sowie eine rfid-kennung uebernimmt und den Index der entsprechenden Person im array (beginnend bei 0)zurueckgiebt. +// +