[cart] update with new struct names

This commit is contained in:
giomba 2019-04-12 16:44:25 +02:00
commit 35555fad78
9 changed files with 497 additions and 88 deletions

14
project/Assigner/Makefile Normal file
View File

@ -0,0 +1,14 @@
CONTIKI_PROJECT = assigner
PLATFORMS_ONLY = cc26x0-cc13x0
all: $(CONTIKI_PROJECT)
CONTIKI = ../..
PROJECT_SOURCEFILES += assigner_fun.c
PLATFORMS_EXCLUDE = nrf52dk
#use this to enable TSCH: MAKE_MAC = MAKE_MAC_TSCH
MAKE_MAC ?= MAKE_MAC_CSMA
MAKE_NET = MAKE_NET_NULLNET
include $(CONTIKI)/Makefile.include

244
project/Assigner/assigner.c Normal file
View File

@ -0,0 +1,244 @@
#include "contiki.h"
#include "net/netstack.h"
#include "net/nullnet/nullnet.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sys/log.h"
#include "sys/clock.h"
#include "sys/ctimer.h"
#include "os/dev/leds.h"
#include "os/dev/serial-line.h"
#include "arch/cpu/cc26x0-cc13x0/dev/cc26xx-uart.h"
#include "../msg.h"
#include "assigner_fun.h"
#define LOG_MODULE "App"
#define LOG_LEVEL LOG_LEVEL_INFO
#define OPENING_PERIOD (300*CLOCK_SECOND)
/*typedef struct cart
{
linkaddr_t* cart_address;
uint8_t battery_status;
bool assigned;
uint32_t customer_id;
struct cart *next;
}cart;*/
/*typedef struct assigner_msg
{
enum message_type msg_type;
//assoc_req_msg request;
//assoc_reply_msg reply;
uint8_t battery_percentage;
uint32_t customer_id;
}assigner_msg;
*/
PROCESS(assigner_process, "Assigner process");
AUTOSTART_PROCESSES(&assigner_process);
cart* cart_list = NULL;
static bool supermarket_open = true;
/*
//function invoked in order to looking for the most charged cart to assign to the new arrived client
static cart* cart_selection()
{
uint8_t highest_battery = 0;
cart* selected = NULL;
cart* current = cart_list;
while(current)
{
if(!current->assigned && current->battery_status > highest_battery)
{
highest_battery = current->battery_status;
selected = current;
}
current = current->next;
}
return selected;
}
//Insert a new cart in the list with the battery info just arrived
static bool insert_cart(uint8_t new_req_battery, linkaddr_t* mac_cart_addr)
{
cart* new_arrived_cart = (cart*)malloc(sizeof(cart));
if(new_arrived_cart==NULL)
{
printf("Association Failed");
return false;
}
else
{
new_arrived_cart->cart_address = mac_cart_addr;
new_arrived_cart->battery_status = new_req_battery;
new_arrived_cart->assigned = false;
new_arrived_cart->next = cart_list;
cart_list = new_arrived_cart;
}
return true;
}
//Upgrade the battery status of a cart
static bool bat_upgrade(linkaddr_t* src_cart_addr, uint8_t battery_level)
{
cart* c = cart_list;
//for(c; c && (c->cart_address != src_cart_addr); c = c->next);
while(c)
{
if(c->cart_address != src_cart_addr)
c = c->next;
else
break;
}
if(!c)
{
LOG_INFO("Cart not associated yet!\n");
return false;
}
c->battery_status = battery_level;
c->assigned = false; //a battery status is sent only when the cart is in his place, not with a client. So if the cart was out and the the battery status is received, it is now come back in place.
return true;
}
*/
//Handle the incoming messages, according to the msg_type
static void input_callback(const void* data, uint16_t len, const linkaddr_t* source_address, const linkaddr_t* destination_address)
{
a_msg received_msg;
linkaddr_t* src = (linkaddr_t*)source_address;
//if(len == sizeof((a_msg *)data))
memcpy (&received_msg, data, sizeof ((a_msg *)data));
LOG_INFO("Received data from: ");
LOG_INFO_LLADDR(source_address);
LOG_INFO("\n");
if(received_msg.msg_type == ASSOCIATION_REQUEST_MSG)
{
//accendere led blu (x mes broadcast)
if(insert_cart(received_msg.battery_percentage, src))
{
a_msg notification;
notification.msg_type = ASSOCIATION_REPLY_MSG;
LOG_INFO("Sending acknowledgment of successfull association\n");
nullnet_buf = (uint8_t*)&notification;
nullnet_len = sizeof(notification);
NETSTACK_NETWORK.output(src);
}
LOG_INFO("New cart associated\n");
}
if(received_msg.msg_type == BATTERY_STATUS_MSG)
{
//accendere led purple (mex unicast)
if(bat_upgrade(src, received_msg.battery_percentage))
{
LOG_INFO("Battery level upgraded of ");
LOG_INFO_LLADDR(src);
LOG_INFO("\n");
}
}
}
//callback function for the ctimer that checks if all the carts have been replaced when the supermarket close
void check(void *ptr)
{
supermarket_open = !supermarket_open;
if(!supermarket_open)
{
printf("Supermarket closed\n");
cart* c = cart_list;
while(c)
{
if(c->assigned)
printf("Customer id %d hasn't replaced his cart\n", (int)c->customer_id);
c = c->next;
}
}
else
printf("Supermarket is open!\n");
process_poll(&assigner_process);
}
PROCESS_THREAD(assigner_process, ev, data)
{
static uint8_t customer_id;
static a_msg selection_msg;
linkaddr_t* dest_addr;
static struct ctimer opening_timer;
PROCESS_BEGIN();
cc26xx_uart_set_input(serial_line_input_byte);
serial_line_init();
nullnet_set_input_callback(input_callback);
ctimer_set(&opening_timer, OPENING_PERIOD, check, NULL);
printf("Supermarket is open!\n");
printf("Welcome! Please, insert your card id\n");
while (true)
{
PROCESS_WAIT_EVENT();
if(ev == serial_line_event_message)
{
if(!supermarket_open)
{
printf("Supermarket is closed! Please, come back tomorrow!\n");
leds_on(LEDS_RED);
}
else
{
printf("Customer's id: %s\n", (char*)data);
customer_id = atoi(data);
printf("id: %d\n", (int)customer_id);
cart* cart_selected = cart_selection();
if(!cart_selected)
{
printf("No cart available!\n");
leds_on(LEDS_RED);
}
else
{
cart_selected->assigned = true;
cart_selected->customer_id = customer_id;
//send a notification to the selected cart with the associated customer id
selection_msg.msg_type = ASSIGNMENT_MSG;
selection_msg.customer_id = customer_id;
dest_addr = cart_selected->cart_address;
nullnet_buf = (uint8_t*)&selection_msg;
nullnet_len = sizeof(selection_msg);
NETSTACK_NETWORK.output(dest_addr);
printf("Cart unblocked!\n");
leds_on(LEDS_GREEN);
}
}
}
else if(ev == PROCESS_EVENT_POLL)
ctimer_reset(&opening_timer);
}
PROCESS_END();
}

