[Assigner] Bugs fixed in handling mac addresses. Some other adjustments in Assigner module
This commit is contained in:
parent
61e2f9f6d0
commit
6c01ac8d38
@ -11,171 +11,53 @@
|
|||||||
#include "os/dev/serial-line.h"
|
#include "os/dev/serial-line.h"
|
||||||
#include "arch/cpu/cc26x0-cc13x0/dev/cc26xx-uart.h"
|
#include "arch/cpu/cc26x0-cc13x0/dev/cc26xx-uart.h"
|
||||||
|
|
||||||
#include "../msg.h"
|
#include "../common/supermarket_net.h"
|
||||||
#include "assigner_fun.h"
|
#include "assigner_fun.h"
|
||||||
|
|
||||||
#define LOG_MODULE "App"
|
#define LOG_MODULE "Assigner"
|
||||||
#define LOG_LEVEL LOG_LEVEL_INFO
|
#define LOG_LEVEL LOG_LEVEL_INFO
|
||||||
#define OPENING_PERIOD (300*CLOCK_SECOND)
|
#define OPENING_PERIOD (30*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");
|
PROCESS(assigner_process, "Assigner process");
|
||||||
AUTOSTART_PROCESSES(&assigner_process);
|
AUTOSTART_PROCESSES(&assigner_process);
|
||||||
|
|
||||||
cart* cart_list = NULL;
|
cart *cart_list = NULL;
|
||||||
static bool supermarket_open = true;
|
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
|
//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)
|
static void msg_recv(const void* data, uint16_t len, const linkaddr_t* source_address, const linkaddr_t* destination_address)
|
||||||
{
|
{
|
||||||
a_msg received_msg;
|
linkaddr_t src = *source_address;
|
||||||
linkaddr_t* src = (linkaddr_t*)source_address;
|
|
||||||
|
|
||||||
//if(len == sizeof((a_msg *)data))
|
LOG_INFO("Received data from: ");
|
||||||
|
LOG_INFO_LLADDR(&src);
|
||||||
memcpy (&received_msg, data, sizeof ((a_msg *)data));
|
printf("\n");
|
||||||
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*)¬ification;
|
|
||||||
nullnet_len = sizeof(notification);
|
|
||||||
NETSTACK_NETWORK.output(src);
|
|
||||||
}
|
|
||||||
LOG_INFO("New cart associated\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(received_msg.msg_type == BATTERY_STATUS_MSG)
|
enum message_type type = ((msg*)data)->msg_type;
|
||||||
{
|
switch(type)
|
||||||
//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");
|
case ASSOCIATION_REQUEST_MSG:
|
||||||
cart* c = cart_list;
|
handle_association_request(src,data);
|
||||||
while(c)
|
break;
|
||||||
{
|
case BATTERY_STATUS_MSG:
|
||||||
if(c->assigned)
|
handle_battery_msg(src,data);
|
||||||
printf("Customer id %d hasn't replaced his cart\n", (int)c->customer_id);
|
break;
|
||||||
c = c->next;
|
default:
|
||||||
}
|
printf("Invalide type! This message is not for the Assigner");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
printf("Supermarket is open!\n");
|
|
||||||
process_poll(&assigner_process);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PROCESS_THREAD(assigner_process, ev, data)
|
PROCESS_THREAD(assigner_process, ev, data)
|
||||||
{
|
{
|
||||||
|
|
||||||
static uint8_t customer_id;
|
static uint32_t customer_id;
|
||||||
static a_msg selection_msg;
|
static assign_msg selection_msg;
|
||||||
linkaddr_t* dest_addr;
|
linkaddr_t dest_addr;
|
||||||
static struct ctimer opening_timer;
|
static struct ctimer opening_timer;
|
||||||
|
|
||||||
PROCESS_BEGIN();
|
PROCESS_BEGIN();
|
||||||
@ -183,11 +65,12 @@ PROCESS_THREAD(assigner_process, ev, data)
|
|||||||
cc26xx_uart_set_input(serial_line_input_byte);
|
cc26xx_uart_set_input(serial_line_input_byte);
|
||||||
serial_line_init();
|
serial_line_init();
|
||||||
|
|
||||||
nullnet_set_input_callback(input_callback);
|
nullnet_set_input_callback(msg_recv);
|
||||||
|
|
||||||
ctimer_set(&opening_timer, OPENING_PERIOD, check, NULL);
|
ctimer_set(&opening_timer, OPENING_PERIOD, check, NULL);
|
||||||
|
|
||||||
printf("Supermarket is open!\n");
|
printf("Supermarket is open!\n");
|
||||||
|
leds_on(LEDS_GREEN);
|
||||||
printf("Welcome! Please, insert your card id\n");
|
printf("Welcome! Please, insert your card id\n");
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
@ -198,39 +81,44 @@ PROCESS_THREAD(assigner_process, ev, data)
|
|||||||
if(!supermarket_open)
|
if(!supermarket_open)
|
||||||
{
|
{
|
||||||
printf("Supermarket is closed! Please, come back tomorrow!\n");
|
printf("Supermarket is closed! Please, come back tomorrow!\n");
|
||||||
leds_on(LEDS_RED);
|
//leds_on(LEDS_RED);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf("Customer's id: %s\n", (char*)data);
|
printf("Customer's id: %s\n", (char*)data);
|
||||||
customer_id = atoi(data);
|
customer_id = atoi(data);
|
||||||
printf("id: %d\n", (int)customer_id);
|
//printf("id: %lu\n", (uint32_t)customer_id);
|
||||||
|
|
||||||
cart* cart_selected = cart_selection();
|
cart* cart_selected = cart_selection();
|
||||||
if(!cart_selected)
|
if(!cart_selected)
|
||||||
{
|
{
|
||||||
printf("No cart available!\n");
|
printf("No cart available!\n");
|
||||||
leds_on(LEDS_RED);
|
//leds_on(LEDS_RED);
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
cart_selected->assigned = true;
|
cart_selected->assigned = true;
|
||||||
cart_selected->customer_id = customer_id;
|
cart_selected->customer_id = (uint32_t)customer_id;
|
||||||
|
|
||||||
|
|
||||||
//send a notification to the selected cart with the associated customer id
|
//send a notification to selected cart with the associated customer id
|
||||||
selection_msg.msg_type = ASSIGNMENT_MSG;
|
selection_msg.msg_type = ASSIGNMENT_MSG;
|
||||||
selection_msg.customer_id = customer_id;
|
selection_msg.customer_id = customer_id;
|
||||||
|
|
||||||
dest_addr = cart_selected->cart_address;
|
dest_addr = cart_selected->cart_address;
|
||||||
|
|
||||||
|
LOG_INFO("Selected cart with address: ");
|
||||||
|
LOG_INFO_LLADDR(&dest_addr);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
nullnet_buf = (uint8_t*)&selection_msg;
|
nullnet_buf = (uint8_t*)&selection_msg;
|
||||||
nullnet_len = sizeof(selection_msg);
|
nullnet_len = sizeof(selection_msg);
|
||||||
NETSTACK_NETWORK.output(dest_addr);
|
NETSTACK_NETWORK.output(&dest_addr);
|
||||||
|
|
||||||
printf("Cart unblocked!\n");
|
printf("Cart unblocked!\n");
|
||||||
leds_on(LEDS_GREEN);
|
//leds_on(LEDS_GREEN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,26 +2,18 @@
|
|||||||
#include "net/netstack.h"
|
#include "net/netstack.h"
|
||||||
#include "net/nullnet/nullnet.h"
|
#include "net/nullnet/nullnet.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "sys/log.h"
|
#include "sys/log.h"
|
||||||
#include "sys/clock.h"
|
|
||||||
#include "sys/ctimer.h"
|
|
||||||
#include "os/dev/leds.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 "../common/supermarket_net.h"
|
||||||
#include "assigner_fun.h"
|
#include "assigner_fun.h"
|
||||||
|
|
||||||
#define LOG_MODULE "App"
|
#define LOG_MODULE "App"
|
||||||
#define LOG_LEVEL LOG_LEVEL_INFO
|
#define LOG_LEVEL LOG_LEVEL_INFO
|
||||||
|
|
||||||
extern cart* cart_list;
|
|
||||||
|
|
||||||
//struct cart cart;
|
//function invoked in order to look for the most charged cart to assign to the new arrived client
|
||||||
|
|
||||||
//function invoked in order to looking for the most charged cart to assign to the new arrived client
|
|
||||||
cart* cart_selection()
|
cart* cart_selection()
|
||||||
{
|
{
|
||||||
uint8_t highest_battery = 0;
|
uint8_t highest_battery = 0;
|
||||||
@ -29,7 +21,7 @@ cart* cart_selection()
|
|||||||
cart* current = cart_list;
|
cart* current = cart_list;
|
||||||
while(current)
|
while(current)
|
||||||
{
|
{
|
||||||
if(!current->assigned && current->battery_status > highest_battery)
|
if(!(current->assigned) && (current->battery_status > highest_battery))
|
||||||
{
|
{
|
||||||
highest_battery = current->battery_status;
|
highest_battery = current->battery_status;
|
||||||
selected = current;
|
selected = current;
|
||||||
@ -40,7 +32,7 @@ cart* cart_selection()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Insert a new cart in the list with the battery info just arrived
|
//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)
|
bool insert_cart(uint8_t new_req_battery, linkaddr_t mac_cart_addr)
|
||||||
{
|
{
|
||||||
cart* new_arrived_cart = (cart*)malloc(sizeof(cart));
|
cart* new_arrived_cart = (cart*)malloc(sizeof(cart));
|
||||||
if(new_arrived_cart==NULL)
|
if(new_arrived_cart==NULL)
|
||||||
@ -55,22 +47,25 @@ bool insert_cart(uint8_t new_req_battery, linkaddr_t* mac_cart_addr)
|
|||||||
new_arrived_cart->assigned = false;
|
new_arrived_cart->assigned = false;
|
||||||
new_arrived_cart->next = cart_list;
|
new_arrived_cart->next = cart_list;
|
||||||
cart_list = new_arrived_cart;
|
cart_list = new_arrived_cart;
|
||||||
|
LOG_INFO("Nuovo carrello inserito con mac_address: ");
|
||||||
|
LOG_INFO_LLADDR(&(new_arrived_cart->cart_address));
|
||||||
|
printf("\n");
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Upgrade the battery status of a cart
|
//Upgrade the battery status of a cart
|
||||||
bool bat_upgrade(linkaddr_t* src_cart_addr, uint8_t battery_level)
|
bool bat_update(linkaddr_t src_cart_addr, uint8_t battery_level)
|
||||||
{
|
{
|
||||||
cart* c = cart_list;
|
cart* c = cart_list;
|
||||||
//for(c; c && (c->cart_address != src_cart_addr); c = c->next);
|
//looking for cart->address = address of who sent the message with the battery
|
||||||
while(c)
|
while(c)
|
||||||
{
|
{
|
||||||
if(c->cart_address != src_cart_addr)
|
if(linkaddr_cmp(&c->cart_address,&src_cart_addr) == 0)
|
||||||
c = c->next;
|
c = c->next;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(!c)
|
if(!c)
|
||||||
{
|
{
|
||||||
LOG_INFO("Cart not associated yet!\n");
|
LOG_INFO("Cart not associated yet!\n");
|
||||||
@ -81,5 +76,61 @@ bool bat_upgrade(linkaddr_t* src_cart_addr, uint8_t battery_level)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handle_association_request(linkaddr_t src, const void* data)
|
||||||
|
{
|
||||||
|
//turn on the led for association msg received
|
||||||
|
assoc_req_msg ar_msg;
|
||||||
|
memcpy (&ar_msg, data, sizeof ((assoc_req_msg *)data));
|
||||||
|
if(insert_cart(ar_msg.battery_percentage, src))
|
||||||
|
{
|
||||||
|
assoc_reply_msg notification;
|
||||||
|
notification.msg_type = ASSOCIATION_REPLY_MSG;
|
||||||
|
LOG_INFO("\n");
|
||||||
|
LOG_INFO("Sending acknowledgment of successfull association\n");
|
||||||
|
|
||||||
|
nullnet_buf = (uint8_t*)¬ification;
|
||||||
|
nullnet_len = sizeof(notification);
|
||||||
|
NETSTACK_NETWORK.output(&src);
|
||||||
|
}
|
||||||
|
LOG_INFO("New cart associated\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_battery_msg(linkaddr_t src, const void* data)
|
||||||
|
{
|
||||||
|
//turn on the led for battery msg received
|
||||||
|
battery_msg bt_msg;
|
||||||
|
memcpy (&bt_msg, data, sizeof ((battery_msg *)data));
|
||||||
|
if(bat_update(src, bt_msg.battery_percentage))
|
||||||
|
{
|
||||||
|
LOG_INFO("Battery level upgraded of ");
|
||||||
|
LOG_INFO_LLADDR(&src);
|
||||||
|
printf("\n");
|
||||||
|
printf("Battery: %d\n", bt_msg.battery_percentage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//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;
|
||||||
|
leds_toggle(LEDS_ALL);
|
||||||
|
if(!supermarket_open)
|
||||||
|
{
|
||||||
|
printf("Supermarket is closed!\n");
|
||||||
|
cart* c = cart_list;
|
||||||
|
//the assigner checks if all the carts are back in their place or are still out
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -5,23 +5,24 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "sys/log.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
|
typedef struct cart
|
||||||
{
|
{
|
||||||
linkaddr_t* cart_address;
|
linkaddr_t cart_address;
|
||||||
uint8_t battery_status;
|
uint8_t battery_status;
|
||||||
bool assigned;
|
bool assigned;
|
||||||
uint32_t customer_id;
|
uint32_t customer_id;
|
||||||
struct cart *next;
|
struct cart *next;
|
||||||
}cart;
|
}cart;
|
||||||
|
|
||||||
|
extern bool supermarket_open;
|
||||||
|
extern cart* cart_list;
|
||||||
|
extern struct process assigner_process;
|
||||||
|
|
||||||
cart* cart_selection();
|
cart* cart_selection();
|
||||||
bool insert_cart(uint8_t new_req_battery, linkaddr_t* mac_cart_addr);
|
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);
|
bool bat_update(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 handle_association_request(linkaddr_t src, const void* data);
|
||||||
//void check(void *ptr);
|
void handle_battery_msg(linkaddr_t src, const void* data);
|
||||||
|
void check(void *ptr);
|
||||||
|
Loading…
Reference in New Issue
Block a user