Merge branch 'master' of git.giomba.it:giomba/nes-proj
This commit is contained in:
commit
f8fe30f0ef
14
project/Assigner/Makefile
Normal file
14
project/Assigner/Makefile
Normal 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
244
project/Assigner/assigner.c
Normal 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*)¬ification;
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
85
project/Assigner/assigner_fun.c
Normal file
85
project/Assigner/assigner_fun.c
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
27
project/Assigner/assigner_fun.h
Normal file
27
project/Assigner/assigner_fun.h
Normal 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);
|
43
project/Assigner/project-conf.h
Normal file
43
project/Assigner/project-conf.h
Normal 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_ */
|
||||||
|
/*---------------------------------------------------------------------------*/
|
14
project/Giomba/Makefile
Normal file
14
project/Giomba/Makefile
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
CONTIKI_PROJECT = cart
|
||||||
|
PROJECT_SOURCEFILES += sendrecv.c status.c
|
||||||
|
PLATFORMS_ONLY = cc26x0-cc13x0
|
||||||
|
|
||||||
|
all: $(CONTIKI_PROJECT)
|
||||||
|
|
||||||
|
CONTIKI = ../..
|
||||||
|
|
||||||
|
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
|
63
project/Giomba/cart.c
Normal file
63
project/Giomba/cart.c
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "os/dev/leds.h"
|
||||||
|
#include "batmon-sensor.h"
|
||||||
|
|
||||||
|
#include "../common/supermarket_net.h"
|
||||||
|
#include "event.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "sendrecv.h"
|
||||||
|
#include "status.h"
|
||||||
|
|
||||||
|
//static linkaddr_t destination_address = {{ 0x00, 0x12, 0x4b, 0x00, 0x0f, 0x8f, 0x18, 0x11 }};
|
||||||
|
|
||||||
|
|
||||||
|
PROCESS(cart_main_process, "Cart Process");
|
||||||
|
AUTOSTART_PROCESSES(&cart_main_process);
|
||||||
|
|
||||||
|
PROCESS_THREAD(cart_main_process, ev, data) {
|
||||||
|
PROCESS_BEGIN();
|
||||||
|
// SENSORS_ACTIVATE(batmon_sensor);
|
||||||
|
|
||||||
|
/*** Variables initialization ***/
|
||||||
|
|
||||||
|
status = NOT_ASSOCIATED;
|
||||||
|
etimer_set(&broadcast_timer, 10 * CLOCK_SECOND);
|
||||||
|
|
||||||
|
/*** Subsystem initialization ***/
|
||||||
|
net_init();
|
||||||
|
|
||||||
|
/* START */
|
||||||
|
printf("Hello! I'm the cart.\n");
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
PROCESS_WAIT_EVENT();
|
||||||
|
|
||||||
|
switch(status) {
|
||||||
|
case NOT_ASSOCIATED:
|
||||||
|
s_not_associated(ev, data);
|
||||||
|
break;
|
||||||
|
break;
|
||||||
|
case ASSOCIATED: break;
|
||||||
|
case SHOPPING: break;
|
||||||
|
case CASHOUT: break;
|
||||||
|
default: status = NOT_ASSOCIATED; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (ev == PROCESS_EVENT_TIMER) {
|
||||||
|
printf("Transmitting %d...\n", counter);
|
||||||
|
sprintf(message, "#%d Hello. It's me. -- by Adele", counter);
|
||||||
|
nullnet_len = strlen(message) + 1;
|
||||||
|
counter++;
|
||||||
|
NETSTACK_NETWORK.output(&destination_address);
|
||||||
|
etimer_reset(&my_timer);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
PROCESS_END();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
8
project/Giomba/event.h
Normal file
8
project/Giomba/event.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef EVENT_H
|
||||||
|
#define EVENT_H
|
||||||
|
|
||||||
|
enum CartEvent {
|
||||||
|
CART_EVENT_ASSOCIATED
|
||||||
|
} event;
|
||||||
|
|
||||||
|
#endif
|
9
project/Giomba/log.h
Normal file
9
project/Giomba/log.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef LOG_H
|
||||||
|
#define LOG_H
|
||||||
|
|
||||||
|
#include "sys/log.h"
|
||||||
|
|
||||||
|
#define LOG_MODULE "Cart"
|
||||||
|
#define LOG_LEVEL LOG_LEVEL_INFO
|
||||||
|
|
||||||
|
#endif
|
14
project/Giomba/project-conf.h
Normal file
14
project/Giomba/project-conf.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#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_ */
|
||||||
|
/*---------------------------------------------------------------------------*/
|
43
project/Giomba/sendrecv.c
Normal file
43
project/Giomba/sendrecv.c
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#include "sendrecv.h"
|
||||||
|
|
||||||
|
struct MacPkt pkt;
|
||||||
|
|
||||||
|
uint8_t net_buffer[256];
|
||||||
|
|
||||||
|
void net_init() {
|
||||||
|
nullnet_buf = net_buffer;
|
||||||
|
nullnet_set_input_callback(net_recv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void net_recv(const void* data, uint16_t len, const linkaddr_t* src, const linkaddr_t* dst) {
|
||||||
|
/* discard too long packet */
|
||||||
|
if (len > 128) {
|
||||||
|
LOG_INFO("[WW] dropping too long packet %d\n", len);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fill packet to pass to upper processing layer */
|
||||||
|
memcpy(pkt.data, data, len);
|
||||||
|
pkt.len = len;
|
||||||
|
pkt.src = *src;
|
||||||
|
pkt.dst = *dst;
|
||||||
|
|
||||||
|
LOG_INFO("Received %d bytes from ", len); LOG_INFO_LLADDR(src); LOG_INFO("\n");
|
||||||
|
|
||||||
|
switch ( ((struct Msg*)data)->type ) {
|
||||||
|
case ASSOCIATION_REPLY_MSG:
|
||||||
|
event = CART_EVENT_ASSOCIATED;
|
||||||
|
process_post(&cart_main_process, PROCESS_EVENT_MSG, NULL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG_INFO("[W] message type unknown\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void net_send(const void* data, uint16_t len, const linkaddr_t* dst) {
|
||||||
|
memcpy(net_buffer, data, len);
|
||||||
|
nullnet_len = len;
|
||||||
|
NETSTACK_NETWORK.output(dst);
|
||||||
|
}
|
||||||
|
|
32
project/Giomba/sendrecv.h
Normal file
32
project/Giomba/sendrecv.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#ifndef SENDRECV_H
|
||||||
|
#define SENDRECV_H
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "net/netstack.h"
|
||||||
|
#include "net/nullnet/nullnet.h"
|
||||||
|
#include "os/net/linkaddr.h"
|
||||||
|
|
||||||
|
#include "../common/supermarket_net.h"
|
||||||
|
|
||||||
|
#include "event.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
|
struct MacPkt {
|
||||||
|
char data[128];
|
||||||
|
uint16_t len;
|
||||||
|
linkaddr_t src;
|
||||||
|
linkaddr_t dst;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern void* ResetISR;
|
||||||
|
|
||||||
|
extern struct MacPkt pkt;
|
||||||
|
|
||||||
|
extern struct process cart_main_process;
|
||||||
|
|
||||||
|
void net_init(void);
|
||||||
|
void net_recv(const void* data, uint16_t len, const linkaddr_t* src, const linkaddr_t* dst);
|
||||||
|
void net_send(const void* data, uint16_t len, const linkaddr_t* dst);
|
||||||
|
|
||||||
|
#endif
|
26
project/Giomba/status.c
Normal file
26
project/Giomba/status.c
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#include "status.h"
|
||||||
|
|
||||||
|
enum CartStatus status;
|
||||||
|
struct etimer broadcast_timer;
|
||||||
|
linkaddr_t assigner_address;
|
||||||
|
|
||||||
|
void s_not_associated(process_event_t ev, process_data_t data) {
|
||||||
|
if (ev == PROCESS_EVENT_TIMER) {
|
||||||
|
/* 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);
|
||||||
|
etimer_reset(&broadcast_timer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* if a msg is received from network and represents an association event, then associate */
|
||||||
|
if (ev == PROCESS_EVENT_MSG && *((enum CartEvent*)data) == CART_EVENT_ASSOCIATED) {
|
||||||
|
printf("[I] Associated with Assigner\n");
|
||||||
|
assigner_address = pkt.src;
|
||||||
|
status = ASSOCIATED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
24
project/Giomba/status.h
Normal file
24
project/Giomba/status.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef STATUS_H
|
||||||
|
#define STATUS_H
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "sys/etimer.h"
|
||||||
|
#include "sys/process.h"
|
||||||
|
|
||||||
|
#include "../common/supermarket_net.h"
|
||||||
|
#include "event.h"
|
||||||
|
#include "sendrecv.h"
|
||||||
|
|
||||||
|
enum CartStatus {
|
||||||
|
NOT_ASSOCIATED,
|
||||||
|
ASSOCIATED,
|
||||||
|
SHOPPING,
|
||||||
|
CASHOUT
|
||||||
|
};
|
||||||
|
|
||||||
|
extern enum CartStatus status;
|
||||||
|
extern struct etimer broadcast_timer;
|
||||||
|
|
||||||
|
void s_not_associated(process_event_t ev, process_data_t data);
|
||||||
|
|
||||||
|
#endif
|
@ -10,55 +10,13 @@
|
|||||||
#include "arch/cpu/cc26x0-cc13x0/dev/cc26xx-uart.h"
|
#include "arch/cpu/cc26x0-cc13x0/dev/cc26xx-uart.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include "../common/supermarket_net.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define MAX_CUSTOMERS 20
|
#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");
|
PROCESS(cassa_main_process, "Cassa process");
|
||||||
AUTOSTART_PROCESSES(&cassa_main_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
|
//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
|
//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) {
|
if (received_msg.msg_type == BASKET_MSG) {
|
||||||
|
basket_msg *basket = (basket_msg*) (&received_msg);
|
||||||
uint8_t index = index_free_spot(invoices);
|
uint8_t index = index_free_spot(invoices);
|
||||||
if (index != -1 ) {
|
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].total_sum = 0;
|
||||||
invoices[index].customer_id = received_msg.basket.customer_id;
|
invoices[index].customer_id = basket->customer_id;
|
||||||
invoices[index].address_basket = received_msg.basket.address;
|
invoices[index].address_basket = source_address;
|
||||||
|
|
||||||
msg start_sending_list;
|
msg start_sending_list;
|
||||||
start_sending_list.msg_type = START_OF_LIST_PRODUCTS_MSG;
|
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");
|
printf("Reached max number of customers");
|
||||||
}
|
}
|
||||||
if (received_msg.msg_type == PRODUCT_MSG) {
|
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 (index != -1) {
|
||||||
if (invoices[index].n_prods > 0) {
|
if (invoices[index].n_prods > 0) {
|
||||||
invoices[index].total_sum += received_msg.product.prize;
|
invoices[index].total_sum += product->prize;
|
||||||
invoices[index].n_prods--;
|
invoices[index].n_prods--;
|
||||||
}
|
}
|
||||||
if (invoices[index].n_prods == 0) {
|
if (invoices[index].n_prods == 0) {
|
||||||
@ -146,7 +106,7 @@ PROCESS_THREAD(cassa_main_process, ev, data) {
|
|||||||
PROCESS_BEGIN();
|
PROCESS_BEGIN();
|
||||||
|
|
||||||
static uint8_t customer_id;
|
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);
|
cc26xx_uart_set_input(serial_line_input_byte);
|
||||||
serial_line_init();
|
serial_line_init();
|
||||||
@ -165,7 +125,7 @@ PROCESS_THREAD(cassa_main_process, ev, data) {
|
|||||||
printf("id: %d\n", (int)customer_id);
|
printf("id: %d\n", (int)customer_id);
|
||||||
|
|
||||||
bro_customer_id.msg_type = CASH_OUT_MSG;
|
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("Sending BROADCAST customer id: %d\n", (int)customer_id);
|
||||||
LOG_INFO_LLADDR(NULL);
|
LOG_INFO_LLADDR(NULL);
|
||||||
|
85
project/common/supermarket_net.h
Normal file
85
project/common/supermarket_net.h
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
#ifndef SUPERMARKET_NET_H
|
||||||
|
#define SUPERMARKET_NET_H
|
||||||
|
|
||||||
|
enum message_type {
|
||||||
|
ASSOCIATION_REQUEST_MSG,
|
||||||
|
ASSOCIATION_REPLY_MSG,
|
||||||
|
BATTERY_STATUS_MSG,
|
||||||
|
ASSIGNMENT_MSG,
|
||||||
|
CASH_OUT_MSG,
|
||||||
|
PRODUCT_MSG,
|
||||||
|
ITEM_ELEM_MSG,
|
||||||
|
BASKET_MSG,
|
||||||
|
START_OF_LIST_PRODUCTS_MSG
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct msg {
|
||||||
|
enum message_type msg_type;
|
||||||
|
}msg;
|
||||||
|
|
||||||
|
typedef struct assoc_req_msg
|
||||||
|
{
|
||||||
|
enum message_type msg_type;
|
||||||
|
uint8_t battery_percentage;
|
||||||
|
|
||||||
|
}assoc_req_msg;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct assoc_reply_msg
|
||||||
|
{
|
||||||
|
enum message_type msg_type;
|
||||||
|
}assoc_reply_msg;
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}assing_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;
|
||||||
|
linkaddr_t* address_basket;
|
||||||
|
uint8_t empty;
|
||||||
|
|
||||||
|
|
||||||
|
}user_invoice;
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user