View File

@ -0,0 +1,85 @@
#include "contiki.h"
#include "net/netstack.h"
#include "net/nullnet/nullnet.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sys/log.h"
#include "sys/clock.h"
#include "sys/ctimer.h"
#include "os/dev/leds.h"
#include "os/dev/serial-line.h"
#include "arch/cpu/cc26x0-cc13x0/dev/cc26xx-uart.h"
#include "../msg.h"
#include "assigner_fun.h"
#define LOG_MODULE "App"
#define LOG_LEVEL LOG_LEVEL_INFO
extern cart* cart_list;
//struct cart cart;
//function invoked in order to looking for the most charged cart to assign to the new arrived client
cart* cart_selection()
{
uint8_t highest_battery = 0;
cart* selected = NULL;
cart* current = cart_list;
while(current)
{
if(!current->assigned && current->battery_status > highest_battery)
{
highest_battery = current->battery_status;
selected = current;
}
current = current->next;
}
return selected;
}
//Insert a new cart in the list with the battery info just arrived
bool insert_cart(uint8_t new_req_battery, linkaddr_t* mac_cart_addr)
{
cart* new_arrived_cart = (cart*)malloc(sizeof(cart));
if(new_arrived_cart==NULL)
{
printf("Association Failed");
return false;
}
else
{
new_arrived_cart->cart_address = mac_cart_addr;
new_arrived_cart->battery_status = new_req_battery;
new_arrived_cart->assigned = false;
new_arrived_cart->next = cart_list;
cart_list = new_arrived_cart;
}
return true;
}
//Upgrade the battery status of a cart
bool bat_upgrade(linkaddr_t* src_cart_addr, uint8_t battery_level)
{
cart* c = cart_list;
//for(c; c && (c->cart_address != src_cart_addr); c = c->next);
while(c)
{
if(c->cart_address != src_cart_addr)
c = c->next;
else
break;
}
if(!c)
{
LOG_INFO("Cart not associated yet!\n");
return false;
}
c->battery_status = battery_level;
c->assigned = false; //a battery status is sent only when the cart is in his place, not with a client. So if the cart was out and the the battery status is received, it is now come back in place.
return true;
}

