#include "net/netstack.h" #include "net/nullnet/nullnet.h" #include #include #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 #define MAX_CUSTOMERS 20 enum message_type{CASH_OUT_MSG, PRODUCT_MSG, ITEM_ELEM_MSG, BASKET_MSG, START_OF_LIST_PRODUCTS_MSG}; typedef struct basket_msg { enum message_type msg_type; uint8_t n_products; uint8_t customer_id; linkaddr_t* address; }basket_msg; typedef struct user_invoice { enum message_type msg_type; uint8_t n_prods; float total_sum; uint8_t customer_id; linkaddr_t* address_basket; uint8_t empty; }user_invoice; typedef struct cash_out_msg { enum message_type msg_type; uint8_t customer_id; }cash_out_msg; typedef struct product_msg{ enum message_type msg_type; uint8_t customer_id; uint8_t product_id; float prize; }product_msg; typedef struct msg{ enum message_type msg_type; }msg; PROCESS(cassa_main_process, "Cassa process"); AUTOSTART_PROCESSES(&cassa_main_process); static uint8_t invoice_index(uint32_t customer_id, user_invoice invoices[]) { uint8_t i = 0; for(i = 0; i< MAX_CUSTOMERS;i++) { if (invoices[i].empty==0 && customer_id == invoices[i].customer_id) return i; } return -1; } static uint8_t index_free_spot(user_invoice invoices[]) { uint8_t i = 0; for(i = 0;in_products; invoices[index].total_sum = 0; invoices[index].customer_id = basket->customer_id; invoices[index].address_basket = basket->address; 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"); LOG_INFO_("\n"); nullnet_len = sizeof(start_sending_list); NETSTACK_NETWORK.output((invoices[index].address_basket)); } else printf("Reached max number of customers"); } if (received_msg.msg_type == PRODUCT_MSG) { product_msg *product = (product_msg*)(&received_msg); uint8_t index = invoice_index(product->customer_id, invoices); if (index != -1) { if (invoices[index].n_prods > 0) { invoices[index].total_sum += product->prize; invoices[index].n_prods--; } if (invoices[index].n_prods == 0) { printf("Total sum for client %d is %f\n", (int)invoices[index].customer_id, invoices[index].total_sum); invoices[index].empty = 1; } }else printf("Customer with that id is not associated to any basket!"); } } } PROCESS_THREAD(cassa_main_process, ev, data) { PROCESS_BEGIN(); static uint8_t customer_id; static cash_out_msg bro_customer_id; 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? printf("Dear customer, insert your card id\n"); while (true) { 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; 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(); }