From eb26ee00f22a8aa10fe3ec0741a7ca1a9d73e659 Mon Sep 17 00:00:00 2001 From: Florent Duchon Date: Tue, 23 Apr 2013 17:11:27 +0200 Subject: digital/dongle-zigbit: add source code for serial over zigbit --- digital/dongle-zigbit/src/Makefile | 49 ++++ digital/dongle-zigbit/src/atmega1281.ld | 97 ++++++++ digital/dongle-zigbit/src/configuration.h | 330 +++++++++++++++++++++++++++ digital/dongle-zigbit/src/debug_avr.c | 122 ++++++++++ digital/dongle-zigbit/src/debug_avr.h | 52 +++++ digital/dongle-zigbit/src/led.c | 135 +++++++++++ digital/dongle-zigbit/src/led.h | 54 +++++ digital/dongle-zigbit/src/main_avr.c | 92 ++++++++ digital/dongle-zigbit/src/network_specific.c | 64 ++++++ digital/dongle-zigbit/src/network_specific.h | 41 ++++ 10 files changed, 1036 insertions(+) create mode 100644 digital/dongle-zigbit/src/Makefile create mode 100644 digital/dongle-zigbit/src/atmega1281.ld create mode 100644 digital/dongle-zigbit/src/configuration.h create mode 100644 digital/dongle-zigbit/src/debug_avr.c create mode 100644 digital/dongle-zigbit/src/debug_avr.h create mode 100644 digital/dongle-zigbit/src/led.c create mode 100644 digital/dongle-zigbit/src/led.h create mode 100644 digital/dongle-zigbit/src/main_avr.c create mode 100644 digital/dongle-zigbit/src/network_specific.c create mode 100644 digital/dongle-zigbit/src/network_specific.h diff --git a/digital/dongle-zigbit/src/Makefile b/digital/dongle-zigbit/src/Makefile new file mode 100644 index 00000000..9c501309 --- /dev/null +++ b/digital/dongle-zigbit/src/Makefile @@ -0,0 +1,49 @@ +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 = dongle-zigbit +dongle-zigbit_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 -I$(APB_REPO_PATH)/digital/zigbit/common +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/dongle-zigbit/src + +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 +PROGRAMMING_INTERFACE:=/dev/ttyUSB1 +simu:host + python simulator.py + +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=dongle-zigbit BITCLOUD_PATH=$(BITCLOUD_STACK) APB_AVR_PATH=$(BASE) PROJECT_BASE=$(PROJECT_BASE) BITCLOUD_COMMON_SOURCES=$(BITCLOUD_COMMON_SOURCES) + +fuses: + $(APB_REPO_PATH)/digital/dev2/tools/dev2ctl.py -s 1 + avrdude -c stk500v2 -P $(PROGRAMMING_INTERFACE) -p atmega1281 -B3 -U lfuse:w:0x62:m -U hfuse:w:0xDC:m + +flash: + make avr + $(APB_REPO_PATH)/digital/dev2/tools/dev2ctl.py -s 1 + avrdude -c stk500v2 -P $(PROGRAMMING_INTERFACE) -p atmega1281 -B3 -U flash:w:obj/dongle-zigbit.hex + +clean: + $(MAKE) -C $(BITCLOUD_MAKEFILE) -f Makefile_$(CONFIG_NAME) clean APP_NAME=dongle-zigbit PROJECT_BASE=$(PROJECT_BASE) BITCLOUD_PATH=$(BITCLOUD_STACK); + \ \ No newline at end of file diff --git a/digital/dongle-zigbit/src/atmega1281.ld b/digital/dongle-zigbit/src/atmega1281.ld new file mode 100644 index 00000000..056e2cad --- /dev/null +++ b/digital/dongle-zigbit/src/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/dongle-zigbit/src/configuration.h b/digital/dongle-zigbit/src/configuration.h new file mode 100644 index 00000000..d22cc21f --- /dev/null +++ b/digital/dongle-zigbit/src/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 4 + +// 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/dongle-zigbit/src/debug_avr.c b/digital/dongle-zigbit/src/debug_avr.c new file mode 100644 index 00000000..4de67d38 --- /dev/null +++ b/digital/dongle-zigbit/src/debug_avr.c @@ -0,0 +1,122 @@ +/* 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 "network_specific.h" +#include "network_send_commands.h" +#include "serial_ota.h" +#include "reset.h" +#include "uid.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; + +uint8_t rxBuffer[40]; + + +/* 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) +{ + uint16_t dest = 0; + + /* Read RX buffer from HAL */ + READ_USART(&appUsartDescriptor,rxBuffer,bytesToRead); + + if(get_serial_ota_mode() == 1) + { + if(get_uid() == 0) + dest = get_serial_ota_EDaddr(); + else + dest = 0; + network_send_buffer_over_zb(dest,rxBuffer,bytesToRead); + } + else + { + switch(rxBuffer[0]) + { + 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"); + uprintf("## Network\r\n"); + uprintf("Status : 0x%x - ",network_get_state()); +} \ No newline at end of file diff --git a/digital/dongle-zigbit/src/debug_avr.h b/digital/dongle-zigbit/src/debug_avr.h new file mode 100644 index 00000000..cdba61c5 --- /dev/null +++ b/digital/dongle-zigbit/src/debug_avr.h @@ -0,0 +1,52 @@ +/* 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); + +/* This function stops the uart over zb mode */ +void serial_over_zigbit_stop(void); + +/* This function starts the uart over zb mode */ +void serial_over_zigbit_start(uint16_t addr); + +#endif diff --git a/digital/dongle-zigbit/src/led.c b/digital/dongle-zigbit/src/led.c new file mode 100644 index 00000000..a2b4c77e --- /dev/null +++ b/digital/dongle-zigbit/src/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/dongle-zigbit/src/led.h b/digital/dongle-zigbit/src/led.h new file mode 100644 index 00000000..d49196fe --- /dev/null +++ b/digital/dongle-zigbit/src/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/dongle-zigbit/src/main_avr.c b/digital/dongle-zigbit/src/main_avr.c new file mode 100644 index 00000000..0c1a963e --- /dev/null +++ b/digital/dongle-zigbit/src/main_avr.c @@ -0,0 +1,92 @@ +/* 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 "configuration.h" +#include "print.h" +#include "network.h" +#include "led.h" +#include "uid.h" +#include "serial_ota.h" + + +static uint8_t uid; + +void APL_TaskHandler(void) +{ + switch (network_get_state()) + { + case APP_INITIAL_STATE: + + /* Init Led */ + init_led(); + + /* get uid */ + uid = get_uid(); + + /* Init Serial Interface for debug */ + initSerialInterface(); + + serial_over_zigbit_start(0); + + /* Init network */ + network_init(uid); + + network_set_state(APP_NETWORK_JOIN_REQUEST); + break; + case APP_NETWORK_JOIN_REQUEST: + + /* Activate the network status led blink */ + led_start_blink(); + + /* St art network */ + network_start(); + + network_set_state(APP_NETWORK_JOINING_STATE); + + case APP_NETWORK_JOINING_STATE: + break; + case APP_NETWORK_LEAVING_STATE: + break; + case APP_NETWORK_JOINED_STATE: + led_stop_blink(); + break; + default: + break; + } + SYS_PostTask(APL_TASK_ID); +} + +int main(void) +{ + SYS_SysInit(); + for(;;) + { + SYS_RunTask(); + } +} + + diff --git a/digital/dongle-zigbit/src/network_specific.c b/digital/dongle-zigbit/src/network_specific.c new file mode 100644 index 00000000..d03ac24e --- /dev/null +++ b/digital/dongle-zigbit/src/network_specific.c @@ -0,0 +1,64 @@ +/* network_specific.c */ +/* Beacon specifical 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" +#include "reset.h" +#include "uid.h" + +/* Specific callback after data packet received */ +void network_specific_DataIndicationcallback(APS_DataInd_t* indData) +{ + AppMessage_t *FrameReceived = (AppMessage_t *) indData->asdu; + + /* Data received indication */ + switch(FrameReceived->type) + { + case NETWORK_RESET: + reset_avr(); + break; + case NETWORK_UART_OVER_ZB: + print_raw_data(FrameReceived->data,indData->asduLength-1); + break; + default: + uprintf("Unknown data type received = %x\r\n",FrameReceived->type); + break; + } +} + +/* Specific callback after data packet sent */ +void network_specific_DataConfcallback(void) +{ +} + + + diff --git a/digital/dongle-zigbit/src/network_specific.h b/digital/dongle-zigbit/src/network_specific.h new file mode 100644 index 00000000..c4cef1cb --- /dev/null +++ b/digital/dongle-zigbit/src/network_specific.h @@ -0,0 +1,41 @@ +/* network_specific.h */ +/* Beacon specifical 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 + + +/* Specific callback after data packet received */ +void network_specific_DataIndicationcallback(APS_DataInd_t* indData); + +/* Specific callback after data packet sent */ +void network_specific_DataConfcallback(void); + +#endif -- cgit v1.2.3