View File

@ -0,0 +1,27 @@
#include "contiki.h"
#include "net/netstack.h"
#include "net/nullnet/nullnet.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sys/log.h"
#include "sys/clock.h"
#include "sys/ctimer.h"
#include "os/dev/leds.h"
#include "os/dev/serial-line.h"
#include "arch/cpu/cc26x0-cc13x0/dev/cc26xx-uart.h"
typedef struct cart
{
linkaddr_t* cart_address;
uint8_t battery_status;
bool assigned;
uint32_t customer_id;
struct cart *next;
}cart;
cart* cart_selection();
bool insert_cart(uint8_t new_req_battery, linkaddr_t* mac_cart_addr);
bool bat_upgrade(linkaddr_t* src_cart_addr, uint8_t battery_level);
//static void input_callback(const void* data, uint16_t len, const linkaddr_t* source_address, const linkaddr_t* destination_address);
//void check(void *ptr);

View File

@ -0,0 +1,43 @@
/*
* Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*---------------------------------------------------------------------------*/
#ifndef PROJECT_CONF_H_
#define PROJECT_CONF_H_
/*---------------------------------------------------------------------------*/
/* Enable the ROM bootloader */
#define CCXXWARE_CONF_ROM_BOOTLOADER_ENABLE 1
/*---------------------------------------------------------------------------*/
/* Change to match your configuration */
#define IEEE802154_CONF_PANID 0xABCD
#define IEEE802154_CONF_DEFAULT_CHANNEL 25
#define RF_BLE_CONF_ENABLED 1
/*---------------------------------------------------------------------------*/
#endif /* PROJECT_CONF_H_ */
/*---------------------------------------------------------------------------*/

View File

