1
0
This commit is contained in:
Alexander Junk 2015-07-13 19:09:27 +02:00
parent 173e464808
commit e82e5729aa
2 changed files with 304 additions and 4 deletions

View File

@ -1,12 +1,17 @@
#include <Arduino.h>
//#include <SPI.h>
//#include <SD.h>
#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;

View File

@ -1,9 +1,15 @@
#include <SPI.h>
#include <SD.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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);
}
@ -40,6 +46,13 @@ 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.
//