d50c190957
* moving folders and files and adjust server demo build * Fix Makefile for apps/server on Linux * fix unit test source file folders * fix datetime convert UTC functions. Add Code::Blocks project for datetime testing * added some ignore extensions * disable parallel make option * fix build for abort, dcc, and epics apps * fix build for dcc, epics, error, and getevent apps. * Fixed building of all apps * fix the ipv4 to ipv6 router app build * Change indent style from Google to Webkit * make pretty to re-format style * removed common Makefile since we already had one and two was too many * remove scripts from root folder that are no longer maintained or used * remove mercurial EOL and ignore files for git repo * remove .vscodeconfig files from repo * tweak clang-format style * clang-format src and apps with tweaked style * added clang-tidy to fix readability if braces in src * result of make tidy for src and apps * fix clang-tidy mangling * Added code::blocks project for BACnet server simulation * added code::blocks linux project for WhoIs app * update text files for EOL * fix EOL in some files * fixed make win32 apps for older gcc * Removed Borland C++ Makefile in apps. Unable to maintain support for Borland C++ compiler. * created codeblocks project for apps/epics for Windows * fixing ports/xplained to work with new data structure. * fix ports/xplained example for Atmel Studio compile * fix ports/stm32f10x example for gcc Makefile compile * fix ports/stm32f10x example for IAR EWARM compile * fix ports/xplained timer callback * fix ports/bdk_atxx_mspt build with subdirs * fix ports/bdk_atxx_mspt build with subdirs * updated git ignore for IAR build artifacts * updated gitignore for non-tracked files and folders * fixed bdk-atxx4-mstp port for Rowley Crossworks project file * fixed bdk-atxx4-mstp port for GCC AVR Makefile * fixed atmega168 port for IAR AVR and GCC AVR Makefile * fixed at91sam7s port for IAR ARM and GCC ARM Makefile * removed unmaintainable DOS, RTOS32, and atmega8 ports. Updated rx62n (untested). * changed arm7 to uip port
215 lines
6.0 KiB
C
215 lines
6.0 KiB
C
//
|
|
// Copyleft F.Chaxel 2017
|
|
//
|
|
|
|
#include "bacnet/config.h"
|
|
#include "bacnet/basic/tsm/tsm.h"
|
|
#include "bacnet/basic/services.h"
|
|
|
|
#include "bacnet/basic/services.h"
|
|
#include "bacnet/datalink/datalink.h"
|
|
#include "bacnet/dcc.h"
|
|
#include "bacnet/basic/tsm/tsm.h"
|
|
// conflict filename address.h with another file in default include paths
|
|
#include "../lib/stack/address.h"
|
|
#include "bacnet/datalink/bip.h"
|
|
|
|
#include "bacnet/basic/object/device.h"
|
|
#include "bacnet/basic/object/ai.h"
|
|
#include "bacnet/basic/object/bo.h"
|
|
|
|
#include "esp_log.h"
|
|
#include "esp_wifi.h"
|
|
#include "esp_event_loop.h"
|
|
#include "nvs_flash.h"
|
|
|
|
#include "driver/gpio.h"
|
|
|
|
#include "lwip/sockets.h"
|
|
#include "lwip/netdb.h"
|
|
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/task.h"
|
|
#include "freertos/event_groups.h"
|
|
|
|
// hidden function not in any .h files
|
|
extern uint8_t temprature_sens_read();
|
|
extern uint32_t hall_sens_read();
|
|
|
|
// Wifi params
|
|
wifi_config_t wifi_config = {
|
|
.sta = {
|
|
.ssid = "myWifi",
|
|
.password = "myPass",
|
|
},
|
|
};
|
|
|
|
// GPIO 5 has a Led on Sparkfun ESP32 board
|
|
#define BACNET_LED 5
|
|
|
|
uint8_t Handler_Transmit_Buffer[MAX_PDU] = { 0 };
|
|
uint8_t Rx_Buf[MAX_MPDU] = { 0 };
|
|
|
|
EventGroupHandle_t wifi_event_group;
|
|
const static int CONNECTED_BIT = BIT0;
|
|
|
|
/* BACnet handler, stack init, IAm */
|
|
void StartBACnet()
|
|
{
|
|
/* we need to handle who-is to support dynamic device binding */
|
|
apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_WHO_IS, handler_who_is);
|
|
|
|
/* set the handler for all the services we don't implement */
|
|
/* It is required to send the proper reject message... */
|
|
apdu_set_unrecognized_service_handler_handler
|
|
(handler_unrecognized_service);
|
|
/* Set the handlers for any confirmed services that we support. */
|
|
/* We must implement read property - it's required! */
|
|
apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROPERTY,
|
|
handler_read_property);
|
|
apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROP_MULTIPLE,
|
|
handler_read_property_multiple);
|
|
|
|
apdu_set_confirmed_handler(SERVICE_CONFIRMED_WRITE_PROPERTY,
|
|
handler_write_property);
|
|
apdu_set_confirmed_handler(SERVICE_CONFIRMED_SUBSCRIBE_COV,
|
|
handler_cov_subscribe);
|
|
|
|
address_init();
|
|
bip_init(NULL);
|
|
Send_I_Am(&Handler_Transmit_Buffer[0]);
|
|
}
|
|
|
|
/* wifi events handler : start & stop bacnet with an event */
|
|
esp_err_t wifi_event_handler(void *ctx, system_event_t *event)
|
|
{
|
|
switch(event->event_id) {
|
|
case SYSTEM_EVENT_STA_START:
|
|
esp_wifi_connect();
|
|
break;
|
|
case SYSTEM_EVENT_STA_CONNECTED:
|
|
break ;
|
|
case SYSTEM_EVENT_STA_GOT_IP:
|
|
if (xEventGroupGetBits(wifi_event_group)!=CONNECTED_BIT)
|
|
{
|
|
xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
|
|
StartBACnet();
|
|
}
|
|
break;
|
|
case SYSTEM_EVENT_STA_DISCONNECTED:
|
|
/* This is a workaround as ESP32 WiFi libs don't currently
|
|
auto-reassociate. */
|
|
esp_wifi_connect();
|
|
xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
|
|
bip_cleanup();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return ESP_OK;
|
|
}
|
|
|
|
/* tcpip & wifi station start */
|
|
|
|
void wifi_init_station(void)
|
|
{
|
|
tcpip_adapter_init();
|
|
wifi_event_group = xEventGroupCreate();
|
|
esp_event_loop_init(wifi_event_handler, NULL);
|
|
|
|
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
|
esp_wifi_init(&cfg);
|
|
|
|
esp_wifi_set_storage(WIFI_STORAGE_RAM);
|
|
esp_wifi_set_mode(WIFI_MODE_STA);
|
|
|
|
esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);
|
|
|
|
esp_wifi_start() ;
|
|
}
|
|
|
|
/* setup gpio & nv flash, call wifi init code */
|
|
void setup()
|
|
{
|
|
gpio_pad_select_gpio(BACNET_LED);
|
|
gpio_set_direction(BACNET_LED, GPIO_MODE_OUTPUT);
|
|
|
|
gpio_set_level(BACNET_LED,0);
|
|
|
|
esp_err_t ret = nvs_flash_init();
|
|
if (ret == ESP_ERR_NVS_NO_FREE_PAGES)
|
|
{
|
|
nvs_flash_erase();
|
|
ret = nvs_flash_init();
|
|
}
|
|
wifi_init_station();
|
|
}
|
|
|
|
/* Bacnet Task */
|
|
void BACnetTask(void *pvParameters)
|
|
{
|
|
uint16_t pdu_len = 0;
|
|
BACNET_ADDRESS src = {
|
|
0
|
|
};
|
|
unsigned timeout = 1;
|
|
|
|
// Init Bacnet objets dictionnary
|
|
Device_Init(NULL);
|
|
Device_Set_Object_Instance_Number(12);
|
|
|
|
setup();
|
|
|
|
uint32_t tickcount=xTaskGetTickCount();
|
|
|
|
for (;;)
|
|
{
|
|
vTaskDelay(10 / portTICK_PERIOD_MS); // could be remove to speed the code
|
|
|
|
// do nothing if not connected to wifi
|
|
xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, false, true, portMAX_DELAY);
|
|
{
|
|
uint32_t newtick=xTaskGetTickCount();
|
|
|
|
// one second elapse at least (maybe much more if Wifi was deconnected for a long)
|
|
if ((newtick<tickcount)||((newtick-tickcount)>=configTICK_RATE_HZ))
|
|
{
|
|
tickcount=newtick;
|
|
dcc_timer_seconds(1);
|
|
bvlc_maintenance_timer(1);
|
|
handler_cov_timer_seconds(1);
|
|
tsm_timer_milliseconds(1000);
|
|
|
|
// Read analog values from internal sensors
|
|
Analog_Input_Present_Value_Set(0,temprature_sens_read());
|
|
Analog_Input_Present_Value_Set(1,hall_sens_read());
|
|
|
|
}
|
|
|
|
pdu_len = datalink_receive(&src, &Rx_Buf[0], MAX_MPDU, timeout);
|
|
if (pdu_len)
|
|
{
|
|
npdu_handler(&src, &Rx_Buf[0], pdu_len);
|
|
|
|
if(Binary_Output_Present_Value(0)==BINARY_ACTIVE)
|
|
gpio_set_level(BACNET_LED,1);
|
|
else
|
|
gpio_set_level(BACNET_LED,0);
|
|
}
|
|
|
|
handler_cov_task();
|
|
}
|
|
}
|
|
}
|
|
/* Entry point */
|
|
void app_main()
|
|
{
|
|
// Cannot run BACnet code here, the default stack size is to small : 4096 byte
|
|
xTaskCreate(
|
|
BACnetTask, /* Function to implement the task */
|
|
"BACnetTask", /* Name of the task */
|
|
10000, /* Stack size in words */
|
|
NULL, /* Task input parameter */
|
|
20, /* Priority of the task */
|
|
NULL); /* Task handle. */
|
|
} |