nes-proj/project/Natalia/cassa.c

149 lines
4.1 KiB
C
Raw Normal View History

2019-04-06 15:34:46 +00:00
#include "net/netstack.h"
#include "net/nullnet/nullnet.h"
#include <stdio.h>
#include <string.h>
#include "sys/log.h"
#define LOG_MODULE "App"
#define LOG_LEVEL LOG_LEVEL_INFO
#include "os/dev/serial-line.h"
#include "arch/cpu/cc26x0-cc13x0/dev/cc26xx-uart.h"
#include <stdlib.h>
2019-04-12 14:30:01 +00:00
#include "../common/supermarket_net.h"
2019-04-06 15:34:46 +00:00
#define MAX_CUSTOMERS 20
typedef struct user_invoice
{
uint8_t n_prods;
2019-04-16 13:49:56 +00:00
uint32_t total_sum;
uint32_t customer_id;
uint8_t empty;
linkaddr_t address_basket;
}user_invoice;
2019-04-06 15:34:46 +00:00
PROCESS(cassa_main_process, "Cassa process");
AUTOSTART_PROCESSES(&cassa_main_process);
static uint8_t invoice_index(uint32_t customer_id, user_invoice invoices[])
2019-04-06 15:34:46 +00:00
{
uint8_t i = 0;
for(i = 0; i< MAX_CUSTOMERS;i++) {
if (invoices[i].empty==0 && customer_id == invoices[i].customer_id)
2019-04-06 15:34:46 +00:00
return i;
2019-04-06 15:34:46 +00:00
}
return -1;
}
static uint8_t index_free_spot(user_invoice invoices[])
{
uint8_t i = 0;
for(i = 0;i<MAX_CUSTOMERS;i++) {
if (invoices[i].empty == 1) {
return i;
}
}
return -1;
}
static void input_callback(const void* data, uint16_t len, const linkaddr_t* source_address, const linkaddr_t* destination_address)
2019-04-06 15:34:46 +00:00
{
msg received_msg;
2019-04-06 15:34:46 +00:00
static user_invoice invoices[MAX_CUSTOMERS];
// if (len == sizeof(*data)) {
memcpy (&received_msg, data, sizeof(received_msg));
LOG_INFO("Received data ");
2019-04-06 15:34:46 +00:00
LOG_INFO_LLADDR(source_address); //this is the link layer address
LOG_INFO("\n");
//we need to receive an additional message to start the process of receiving the products because if we start receiving the products immediately
2019-04-06 15:34:46 +00:00
//in the case of parallel processes we wouldnt know to what client and what basket that product is assosiated with
if (received_msg.msg_type == BASKET_MSG) {
2019-04-12 14:20:00 +00:00
basket_msg *basket = (basket_msg*) (&received_msg);
2019-04-06 15:34:46 +00:00
uint8_t index = index_free_spot(invoices);
if (index != -1 ) {
2019-04-12 14:20:00 +00:00
invoices[index].n_prods = basket->n_products;
2019-04-06 15:34:46 +00:00
invoices[index].total_sum = 0;
2019-04-12 14:20:00 +00:00
invoices[index].customer_id = basket->customer_id;
memcpy(&invoices[index].address_basket, source_address, sizeof(linkaddr_t));
// invoices[index].address_basket = source_address;
2019-04-06 15:34:46 +00:00
msg start_sending_list;
start_sending_list.msg_type = START_OF_LIST_PRODUCTS_MSG;
nullnet_buf = (uint8_t*)&start_sending_list;
LOG_INFO("Sending acknowledgment to start sending list of products to ");
2019-04-16 13:49:56 +00:00
LOG_INFO_LLADDR(&(invoices[index].address_basket));
2019-04-06 15:34:46 +00:00
nullnet_len = sizeof(start_sending_list);
NETSTACK_NETWORK.output(&(invoices[index].address_basket));
2019-04-06 15:34:46 +00:00
} else
printf("Reached max number of customers\n");
2019-04-06 15:34:46 +00:00
}
if (received_msg.msg_type == PRODUCT_MSG) {
2019-04-12 14:20:00 +00:00
product_msg *product = (product_msg*)(&received_msg);
2019-04-16 13:55:40 +00:00
printf("Received id: %d, price %d\n", (int)product->product_id, (int)product->price);
2019-04-12 14:20:00 +00:00
uint8_t index = invoice_index(product->customer_id, invoices);
2019-04-06 15:34:46 +00:00
if (index != -1) {
if (invoices[index].n_prods > 0) {
invoices[index].total_sum += product->price;
2019-04-06 15:34:46 +00:00
invoices[index].n_prods--;
}
if (invoices[index].n_prods == 0) {
2019-04-16 13:55:40 +00:00
printf("Total sum for client %d is %d\n", (int)invoices[index].customer_id, (int)invoices[index].total_sum);
2019-04-06 15:34:46 +00:00
invoices[index].empty = 1;
}
}else
printf("Customer with that id is not associated to any basket!\n");
2019-04-06 15:34:46 +00:00
}
// }
2019-04-06 15:34:46 +00:00
}
PROCESS_THREAD(cassa_main_process, ev, data) {
PROCESS_BEGIN();
static uint32_t customer_id;
2019-04-12 14:20:00 +00:00
static cash_out_msg bro_customer_id;
2019-04-06 15:34:46 +00:00
cc26xx_uart_set_input(serial_line_input_byte);
serial_line_init();
nullnet_buf = (uint8_t*)&bro_customer_id;
nullnet_set_input_callback(input_callback); //this should be moved down?
2019-04-16 13:49:56 +00:00
2019-04-06 15:34:46 +00:00
while (true) {
2019-04-16 13:49:56 +00:00
printf("Dear customer, insert your card id\n");
2019-04-06 15:34:46 +00:00
PROCESS_WAIT_EVENT_UNTIL(ev == serial_line_event_message);
printf("Customer's id: %s\n", (char*)data);
customer_id = atoi(data);
printf("id: %d\n", (int)customer_id);
bro_customer_id.msg_type = CASH_OUT_MSG;
bro_customer_id.customer_id = customer_id;
2019-04-06 15:34:46 +00:00
LOG_INFO("Sending BROADCAST customer id: %d\n", (int)customer_id);
LOG_INFO_LLADDR(NULL);
LOG_INFO_("\n");
nullnet_len = sizeof(bro_customer_id);
NETSTACK_NETWORK.output(NULL);
}
PROCESS_END();
}