2015-07-13 14:49:36 +00:00
# include <SPI.h>
# include <SD.h>
2015-07-13 17:09:27 +00:00
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include "beerbox.h"
2015-07-13 14:49:36 +00:00
File myFile ;
const int chipSelect = 53 ;
2015-07-13 17:09:27 +00:00
char leckmich [ 255 ] ;
Beerbox * box ;
2015-07-13 14:49:36 +00:00
void setup ( ) {
Serial . begin ( 115200 ) ;
Serial . begin ( 9600 ) ;
while ( ! Serial ) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial . print ( " Initializing SD card... " ) ;
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode ( SS , OUTPUT ) ;
if ( ! SD . begin ( chipSelect ) ) {
Serial . println ( " initialization failed! " ) ;
return ;
}
Serial . println ( " initialization done. " ) ;
check_for_file ( " p001 " , " per " ) ;
2015-07-13 17:09:27 +00:00
box = new Beerbox ;
box = read_beerbox ( box ) ;
2015-07-13 14:49:36 +00:00
}
void loop ( ) {
2015-07-13 17:09:27 +00:00
Person myPerson = read_person ( box , " p001 " ) ;
//read_person(box, "p002");
while ( 1 ) ;
2015-07-13 14:49:36 +00:00
} //end loop
void check_for_file ( String filename , String extension ) {
String str = filename + ' . ' + extension ;
char * buf = NULL ;
str . toCharArray ( buf , str . length ( ) + 1 ) ;
if ( SD . exists ( " p001.per " ) ) {
Serial . println ( str + " exists. " ) ;
}
else {
Serial . println ( str + " doesn't exist. " ) ;
}
}
2015-07-13 17:09:27 +00:00
//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 \n price: %d \n quantity: %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 ) ;
2015-07-13 17:32:39 +00:00
memset ( aperson . rfid_uuid , 0 , 13 ) ;
2015-07-13 17:09:27 +00:00
read_line_from_file ( read , tmp , sizeof ( tmp ) ) ;
2015-07-13 17:32:39 +00:00
sscanf ( tmp , " %*s %12s " , aperson . rfid_uuid ) ;
2015-07-13 17:09:27 +00:00
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 , " \n Person is called \" %s \" and has the filename \" %s \" . \n " , aperson - > name , tmp_filename ) ;
Serial . write ( leckmich ) ;
2015-07-13 17:32:39 +00:00
sprintf ( leckmich , " rfid_uuid: %s \n " , aperson - > rfid_uuid ) ;
2015-07-13 17:09:27 +00:00
Serial . write ( leckmich ) ;
2015-07-13 17:32:39 +00:00
sprintf ( leckmich , " finger_uuid: %u \n " , aperson - > finger_uuid ) ;
2015-07-13 17:09:27 +00:00
Serial . print ( leckmich ) ;
for ( i = 0 ; i < NUM_OF_DRINKS ; i + + ) {
if ( aperson - > drinks_taken [ i ] ! = - 1 ) {
sprintf ( leckmich , " \n Drink: %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 ) ) ;
2015-07-13 17:32:39 +00:00
sprintf ( leckmich , " rfid_uuid: %s \n " , aperson - > rfid_uuid ) ;
2015-07-13 17:09:27 +00:00
write . write ( tmp , strlen ( tmp ) ) ;
2015-07-13 17:32:39 +00:00
sprintf ( leckmich , " finger_uuid: %u \n " , aperson - > finger_uuid ) ;
2015-07-13 17:09:27 +00:00
write . write ( tmp , strlen ( tmp ) ) ;
for ( i = 0 ; i < NUM_OF_DRINKS ; i + + ) {
if ( aperson - > drinks_taken [ i ] ! = - 1 ) {
sprintf ( leckmich , " \n Drink: %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.
2015-07-13 17:31:57 +00:00
int getRFIDIndex ( Person * persons , char * rfid ) {
for ( int i = 0 ; i < sizeof ( persons ) / sizeof ( Person ) ; i + + ) {
if ( ! strcmp ( persons [ i ] . rfid_uuid , rfid ) ) {
return i ;
}
}
}
2015-07-13 17:09:27 +00:00
//