From 2669e1fd2092b33c885166a7ddeecf74a7908dcc Mon Sep 17 00:00:00 2001 From: Florent Duchon Date: Tue, 2 Apr 2013 20:40:21 +0200 Subject: digital/beacon/tests: add twi unitary test for lol-v2 --- digital/beacon/tests/twi/Makefile | 44 ++++ digital/beacon/tests/twi/README | 25 +++ digital/beacon/tests/twi/atmega1281.ld | 97 ++++++++ digital/beacon/tests/twi/configuration.h | 330 ++++++++++++++++++++++++++++ digital/beacon/tests/twi/debug_avr.c | 104 +++++++++ digital/beacon/tests/twi/debug_avr.h | 46 ++++ digital/beacon/tests/twi/led.c | 135 ++++++++++++ digital/beacon/tests/twi/led.h | 54 +++++ digital/beacon/tests/twi/main_avr.c | 64 ++++++ digital/beacon/tests/twi/network_specific.c | 47 ++++ digital/beacon/tests/twi/network_specific.h | 42 ++++ digital/beacon/tests/twi/twi_specific.c | 106 +++++++++ digital/beacon/tests/twi/twi_specific.h | 68 ++++++ 13 files changed, 1162 insertions(+) create mode 100644 digital/beacon/tests/twi/Makefile create mode 100644 digital/beacon/tests/twi/README create mode 100644 digital/beacon/tests/twi/atmega1281.ld create mode 100644 digital/beacon/tests/twi/configuration.h create mode 100644 digital/beacon/tests/twi/debug_avr.c create mode 100644 digital/beacon/tests/twi/debug_avr.h create mode 100644 digital/beacon/tests/twi/led.c create mode 100644 digital/beacon/tests/twi/led.h create mode 100644 digital/beacon/tests/twi/main_avr.c create mode 100644 digital/beacon/tests/twi/network_specific.c create mode 100644 digital/beacon/tests/twi/network_specific.h create mode 100644 digital/beacon/tests/twi/twi_specific.c create mode 100644 digital/beacon/tests/twi/twi_specific.h (limited to 'digital') diff --git a/digital/beacon/tests/twi/Makefile b/digital/beacon/tests/twi/Makefile new file mode 100644 index 00000000..b8a5ceb2 --- /dev/null +++ b/digital/beacon/tests/twi/Makefile @@ -0,0 +1,44 @@ +ifndef APB_REPO_PATH +$(error Please set your environment variable APB_REPO_PATH with the path where is installed your APB repository) +endif + + +# Simulator makefile part +BASE = $(APB_REPO_PATH)/digital/avr +# HOST_PROGS = beacon +# beacon_SOURCES = main_simu.c position.c formula.c recovery.c update.c trust.c +# MODULES = math/fixed utils +# AVR_MCU = atmega1281 +# OPTIMIZE = -O2 -lm -DSIMULATOR +# include $(BASE)/make/Makefile.gen + + +# Bitcloud makefile part +BITCLOUD_BASE = $(APB_REPO_PATH)/digital/zigbit/bitcloud +BITCLOUD_MAKEFILE = $(BITCLOUD_BASE)/makefiles +BITCLOUD_STACK = $(BITCLOUD_BASE)/stack +BITCLOUD_COMMON_SOURCES = $(APB_REPO_PATH)/digital/zigbit/common +PROJECT_BASE = $(APB_REPO_PATH)/digital/beacon/tests/twi + +CONFIG_NAME = All_ZigBit_Atmega1281_Rf230_8Mhz_Gcc +#CONFIG_NAME = Coordinator_ZigBit_Atmega1281_Rf230_8Mhz_Gcc +#CONFIG_NAME = Router_ZigBit_Atmega1281_Rf230_8Mhz_Gcc +#CONFIG_NAME = All_Sec_ZigBit_Atmega1281_Rf230_8Mhz_Gcc +#CONFIG_NAME = Coordinator_Sec_ZigBit_Atmega1281_Rf230_8Mhz_Gcc +#CONFIG_NAME = Router_Sec_ZigBit_Atmega1281_Rf230_8Mhz_Gcc + +DEV2 := 0 + +avr: + $(MAKE) -C $(BITCLOUD_MAKEFILE) -f Makefile_$(CONFIG_NAME) clean BITCLOUD_PATH=$(BITCLOUD_STACK) + $(MAKE) -C $(BITCLOUD_MAKEFILE) -f Makefile_$(CONFIG_NAME) all APP_NAME=test_twi BITCLOUD_PATH=$(BITCLOUD_STACK) APB_AVR_PATH=$(BASE) PROJECT_BASE=$(PROJECT_BASE) BITCLOUD_COMMON_SOURCES=$(BITCLOUD_COMMON_SOURCES) + +flash: + make avr + $(APB_REPO_PATH)/digital/dev2/tools/dev2ctl.py -u + avrdude -c stk500v2 -P /dev/ttyUSB1 -p atmega1281 -B3 -U flash:w:obj/test_twi.hex + $(APB_REPO_PATH)/digital/dev2/tools/dev2ctl.py -s 1 + +clean: + $(MAKE) -C $(BITCLOUD_MAKEFILE) -f Makefile_$(CONFIG_NAME) clean APP_NAME=test_twi PROJECT_BASE=$(PROJECT_BASE) BITCLOUD_PATH=$(BITCLOUD_STACK);\ + diff --git a/digital/beacon/tests/twi/README b/digital/beacon/tests/twi/README new file mode 100644 index 00000000..282ed157 --- /dev/null +++ b/digital/beacon/tests/twi/README @@ -0,0 +1,25 @@ +****************************************** +Lol-v2 TWI Test Tool +****************************************** + +! This test tool must be used with beacon/pcb/lol-v2 hardware only ! + +1/ Purpose of the twi test tool +Validate the hardware compliancy of the TWI bus using lol-v2 as a slave + +2/ How to check lol-v2 -> Master communication +Using the APB TWI protocol, the twi test tool will always returns following fields: +Opponent1_X = 13 +Opponent1_Y = 37 +Opponent1_trust = 42 +Opponent2_X = 1500 +Opponent2_Y = 1671 +Opponent2_trust = 99 + +If you get theses values, TWI is unitary functional. Don't forget to check stress and robustness. + +3/ How to check Master -> lol-v2 communication +Using the APB TWI protocol, the twi test tool will light on all the leds when the jack field is set to 1 by the master. Inversely, leds will be shutted down when jack field is set to 0. + + + diff --git a/digital/beacon/tests/twi/atmega1281.ld b/digital/beacon/tests/twi/atmega1281.ld new file mode 100644 index 00000000..056e2cad --- /dev/null +++ b/digital/beacon/tests/twi/atmega1281.ld @@ -0,0 +1,97 @@ +OUTPUT_FORMAT("elf32-avr") +OUTPUT_ARCH(avr:5) + +MEMORY +{ + text (rx) : ORIGIN = 0x00000000, LENGTH = 128K + data (rw!x) : ORIGIN = 0x00800200, LENGTH = 8K - 500 /* leave 500 bytes for stack */ + eeprom (rw!x) : ORIGIN = 0x00810000, LENGTH = 4K +} + +SECTIONS +{ + .text : + { + PROVIDE(__text_start = .); + + *(.vectors) + KEEP(*(.vectors)) + + *(.progmem.gcc*) + *(.progmem*) + . = ALIGN(2); + + *(.trampolines*) + *(.jumptables*) + *(.lowtext*) + + *(.init0) + KEEP (*(.init0)) + *(.init1) + KEEP (*(.init1)) + *(.init2) + KEEP (*(.init2)) + *(.init3) + KEEP (*(.init3)) + *(.init4) + KEEP (*(.init4)) + *(.init5) + KEEP (*(.init5)) + *(.init6) + KEEP (*(.init6)) + *(.init7) + KEEP (*(.init7)) + *(.init8) + KEEP (*(.init8)) + + *(.text.main) + KEEP (*(.text.main)) + *(.text) + *(.text.*) + + PROVIDE(__text_end = .); + } > text + + .data : AT (ADDR(.text) + SIZEOF(.text)) + { + PROVIDE(__data_start = .); + *(.data*) + *(.rodata*) + *(.gnu.linkonce.d*) + . = ALIGN(2); + PROVIDE(__data_end = .); + } > data + + .bss __data_end : + { + PROVIDE(__bss_start = .); + *(.bss*) + *(COMMON) + PROVIDE(__bss_end = .); + } > data + + .noinit __bss_end : + { + *(.noinit*) + PROVIDE(__heap_start = .); + } > data + + __stack_start = .; + + __data_load_start = LOADADDR(.data); + __data_load_end = __data_load_start + SIZEOF(.data); + + .eeprom : + { + FILL(0xff) + BYTE(0xff) + . = . + LENGTH(eeprom)-1; + } > eeprom + + /DISCARD/ : + { + *(.init9) + *(.fini*) + } + +} diff --git a/digital/beacon/tests/twi/configuration.h b/digital/beacon/tests/twi/configuration.h new file mode 100644 index 00000000..834750b0 --- /dev/null +++ b/digital/beacon/tests/twi/configuration.h @@ -0,0 +1,330 @@ +#ifndef _CONFIGURATION_H_ +#define _CONFIGURATION_H_ + +#include "apsCommon.h" +#include +#include + +/*----------------------------------------------- */ +/* Disables board-specific peripherals support */ +/*----------------------------------------------- */ +#define APP_DISABLE_BSP 1 + +#define AC_FREQ 8000000 + +/* ----------------------------------------------------------- */ +/* USART CONFIGURATION */ +/* ----------------------------------------------------------- */ +#define APP_INTERFACE_USART 0x01 +#define APP_INTERFACE_VCP 0x02 +#define APP_INTERFACE_SPI 0x03 +#define APP_INTERFACE_UART 0x04 +#define APP_INTERFACE_USBFIFO 0x05 +#define APP_USART_RX_BUFFER_SIZE 100 /* Receive buffer size for USART. */ +#define APP_USART_TX_BUFFER_SIZE 500 /* Transmit buffer size for USART */ +#define APP_INTERFACE APP_INTERFACE_USART /* Defines primary serial interface type to be used by application */ +#define APP_USART_CHANNEL USART_CHANNEL_0 /* Defines USART interface name to be used by application.*/ + +/* ----------------------------------------------------------- */ +/* TWI CONFIGURATION */ +/* ----------------------------------------------------------- */ +#define AC_BEACON_TWI_ADDRESS 10 /* TWI address */ +#define AC_TWI_DRIVER HARD /* Driver to implement TWI: HARD, SOFT, or USI. */ +#define AC_TWI_NO_INTERRUPT 0 /* Do not use interrupts. */ +#define AC_TWI_FREQ 100000 /* TWI frequency, should really be 100 kHz. */ +#define AC_TWI_SLAVE_ENABLE 1 /* Enable slave part. */ +#define AC_TWI_MASTER_ENABLE 0 /* Enable master part. */ +#define AC_TWI_SLAVE_POLLED 1 /* Use polled slave mode: received data is stored in a buffer which can be polled using twi_slave_poll. */ +#undef AC_TWI_SLAVE_RECV /* Slave reception callback to be defined by the user when not in polled mode. */ +#define AC_TWI_PULL_UP 0 /* Use internal pull up. */ +#define AC_TWI_SLAVE_RECV_BUFFER_SIZE 16 /* Slave reception buffer size. */ +#define AC_TWI_SLAVE_SEND_BUFFER_SIZE 32 /* Slave transmission buffer size. */ + + +/* ----------------------------------------------------------- */ +/* ZIGBEE CONFIGURATION */ +/* ----------------------------------------------------------- */ +#define AT25F2048 0x01 +#define AT45DB041 0x02 +#define AT25DF041A 0x03 + + + +#define APP_FRAGMENTATION 0 /* Enables or disables APS Fragmentation support. */ +#define APP_DETECT_LINK_FAILURE 1 /* Enable or disable link failure detection */ +#define APP_ENDPOINT 1 /* Endpoint will be useed */ +#define APP_PROFILE_ID 1 /* Profile Id will be used */ +#define APP_CLUSTER_ID 1 /* Cluster Id will be used */ +#define APP_JOINING_INDICATION_PERIOD 500L /* Period of blinking during starting network */ + + + +// 32-bit mask of channels to be scanned before network is started. Channels that +// should be used are marked with logical 1 at corresponding bit location. +// Valid channel numbers for 2.4 GHz band are 0x0b - 0x1a +// Valid channel numbers for 900 MHz band are 0x00 - 0x0a +// +// Notes: +// 1. for small amount of enabled channels it is more convinient to specify list +// of channels in the form of '(1ul << 0x0b)' +// 2. For 900 MHz band you also need to specify channel page +// +// Value range: 32-bit values: +// Valid channel numbers for 2.4 GHz band are 0x0b - 0x1a +// Valid channel numbers for 900 MHz band are 0x00 - 0x0a +// +// C-type: uint32_t +// Can be set: at any time before network start +#define CS_CHANNEL_MASK (1L<<0x0f) + + +// The parameter specifies the predefined extended PANID of the network to be +// formed (for the coordinator) or joined (for a router or an end device). For a +// router or an end device the parameter can equal 0 allowing them to join the +// first suitable network that they discover. +#define CS_EXT_PANID 0xAAAAAAAAAAAA1337LL + +// The maximum number of direct children that a given device (the coordinator or a +// router) can have. +// +// The parameter is only enabled for routers and the coordinator. An end device +// can not have children. If an actual number of children reaches a parameter's +// value, the node will have not been able to accept any more children joining the +// network. The parameter can be set to 0 on a router thus preventing it from +// accepting any children and can be help form a desired network topology. For +// example, if the parameter is set to 0 on all routers, then the coordinator will +// be the only device that can have children and the network will have star +// topology. +#define CS_MAX_CHILDREN_AMOUNT 8 + +// The maximum number of routers among the direct children of the device +// +// The parameter determines how many routers the device can have as children. Note +// that the maximum number of end devices is equal to CS_MAX_CHILDREN_AMOUNT - +// CS_MAX_CHILDREN_ROUTER_AMOUNT. +#define CS_MAX_CHILDREN_ROUTER_AMOUNT 0 + +// Network depht limits amount of hops that packet may travel in the network. +// Actual maximum number of hops is network depth multiplied by 2. +// +// The parameter determines the maximum depth of a network tree formed by +// child-parent relationships between nodes. +// +// While joining the network the node receives beacon responses from potential +// parents containing their actual network depth and declines those which show +// values not less than the maximum network depth on the joining device. A +// potential parent will also reject a beacon from the joining device and will not +// sent a response if the joining device shows the network depth greater than it is +// allowed on the potential parent. This logic is enabled if the parameter value is +// not greater than 15. If its value is greater than 15, then device does not +// perform any checkings of the network depth, neither when joining a network nor +// when accepting other nodes as children. This allows forming long chains of +// devices across considerable distances. +#define CS_MAX_NETWORK_DEPTH 1 + +// Maximum amount of records in the Neighbor Table. +// +// The parameter determines the size of the neighbor table which is used to store +// beacon responses from nearby devices. The parameter puts an upper bound over the +// amount of child devices possible for the node. +#define CS_NEIB_TABLE_SIZE 10 + +// Maximum amount of records in the network Route Table. +// +// The parameter sets the maximum number of records that can be kept in the NWK +// route table. The table is used by NWK to store information about established +// routes. Each table entry specifies the next-hop short address for a route from +// the current node to a given destination node. The table is being filled +// automatically during route discovery. An entry is added when a route is +// discovered. +#define CS_ROUTE_TABLE_SIZE 8 + +// The parameter specifies the TX power of the transceiver device, is measured in +// dBm(s). After the node has entered the network the value can only be changed via +// the ZDO_SetTxPowerReq() function. +// +// Value range: depends on the hardware. Transmit power must be in the range from +// -17 to 3 dBm for AT86RF231, AT86RF230 and AT86RF230B. For AT86RF212 transmit +// power must be in the range from -11 to 11 dBm. +#define CS_RF_TX_POWER 3 + +//----------------------------------------------- +//STANDARD_SECURITY_MODE +//----------------------------------------------- +#ifdef STANDARD_SECURITY_MODE + // The parameter is used to determine the security type. + // + // Value range: 0,3 - for standard security; 1,2 - for high security. + // 0 - network key is preconfigured ; + // 1 - network join without master key, but with a trust center link key, which + // must be set via APS_SetLinkKey(); + // 2 - network join employs a master key, which must be set APS_SetMasterKey(); + // 3 - network key is no preconfigured, but rather received from the trust center + // in an unencrypted frame. (CS_APS_MAX_BLOCKS_AMOUNT * APS_MAX_ASDU_SIZE) + #error APP_MAX_PACKET_SIZE must be less or equal to (CS_APS_MAX_BLOCKS_AMOUNT * APS_MAX_ASDU_SIZE) + #endif +#else + #if APP_APS_PAYLOAD_SIZE > APS_MAX_ASDU_SIZE + #error APP_APS_PAYLOAD_SIZE must be less or equal to APS_MAX_ASDU_SIZE + #endif +#endif + + +// Common application state definition +typedef enum +{ + APP_INITIAL_STATE, // Initial state + APP_NETWORK_JOIN_REQUEST, + APP_NETWORK_JOINING_STATE, // Attempting join the network + APP_NETWORK_JOINED_STATE, // Successfully joined + APP_NETWORK_LEAVING_STATE, // Leaving from the network + APP_ERROR_STATE // Error state (runtime error occured) +} AppState_t; + +// Network data transmission state +typedef enum +{ + APP_DATA_TRANSMISSION_SENDING_STATE, // APS Data Request was not sent yet + APP_DATA_TRANSMISSION_BUSY_STATE, // APS Data Request was sent (confirm waiting) + APP_DATA_TRANSMISSION_WAIT_STATE, // Waiting a data block from USART + APP_DATA_TRANSMISSION_READY_STATE, // Ready to send new APS Data Request + APP_DATA_TRANSMISSION_STOP_STATE // Inter-frame delay +} AppDataTransmissionState_t; + + +#endif // _CONFIGURATION_H_ diff --git a/digital/beacon/tests/twi/debug_avr.c b/digital/beacon/tests/twi/debug_avr.c new file mode 100644 index 00000000..65403e20 --- /dev/null +++ b/digital/beacon/tests/twi/debug_avr.c @@ -0,0 +1,104 @@ +/* debug_avr.c */ +/* Beacon debug interface. {{{ + * + * Copyright (C) 2012 Florent Duchon + * + * APBTeam: + * Web: http://apbteam.org/ + * Email: team AT apbteam DOT org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ +#include +#include +#include +#include "configuration.h" +#include "print.h" +#include "debug_avr.h" +#include "reset.h" + +HAL_UsartDescriptor_t appUsartDescriptor; // USART descriptor (required by stack) +static HAL_AppTimer_t debugTimer; // TIMER descripor used by the DEBUG task + +uint8_t usartRxBuffer[APP_USART_RX_BUFFER_SIZE]; // USART Rx buffer +uint8_t usartTxBuffer[APP_USART_TX_BUFFER_SIZE]; // USART Tx buffer + +uint8_t debug_network = 0; +uint8_t debug_network_enable = 0; + +/* This function initializes the USART interface for debugging on avr */ + void initSerialInterface(void) + { + appUsartDescriptor.tty = USART_CHANNEL; + appUsartDescriptor.mode = USART_MODE_ASYNC; + appUsartDescriptor.baudrate = USART_BAUDRATE_38400; + appUsartDescriptor.dataLength = USART_DATA8; + appUsartDescriptor.parity = USART_PARITY_EVEN; + appUsartDescriptor.stopbits = USART_STOPBIT_1; + appUsartDescriptor.rxBuffer = usartRxBuffer; + appUsartDescriptor.rxBufferLength = sizeof(usartRxBuffer); + appUsartDescriptor.txBuffer = NULL; // use callback mode + appUsartDescriptor.txBufferLength = 0; + appUsartDescriptor.rxCallback = usartRXCallback; + appUsartDescriptor.txCallback = usartTXCallback; + appUsartDescriptor.flowControl = USART_FLOW_CONTROL_NONE; + OPEN_USART(&appUsartDescriptor); + } + +/* RX USART Callback */ +void usartRXCallback(uint16_t bytesToRead) +{ + uint8_t rxBuffer; + + /* Read RX buffer from HAL */ + READ_USART(&appUsartDescriptor,&rxBuffer,bytesToRead); + + switch(rxBuffer) + { + case 'd': + debug_start_stop_task(); + break; + /* Default */ + default : + uprintf(" ?? Unknown command ??\r\n"); + break; + } +} + +/* This function starts the debug task */ +void debug_start_stop_task(void) +{ + static bool debug_task_running = 0; + if(debug_task_running == 0) + { + debugTimer.interval = DEBUG_TASK_PERIOD; + debugTimer.mode = TIMER_REPEAT_MODE; + debugTimer.callback = debug_task; + HAL_StartAppTimer(&debugTimer); + debug_task_running = 1; + } + else + { + HAL_StopAppTimer(&debugTimer); + debug_task_running = 0; + } +} + +/* Debug task callback */ +void debug_task(void) +{ + uprintf("------------------------- debug TASK -------------------------\r\n"); +} diff --git a/digital/beacon/tests/twi/debug_avr.h b/digital/beacon/tests/twi/debug_avr.h new file mode 100644 index 00000000..488d8b16 --- /dev/null +++ b/digital/beacon/tests/twi/debug_avr.h @@ -0,0 +1,46 @@ +/* debug_avr.h */ +/* Macro for debug traces for avr target. {{{ + * + * Copyright (C) 2011 Florent Duchon + * + * APBTeam: + * Web: http://apbteam.org/ + * Email: team AT apbteam DOT org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +#ifndef _DEBUG_AVR_H +#define _DEBUG_AVR_H + +#include +#include "configuration.h" + +#define DEBUG_TASK_PERIOD 500L + +/* This function initializes the USART interface for debugging on avr */ +void initSerialInterface(void); + +/* RX USART Callback */ +void usartRXCallback(uint16_t bytesToRead); + +/* This function starts the debug task */ +void debug_start_stop_task(void); + +/* Debug task callback */ +void debug_task(void); + +#endif diff --git a/digital/beacon/tests/twi/led.c b/digital/beacon/tests/twi/led.c new file mode 100644 index 00000000..a2b4c77e --- /dev/null +++ b/digital/beacon/tests/twi/led.c @@ -0,0 +1,135 @@ +/* led.c */ +/* Led management. {{{ + * + * Copyright (C) 2012 Florent Duchon + * + * APBTeam: + * Web: http://apbteam.org/ + * Email: team AT apbteam DOT org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +#include +#include "led.h" + +static HAL_AppTimer_t delayTimer; + + +/* This function display a combination of led according the the given state */ +void led_display_state(int state) +{ + switch(state) + { + case APP_INITIAL_STATE: + case APP_NETWORK_JOINING_STATE: + led_on(1); + led_off(2); + break; + case APP_NETWORK_JOINED_STATE: + led_on(1); + led_on(2); + default: + break; + } +} + + +/* This function initializes the leds*/ +void init_led(void) +{ + /*D5/D6/D7 are configured in output */ + DDRD = 0xF0; +} + +/* This function activates a specific led */ +void led_on(int number) +{ + switch(number) + { + case 1: + PORTD|=0x20; + break; + case 2: + PORTD|=0x40; + break; + case 3: + PORTD|=0x80; + break; + default: + break; + } +} + +/* This function deactivates a specific led*/ +void led_off(int number) +{ + switch(number) + { + case 1: + PORTD&=0xDF; + break; + case 2: + PORTD&=0xBF; + break; + case 3: + PORTD&=0x7F; + break; + default: + break; + } +} + +/* This function inverse the state of a specific led*/ +void led_inverse(int number) +{ + switch(number) + { + case 1: + PORTD^=0x20; + break; + case 2: + PORTD^=0x40; + break; + case 3: + PORTD^=0x80; + break; + default: + break; + } +} + +/* This function enables the timer used by the network blink status led */ +void led_start_blink(void) +{ + delayTimer.interval = APP_JOINING_INDICATION_PERIOD; + delayTimer.mode = TIMER_REPEAT_MODE; + delayTimer.callback = led_network_status_blink_callback; + HAL_StartAppTimer(&delayTimer); +} + +/* This function disables the timer used by the network blink status led */ +void led_stop_blink(void) +{ + HAL_StopAppTimer(&delayTimer); + led_on(2); +} + +/* Led blink callback*/ +void led_network_status_blink_callback(void) +{ + led_inverse(2); +} diff --git a/digital/beacon/tests/twi/led.h b/digital/beacon/tests/twi/led.h new file mode 100644 index 00000000..d49196fe --- /dev/null +++ b/digital/beacon/tests/twi/led.h @@ -0,0 +1,54 @@ +/* led.h */ +/* Led management. {{{ + * + * Copyright (C) 2012 Florent Duchon + * + * APBTeam: + * Web: http://apbteam.org/ + * Email: team AT apbteam DOT org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ +#ifndef _LED_H +#define _LED_H + +#define APP_JOINING_INDICATION_PERIOD 500L // Period of blinking during starting network + +/* This function initializes the leds*/ +void init_led(void); + +/* This function activates a specific led */ +void led_on(int number); + +/* This function deactivates a specific led*/ +void led_off(int number); + +/* This function inverse the state of a specific led*/ +void led_inverse(int number); + +/* This function display a combination of led according the the given state */ +void led_display_state(int state); + +/* This function enables the timer used by the network blink status led */ +void led_start_blink(void); + +/* This function disables the timer used by the network blink status led */ +void led_stop_blink(void); + +/* Led blink callback*/ +void led_network_status_blink_callback(void); + +#endif diff --git a/digital/beacon/tests/twi/main_avr.c b/digital/beacon/tests/twi/main_avr.c new file mode 100644 index 00000000..f170c192 --- /dev/null +++ b/digital/beacon/tests/twi/main_avr.c @@ -0,0 +1,64 @@ +/* main_avr.c */ +/* Beacon State Machine & Main. {{{ + * + * Copyright (C) 2012 Florent Duchon + * + * APBTeam: + * Web: http://apbteam.org/ + * Email: team AT apbteam DOT org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +#include +#include +#include +#include "configuration.h" +#include "print.h" +#include "led.h" +#include "twi_specific.h" + +void APL_TaskHandler(void) +{ + static int init_done = 0; + if(init_done == 0) + { + /* Init Led */ + init_led(); + + /* Init Serial Interface for debug */ + initSerialInterface(); + twi_init_specific(); + + DDRD = 0x0F; + PORTD = 0x0F; + + init_done = 1; + uprintf("test_twi : init done\r\n"); + } + SYS_PostTask(APL_TASK_ID); +} + +int main(void) +{ + SYS_SysInit(); + for(;;) + { + SYS_RunTask(); + } +} + + diff --git a/digital/beacon/tests/twi/network_specific.c b/digital/beacon/tests/twi/network_specific.c new file mode 100644 index 00000000..2e46483e --- /dev/null +++ b/digital/beacon/tests/twi/network_specific.c @@ -0,0 +1,47 @@ +/* network.c */ +/* Beacon network management. {{{ + * + * Copyright (C) 2012 Florent Duchon + * + * APBTeam: + * Web: http://apbteam.org/ + * Email: team AT apbteam DOT org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +#include +#include +#include + +#include "configuration.h" +#include "network.h" +#include "network_specific.h" +#include "print.h" +AppMessageBuffer_t zigbit_tx_buffer; + +extern APS_RegisterEndpointReq_t endpointParams; +extern APS_DataReq_t network_config; + + + + + +/* Specific callback after data packet sent */ +void network_specific_DataConfcallback(void) +{ + +} diff --git a/digital/beacon/tests/twi/network_specific.h b/digital/beacon/tests/twi/network_specific.h new file mode 100644 index 00000000..c0cb5d6a --- /dev/null +++ b/digital/beacon/tests/twi/network_specific.h @@ -0,0 +1,42 @@ +/* network.h */ +/* Beacon network management. {{{ + * + * Copyright (C) 2012 Florent Duchon + * + * APBTeam: + * Web: http://apbteam.org/ + * Email: team AT apbteam DOT org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +#ifndef _NETWORK_SPECIFIC_H +#define _NETWORK_SPECIFIC_H + +#include +#include "network.h" + +#define NETWORK_ACTIVITY_LED 2 +#define PACKET_NUMBER 200 + + +/* Specific callback after data packet sent */ +void network_specific_DataConfcallback(void); + +/* This function sends a specified buffer */ +uint8_t network_send_buffer_transfert_rate(uint8_t * buffer_in,uint16_t size); + +#endif diff --git a/digital/beacon/tests/twi/twi_specific.c b/digital/beacon/tests/twi/twi_specific.c new file mode 100644 index 00000000..cf6695c3 --- /dev/null +++ b/digital/beacon/tests/twi/twi_specific.c @@ -0,0 +1,106 @@ +/* twi_specific.c */ +/* twi specific funtion. {{{ + * + * Copyright (C) 2012 Florent Duchon + * + * APBTeam: + * Web: http://apbteam.org/ + * Email: team AT apbteam DOT org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +#include "modules/utils/byte.h" +#include "modules/utils/crc.h" +#include "twi_specific.h" +#include "configuration.h" +#include "twi.h" +#include "network.h" + + +static HAL_AppTimer_t twiTimer; + +uint16_t opponent1_x = 13; +uint16_t opponent1_y = 37; +uint16_t opponent1_trust = 42; +uint16_t opponent2_x = 1500; +uint16_t opponent2_y = 1671; +uint16_t opponent2_trust = 99; + +/* This function manages the TWI RX/RX transferts */ +void twi_task(void) +{ + uint8_t TXbuffer[AC_TWI_SLAVE_SEND_BUFFER_SIZE]; + uint8_t RXbuffer[AC_TWI_SLAVE_RECV_BUFFER_SIZE]; + uint8_t RXlen; + static uint8_t seq = 0; + + TXbuffer[TWI_TX_SEQ_FIELD] = seq; + + /* Opponent 1 */ + TXbuffer[TWI_TX_X1_MSB_FIELD] = v16_to_v8 (opponent1_x, 1); + TXbuffer[TWI_TX_X1_LSB_FIELD] = v16_to_v8 (opponent1_x, 0); + TXbuffer[TWI_TX_Y1_MSB_FIELD] = v16_to_v8 (opponent1_y, 1); + TXbuffer[TWI_TX_Y1_LSB_FIELD] = v16_to_v8 (opponent1_y, 0); + TXbuffer[TWI_TX_TRUST1_FIELD] = opponent1_trust; + + /* Opponent 2 */ + TXbuffer[TWI_TX_X2_MSB_FIELD] = v16_to_v8 (opponent2_x, 1); + TXbuffer[TWI_TX_X2_LSB_FIELD] = v16_to_v8 (opponent2_x, 0); + TXbuffer[TWI_TX_Y2_MSB_FIELD] = v16_to_v8 (opponent2_y, 1); + TXbuffer[TWI_TX_Y2_LSB_FIELD] = v16_to_v8 (opponent2_y, 0); + TXbuffer[TWI_TX_TRUST2_FIELD] = opponent2_trust; + + /* Compute CRC */ + TXbuffer[TWI_TX_CRC_FIELD] = crc_compute (&TXbuffer[1],TWI_TX_FIELD_NB-1); + + /* data to be communicated to the master */ + twi_slave_update (TXbuffer, sizeof (TXbuffer)); + + /* Check for data. */ + RXlen = twi_slave_poll (RXbuffer, AC_TWI_SLAVE_RECV_BUFFER_SIZE); + + /* data availlable */ + if(RXlen != 0) + { + if (crc_compute (RXbuffer + 1, RXlen - 1) == RXbuffer[0]) + { + if(RXbuffer[TWI_RX_JACK_FIELD] == 1) + { + PORTD=0xFF; + } + else + { + PORTD=0x00; + } + } + else + { + /* CRC not valid, dump values */ + } + } +} + +/* Initialisze specific TWI */ +void twi_init_specific(void) +{ + twi_init(AC_BEACON_TWI_ADDRESS); + twiTimer.interval = TWI_TASK_PERIOD; + twiTimer.mode = TIMER_REPEAT_MODE; + twiTimer.callback = twi_task; + HAL_StartAppTimer(&twiTimer); +} + diff --git a/digital/beacon/tests/twi/twi_specific.h b/digital/beacon/tests/twi/twi_specific.h new file mode 100644 index 00000000..1aac01d0 --- /dev/null +++ b/digital/beacon/tests/twi/twi_specific.h @@ -0,0 +1,68 @@ +/* twi_specific.h */ +/* twi specific funtion. {{{ + * + * Copyright (C) 2012 Florent Duchon + * + * APBTeam: + * Web: http://apbteam.org/ + * Email: team AT apbteam DOT org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +#ifndef _TWI_SPECIFIC_H +#define _TWI_SPECIFIC_H + +#define TWI_TASK_PERIOD 4L + + +typedef enum +{ + TWI_RX_CRC_FIELD, + TWI_RX_SEQ_FIELD, + TWI_RX_JACK_FIELD, + TWI_RX_COLOR_FIELD, + TWI_RX_NB_ADV_FIELD, + TWI_RX_X_MSB_FIELD, + TWI_RX_X_LSB_FIELD, + TWI_RX_Y_MSB_FIELD, + TWI_RX_Y_LSB_FIELD +} TTWI_RX_field; + +typedef enum +{ + TWI_TX_CRC_FIELD, + TWI_TX_SEQ_FIELD, + TWI_TX_X1_MSB_FIELD, + TWI_TX_X1_LSB_FIELD, + TWI_TX_Y1_MSB_FIELD, + TWI_TX_Y1_LSB_FIELD, + TWI_TX_TRUST1_FIELD, + TWI_TX_X2_MSB_FIELD, + TWI_TX_X2_LSB_FIELD, + TWI_TX_Y2_MSB_FIELD, + TWI_TX_Y2_LSB_FIELD, + TWI_TX_TRUST2_FIELD, + TWI_TX_FIELD_NB +} TTWI_TX_field; + +/* This function manages the TWI RX/RX transferts */ +void twi_task(void); + +/* Initialisze specific TWI */ +void twi_init_specific(void); + +#endif -- cgit v1.2.3