@ -24,7 +24,7 @@ void net_recv(const void* data, uint16_t len, const linkaddr_t* src, const linka
LOG_INFO("Received %d bytes from ", len); LOG_INFO_LLADDR(src); LOG_INFO("\n");
switch ( ((struct Msg*)data)->type ) {
switch ( ((msg*)data)->msg_type ) {
case ASSOCIATION_REPLY_MSG:
event = CART_EVENT_ASSOCIATED;
process_post(&cart_main_process, PROCESS_EVENT_MSG, NULL);

View File

@ -10,9 +10,9 @@ void s_not_associated(process_event_t ev, process_data_t data) {
/* at time expiration, send broadcast message to request association with assigner */
if (etimer_expired(&broadcast_timer)) {
printf("[I] Sending association request msg\n");
struct Msg msg;
msg.type = ASSOCIATION_REQUEST_MSG;
net_send(&msg, sizeof(msg), NULL);
msg m;
m.msg_type = ASSOCIATION_REQUEST_MSG;
net_send(&m, sizeof(m), NULL);
etimer_reset(&broadcast_timer);
}
}
@ -28,16 +28,16 @@ void s_associated(process_event_t ev, process_data_t data) {
if (ev == PROCESS_EVENT_TIMER) {
/* now send battery level */
printf("[I] Sending battery level\n");
struct MsgBatteryStatus msg;
msg.type = BATTERY_STATUS_MSG;
msg.battery_percentage = 77;
net_send(&msg, sizeof(msg), &assigner_address);
struct battery_msg m;
m.msg_type = BATTERY_STATUS_MSG;
m.battery_percentage = 77;
net_send(&m, sizeof(m), &assigner_address);
etimer_reset(&broadcast_timer);
}
if (ev == PROCESS_EVENT_MSG && *((enum CartEvent*)data) == CART_EVENT_ASSIGNED) {
/* cart has been assigned to a new customer */
printf("[I] Assigned to customer\n");
customer_id = ((MsgAssignment*)pkt.data)->customer_id;
customer_id = ((assign_msg*)pkt.data)->customer_id;
status = SHOPPING;
}

View File

@ -10,55 +10,13 @@
#include "arch/cpu/cc26x0-cc13x0/dev/cc26xx-uart.h"
#include <stdlib.h>
#include "../common/supermarket_net.h"
#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
{
uint8_t n_products;
uint8_t customer_id;
linkaddr_t* address;
}basket_msg;
typedef struct user_invoice
{
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
{
uint8_t customer_id;
}cash_out_msg;
typedef struct product_msg{
uint8_t customer_id;
uint8_t product_id;
float prize;
}product_msg;
typedef struct msg{
enum message_type msg_type;
cash_out_msg cash_out;
product_msg product;
basket_msg basket;
}msg;
PROCESS(cassa_main_process, "Cassa process");
AUTOSTART_PROCESSES(&cassa_main_process);
@ -104,12 +62,13 @@ static void input_callback(const void* data, uint16_t len, const linkaddr_t* sou
//we need to receive an additional message to start the process of receiving the products because if we start receiving the products immediately
//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) {
basket_msg *basket = (basket_msg*) (&received_msg);
uint8_t index = index_free_spot(invoices);
if (index != -1 ) {
invoices[index].n_prods = received_msg.basket.n_products;
invoices[index].n_prods = basket->n_products;
invoices[index].total_sum = 0;
invoices[index].customer_id = received_msg.basket.customer_id;
invoices[index].address_basket = received_msg.basket.address;
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;
@ -126,10 +85,11 @@ static void input_callback(const void* data, uint16_t len, const linkaddr_t* sou
printf("Reached max number of customers");
}
if (received_msg.msg_type == PRODUCT_MSG) {
uint8_t index = invoice_index(received_msg.product.customer_id, invoices);
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 += received_msg.product.prize;
invoices[index].total_sum += product->prize;
invoices[index].n_prods--;
}
if (invoices[index].n_prods == 0) {
@ -146,7 +106,7 @@ PROCESS_THREAD(cassa_main_process, ev, data) {
PROCESS_BEGIN();
static uint8_t customer_id;
static msg bro_customer_id;
static cash_out_msg bro_customer_id;
cc26xx_uart_set_input(serial_line_input_byte);
serial_line_init();
@ -165,7 +125,7 @@ PROCESS_THREAD(cassa_main_process, ev, data) {
printf("id: %d\n", (int)customer_id);
bro_customer_id.msg_type = CASH_OUT_MSG;
bro_customer_id.cash_out.customer_id = customer_id;
bro_customer_id.customer_id = customer_id;
LOG_INFO("Sending BROADCAST customer id: %d\n", (int)customer_id);
LOG_INFO_LLADDR(NULL);

View File

@ -1,46 +1,82 @@
#ifndef SUPERMARKET_NET_H
#define SUPERMARKET_NET_H
enum MsgType {
enum message_type {
ASSOCIATION_REQUEST_MSG,
ASSOCIATION_REPLY_MSG,
BATTERY_STATUS_MSG,
ASSIGNMENT_MSG,
CASH_OUT_MSG,
PRODUCT_MSG,
CASHOUT_MSG,
ITEM_ELEM_MSG
ITEM_ELEM_MSG,
BASKET_MSG,
START_OF_LIST_PRODUCTS_MSG
};
struct Msg {
enum MsgType type;
uint8_t test;
};
typedef struct msg {
enum message_type msg_type;
}msg;
struct MsgBatteryStatus {
enum MsgType type;
uint8_t battery_percentage;
};
typedef struct assoc_req_msg
{
enum message_type msg_type;
uint8_t battery_percentage;
struct MsgAssignment {
enum MsgType type;
uint32_t customer_id;
};
}assoc_req_msg;
struct MsgProduct {
enum MsgType type;
uint32_t product_id;
float price;
};
struct MsgCashOut {
enum MsgType type;
uint32_t customer_id;
};
typedef struct assoc_reply_msg
{
enum message_type msg_type;
}assoc_reply_msg;
struct MsgItemElem {
enum MsgType type;
float price;
bool last;
};
typedef struct battery_msg
{
enum message_type msg_type;
uint8_t battery_percentage;
}battery_msg;
typedef struct assign_msg
{
enum message_type msg_type;
uint32_t customer_id;
}assign_msg;
typedef struct basket_msg
{
enum message_type msg_type;
uint8_t n_products;
uint8_t customer_id;
}basket_msg;
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 user_invoice
{
uint8_t n_prods;
float total_sum;
uint8_t customer_id;
uint8_t empty;
}user_invoice;
#endif