System to manage inventory for a cooler. Allows real time check in of products via RFID, as well as check out. Also includes a scale to weigh products upon check out, and has a real time temperature tracking system that sounds an alert if the cooler gets too hot.

Dependencies:   DHT11 HX711 MFRC522 SDFileSystemEditied mbed

Revision:
0:ad334aa4c7c4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/functions.cpp	Wed Mar 07 17:52:23 2018 +0000
@@ -0,0 +1,520 @@
+#include <stdio.h>
+#include <iostream>
+#include <stdlib.h>
+#include <string.h>
+#include <string>
+#include "functions.h"
+#include "product.h"
+#include "HX711.h"
+#include "Dht11.h"
+
+Dht11 sensor(D7);
+float maxtemp = 80;
+DigitalOut buzzer(D2);
+DigitalOut LED(PTB22);
+
+volatile float Farenheit;
+volatile int Humidity;
+extern int id[10];
+extern int flag1;
+extern int flag2;
+
+//Adds a new product type to the database
+struct product *addproduct(struct product *head)
+{
+    struct product *newp = (struct product*)malloc(sizeof( struct product));
+    char name[20];
+    unsigned int pid1, pid2, pid3, pid4;
+    float weight, priceper;
+
+    fflush(stdin);
+
+    printf("\n\rName:\n\r");
+    scanf("%20s", &name);
+    fflush(stdin);
+    printf("\n\rpid(1):\n\r");
+    scanf("%d", &pid1);
+    printf("\n\rpid(2):\n\r");
+    scanf("%d", &pid2);
+    printf("\n\rpid(3):\n\r");
+    scanf("%d", &pid3);
+    printf("\n\rpid(4):\n\r");
+    scanf("%d", &pid4);
+    printf("\n\rPriceper:\n\r");
+    scanf("%f", &priceper);
+
+    strcpy(newp->pname, name);
+    newp->pid[0] = pid1;
+    newp->pid[1] = pid2;
+    newp->pid[2] = pid3;
+    newp->pid[3] = pid4;
+    newp->count = 1;
+    newp->priceper = priceper;
+
+
+    newp->next = head;
+    head = newp;
+
+    std::cout << "\n\r\n\r";
+    
+    return head;
+}
+
+//Sorts the list by product name alphabetical order
+struct product *sortlist(struct product *head)
+{
+    struct product *temp, *ptr, *prev;
+    int x, check;
+
+    while(1)
+    {
+        check = 0;
+        ptr = head;
+        prev = head;
+
+        while((ptr->next != NULL) && (ptr != NULL))
+        {
+            if(strcmp(ptr->pname, ptr->next->pname) > 0)
+            {
+                if(ptr == head)
+                {
+                    temp = ptr->next->next;
+                    ptr->next->next = ptr;
+                    head = ptr->next;
+                    ptr->next = temp;
+                    check = 1;
+                    
+                }
+
+                else
+                {
+                    temp = ptr->next->next;
+                    prev->next = ptr->next;
+                    ptr->next->next = ptr;
+                    ptr->next = temp;
+                    check = 1;
+                }
+            }
+
+            if(ptr->next == NULL)
+                break;
+            else
+            {
+                prev = ptr;
+                ptr = ptr->next;
+            }
+        }
+
+        //Breaks if no swap occured
+        if(check == 0)
+            break;
+    }
+
+    return head;
+}
+
+//Displays the inventory list to the user
+struct product* displaylist(struct product *head)
+{
+    struct product *ptr;
+
+    if(head == NULL)
+    {
+        printf("\n\r\n\rNothing in stock!\n\r\n\r");
+        return head;
+    }
+
+    head = sortlist(head);
+
+    ptr = head;
+
+    while(ptr != NULL)
+    {
+        //Doesn't print out of stock items
+        if(ptr->count <= 0)
+        {
+            ptr = ptr->next;
+            continue;
+        }
+            
+        //Clears input buffer
+        fflush(stdin);
+
+        printf("\n\r%15s:    ID: %4d%4d%4d%4d    Price/lb: %6.2f    In Stock: %d\n\r", ptr->pname, ptr->pid[0], ptr->pid[1], 
+        ptr->pid[2], ptr->pid[3], ptr->priceper, ptr->count);
+        ptr = ptr->next;
+    }
+
+    printf("\n\r\n\r");
+    return head;
+}
+
+//Frees the memory allocated for the inventory list
+void freelist(struct product *head)
+{
+    struct product *ptr, *temp;
+
+    ptr = head;
+
+    while(ptr != NULL)
+    {
+        temp = ptr;
+        ptr = ptr->next;
+        free(temp);
+    }
+}
+
+//Saves the inventory list to a csv file
+void savelist(struct product *head)
+{
+    FILE *fp;
+    struct product *ptr;
+
+    ptr = head;
+
+    //Open file pointer to output file
+    if((fp = fopen("/sd/inventory.txt", "w")) == NULL)
+        perror("Error");
+
+    while(ptr != NULL)
+    {
+        //Outputs attributes
+        fprintf(fp, "%s,%d,%d,%d,%d,%d,%.3f,\n", ptr->pname,
+            ptr->pid[0], ptr->pid[1], ptr->pid[2], ptr->pid[3], ptr->count, ptr->priceper);
+
+        ptr = ptr->next;
+    }
+
+    fclose(fp);
+}
+
+//Loads the inventory list from the csv file 
+struct product* loadlist()
+{
+    FILE *fp;
+    char line[512], *token;
+    int x, flag = 0;
+    struct product *newprod, *head, *prev;
+    
+
+    //Opens file pointer to input file
+    if((fp = fopen("/sd/inventory.txt", "r")) == NULL)
+    {
+        printf("\n\r\n\rInventory is empty:\n\r\n\r");
+        return NULL;
+    }
+
+    
+    //Reads in next line of file
+    while(fgets(line, 512, fp) != NULL)
+    {
+        //Breaks when end of file is reached
+        if(feof(fp))
+            break;
+
+        //Allocates memory for the product
+        newprod = (struct product*)malloc(sizeof(struct product));
+
+        //Adds the product to the list in order (flag is 0 for the first product only)
+        if(flag == 0)
+            head = newprod;
+        else
+            prev->next = newprod;
+
+        //Moves prev up
+        prev = newprod;
+        newprod->next = NULL;
+
+        //Breaks csv line into tokens with comma as the delimiter 
+        token = strtok(line, ",");
+
+        //Iterates once for each attribute in the product structure
+        for(x=0;x<7;x++)
+        {
+            if(x == 0)
+                strcpy(newprod->pname, token);
+
+            else if(x == 1)
+                newprod->pid[0] = atoi(token);
+                
+            else if(x == 2)
+                newprod->pid[1] = atoi(token);
+                
+            else if(x == 3)
+                newprod->pid[2] = atoi(token);    
+                
+            else if(x == 4)
+                newprod->pid[3] = atoi(token); 
+                
+            else if(x == 5)
+                newprod->count = atoi(token);
+            
+            else
+                newprod->priceper = atof(token);
+
+            //Goes to next token
+            token = strtok(NULL, ",");
+        }
+
+        //Sets flag so it's 1 for all iterations except the first
+        flag = 1;
+
+    }
+
+    fclose(fp);
+    return head;
+}
+
+//Finds a product by its name and returns it or NULL if not found
+struct product* findbyname(char name[50], struct product *head)
+{
+    struct product *ptr;
+    
+    ptr = head;
+
+    while(ptr != NULL)
+    {
+        if(strcmp(ptr->pname, name) == 0)
+            return ptr;
+
+        ptr = ptr->next;
+    }
+
+    return NULL;
+
+}
+
+struct product* findbyid(int id[10], struct product *head)
+{
+    struct product *ptr;
+    int x;
+    
+    ptr = head;
+
+    while(ptr != NULL)
+    {
+        for(x=0;x<4;x++)
+        {
+            if(id[x] != ptr->pid[x])
+                break;
+                
+            if(x == 3)
+                return ptr;
+        }
+        
+
+        ptr = ptr->next;
+    }
+
+    return NULL;
+}
+
+//Checks in an item of given name by incrementing that product's count attribute
+struct product* checkin(struct product *head)
+{
+    struct product *ptr;
+
+    char entry[20];
+
+        printf("\n\r\n\rPlease enter product name:\n\r\n\r");
+
+        fflush(stdin);
+        scanf("%20s", &entry);
+        fflush(stdin);
+        if((ptr = findbyname(entry, head)) == NULL)
+            printf("\n\r\n\rNo such product!\n\r\n\r");
+        else
+            ptr->count++;
+
+        return head;
+}
+
+//Checks a product out of inventory, and gives a price 
+struct product* checkout(struct product *head, HX711 scale1)
+{
+    struct product *ptr;
+    char entry[20];
+    float weight = 3.5, price;
+    int x, y;
+ 
+
+    printf("\n\r\n\rPress:\n\r1:  rfid\n\r2:  manual\n\r\n\r");
+    
+    scanf("%20s", &entry);
+
+    if(strcmp("1", entry) == 0)
+    {
+        printf("\n\r\n\rPlease scan rfid:\n\r\n\r");
+        
+        flag1 = 0;
+        flag2 = 0;
+    
+        //Waits for rfid interrupt
+        while(flag2 == 0)
+        {
+            wait(0.5);
+            continue;
+        }
+        
+        if((ptr = findbyid(id, head)) == NULL)
+        {
+            printf("\n\r\n\rNo such item!\n\r\n\r");
+            flag1 = 1;
+            return head;
+        }
+
+        else if(ptr->count <= 0)
+        {
+            printf("\n\r\n\rOut of stock!\n\r\n\r");
+            flag1 = 1;
+            return head;        
+        }
+        
+    }
+    
+    else if(strcmp("2", entry) == 0)
+    {
+        printf("\n\r\n\rPlease enter product name:\n\r\n\r");
+        fflush(stdin);
+        scanf("%20s", &entry);
+        fflush(stdin);
+    
+
+        if((ptr = findbyname(entry, head)) == NULL)
+        {
+            printf("\n\r\n\rNo such item!\n\r\n\r");
+            return head;
+        }
+
+        else if(ptr->count <= 0)
+        {
+            printf("\n\r\n\rOut of stock!\n\r\n\r");
+            return head;
+        }
+    }
+    else
+    {
+        printf("\n\r\n\rIncorrect entry\n\r\n\r");
+        return head;
+    }
+
+    
+    weight = scale(scale1);
+    price = ptr->priceper * weight;
+    printf("\n\r\n\rPrice: %f\n\r\n\r", price);
+    ptr->count--;   
+
+
+    flag1 = 1;
+    return head;
+}
+
+//Temperature sensor rti isr
+void timer_temp_hum_isr()
+{
+    sensor.read();
+    Farenheit = sensor.getFahrenheit();
+    Humidity = sensor.getHumidity();
+    
+    if(Farenheit > maxtemp)
+    {
+        buzzer = 1;
+        LED = 0;
+    }
+    else
+    {
+       buzzer = 0;
+       LED = 1;
+    }
+}
+
+//Prints the current teperature
+void getstatus()
+{
+    printf("\n\rCurrent Temperature: %.2f F\n\r", Farenheit);
+}
+
+//Sets max alowable temperature
+void setmax()
+{
+    printf("\n\r\n\rEnter max temperature:  ");
+    scanf("%f", &maxtemp);
+    printf("\n\r\n\r");
+}
+
+struct product* findrfid(int rfid[4], struct product *head)
+{
+    FILE *fp;
+    char line[512], *token;
+    int x, flag = 0, match = 0;
+    struct product *newprod, *ptr;
+    uint8_t temp;
+
+    //Opens file pointer to input file
+    if((fp = fopen("/sd/rfiddata.txt", "r")) == NULL)
+        perror("Error");
+
+
+    //Reads in next line of file
+    while(fgets(line, 512, fp) != NULL)
+    {
+        match = 0;
+        
+        //Breaks csv line into tokens with comma as the delimiter 
+        token = strtok(line, ",");
+
+        for(x=0;x<4;x++)
+        {
+            if(rfid[x] != atoi(token))
+                break;
+              
+            //Goes to next token
+            token = strtok(NULL, ",");
+
+            if(x == 3)
+                match = 1;
+        }
+
+        if(match == 1)
+        {
+            
+            if((ptr = findbyname(token, head)) != NULL)
+            {
+                ptr->count++;
+                fclose(fp);
+                return head;
+            }
+            
+            //Allocates memory for the product
+            newprod = (struct product*)malloc(sizeof(struct product));
+
+            //Fills in new product attributes
+            strcpy(newprod->pname, token);
+            newprod->count = 1;
+            
+            //Goes to next token
+            token = strtok(NULL, ",");
+            newprod->priceper = atof(token);
+            
+            //Fills id
+            newprod->pid[0] = rfid[0];
+            newprod->pid[1] = rfid[1];
+            newprod->pid[2] = rfid[2];
+            newprod->pid[3] = rfid[3];
+
+            //Adds to list
+            newprod->next = head;
+            head = newprod;
+            break;
+        }
+
+        else
+        {
+            continue;
+        }
+
+    }
+
+    fclose(fp);
+    return head;
+}
\ No newline at end of file