From ecc0f2f1c90a608491235781b97120829ee92571 Mon Sep 17 00:00:00 2001 From: stefic User Date: Sun, 28 Dec 2008 11:18:09 +0100 Subject: [PATCH] Added code for second device. --- app/Makefile.omk | 2 +- app/control/Makefile | 15 +++ app/control/Makefile.omk | 32 +++++++ app/control/board.c | 158 +++++++++++++++++++++++++++++++ app/control/board.h | 39 ++++++++ app/control/definitions.c | 1 + app/control/definitions.h | 1 + app/control/hydroponie.c | 1 + app/control/hydroponie.h | 1 + app/control/hydroponieoi.c | 91 ++++++++++++++++++ app/control/load_usb.sh | 6 ++ app/control/ul_idstr.c | 1 + app/control/ul_idstr.h | 1 + app/sensor/Makefile | 15 +++ app/sensor/Makefile.omk | 33 +++++++ app/sensor/board.c | 186 +++++++++++++++++++++++++++++++++++++ app/sensor/board.h | 52 +++++++++++ app/sensor/definitions.c | 172 ++++++++++++++++++++++++++++++++++ app/sensor/definitions.h | 62 +++++++++++++ app/sensor/hydroponie.c | 101 ++++++++++++++++++++ app/sensor/hydroponie.h | 10 ++ app/sensor/hydroponieoi.c | 82 ++++++++++++++++ app/sensor/load_usb.sh | 6 ++ app/sensor/ul_idstr.c | 27 ++++++ app/sensor/ul_idstr.h | 14 +++ 25 files changed, 1108 insertions(+), 1 deletion(-) create mode 100644 app/control/Makefile create mode 100644 app/control/Makefile.omk create mode 100644 app/control/board.c create mode 100644 app/control/board.h create mode 120000 app/control/definitions.c create mode 120000 app/control/definitions.h create mode 120000 app/control/hydroponie.c create mode 120000 app/control/hydroponie.h create mode 100644 app/control/hydroponieoi.c create mode 100755 app/control/load_usb.sh create mode 120000 app/control/ul_idstr.c create mode 120000 app/control/ul_idstr.h create mode 100644 app/sensor/Makefile create mode 100644 app/sensor/Makefile.omk create mode 100644 app/sensor/board.c create mode 100644 app/sensor/board.h create mode 100644 app/sensor/definitions.c create mode 100644 app/sensor/definitions.h create mode 100644 app/sensor/hydroponie.c create mode 100644 app/sensor/hydroponie.h create mode 100644 app/sensor/hydroponieoi.c create mode 100755 app/sensor/load_usb.sh create mode 100644 app/sensor/ul_idstr.c create mode 100644 app/sensor/ul_idstr.h diff --git a/app/Makefile.omk b/app/Makefile.omk index ee88ef2..5bf7820 100644 --- a/app/Makefile.omk +++ b/app/Makefile.omk @@ -1,3 +1,3 @@ # -*- makefile -*- -SUBDIRS = hydro +SUBDIRS = sensor control diff --git a/app/control/Makefile b/app/control/Makefile new file mode 100644 index 0000000..cafc99f --- /dev/null +++ b/app/control/Makefile @@ -0,0 +1,15 @@ +# Generic directory or leaf node makefile for OCERA make framework + +ifndef MAKERULES_DIR +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) ) +endif + +ifeq ($(MAKERULES_DIR),) +all : default +.DEFAULT:: + @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n" +else +include $(MAKERULES_DIR)/Makefile.rules +endif + +# DO NOT DELETE diff --git a/app/control/Makefile.omk b/app/control/Makefile.omk new file mode 100644 index 0000000..a63c7b2 --- /dev/null +++ b/app/control/Makefile.omk @@ -0,0 +1,32 @@ + +default_CONFIG = CONFIG_APP_CONTROL=n + +ifeq ($(CONFIG_APP_CONTROL),y) + +ULAN_ID=control + +default_CONFIG += CONFIG_ULOI_LT=x +default_CONFIG += CONFIG_ULAN_DY=x +default_CONFIG += MACH=$(MACH) +default_CONFIG += ULAN_ID=$(ULAN_ID) + +LOCAL_CONFIG_H = ulan_config.h + +INCLUDES += -I. + +bin_PROGRAMS = control +control_SOURCES = hydroponie.c ul_idstr.c hydroponieoi.c definitions.c board.c + +ifeq ($(BUILD_OS),linux) +lib_LOADLIBES = uloi uldy ulan pthread rt +DEFS += -DOS_POSIX +else +control_MOREOBJS = $(USER_LIB_DIR)/system_stub.o +control_MOREOBJS += $(USER_LIB_DIR)/ivt.o +lib_LOADLIBES = uloi uldy bspbase ulan ul_drv lpciap keyval lpciap lpciap_kvpb mach_hal +endif + +# This selects linker script +link_VARIANTS = app + +endif \ No newline at end of file diff --git a/app/control/board.c b/app/control/board.c new file mode 100644 index 0000000..365fbf0 --- /dev/null +++ b/app/control/board.c @@ -0,0 +1,158 @@ + +#include +#include +#include + +#include "board.h" + +// OBJECT INTERFACE VARIABLES +uint16_t status_val; +uint16_t oi_fan; +uint16_t oi_cid_fan; +uint16_t oi_humidifier; +uint16_t oi_cid_humidifier; +uint16_t oi_light; +uint16_t oi_cid_light; +uint16_t oi_period; + +// OBJECT INTERFACE FUNCTIONS +int oi_cid_fan_wrfnc(ULOI_PARAM_coninfo void *context){ + uloi_uint_wrfnc(ULOI_ARG_coninfo context); + return 1; +} + +int oi_cid_humidifier_wrfnc(ULOI_PARAM_coninfo void *context){ + uloi_uint_wrfnc(ULOI_ARG_coninfo context); + return 1; +} + +int oi_cid_light_wrfnc(ULOI_PARAM_coninfo void *context){ + uloi_uint_wrfnc(ULOI_ARG_coninfo context); + return 1; +} + +int oi_period_wrfnc(ULOI_PARAM_coninfo void *context){ + uloi_uint_wrfnc(ULOI_ARG_coninfo context); + return 1; +} + +//********************************************************* +int oi_fan_wrfnc(ULOI_PARAM_coninfo void *context){ + uloi_uint_wrfnc(ULOI_ARG_coninfo context); + if (oi_fan == 1) { + SET_OUT_PIN(OUT_PORT,P1_27_FAN); + printf("FAN PIN UP\n"); + } else { + CLR_OUT_PIN(OUT_PORT,P1_27_FAN); + printf("FAN PIN DOWN\n"); + } + return 1; +} + +int oi_humidifier_wrfnc(ULOI_PARAM_coninfo void *context){ + uloi_uint_wrfnc(ULOI_ARG_coninfo context); + if (oi_humidifier == 1) { + SET_OUT_PIN(OUT_PORT,P1_28_HUMIDIFIER); + printf("HUM PIN UP\n"); + } else { + CLR_OUT_PIN(OUT_PORT,P1_28_HUMIDIFIER); + printf("HUM PIN DOWN\n"); + } + return 1; +} + +int oi_light_wrfnc(ULOI_PARAM_coninfo void *context){ + uloi_uint_wrfnc(ULOI_ARG_coninfo context); + if (oi_light == 1) { + SET_OUT_PIN(OUT_PORT,P1_29_LIGHT); + printf("LIGHT PIN UP\n"); + } else { + CLR_OUT_PIN(OUT_PORT,P1_29_LIGHT); + printf("LIGHT PIN DOWN\n"); + } + return 1; +} +//********************************************************* + +void send_data() { + int msgsend; + uchar *buf; + int i, len; + + len = DATA_BUF_LEN + 6; +// if (oi_period == 1) len = len + 6; + + // preparing of msg + buf = (uchar *) malloc(len*sizeof(uchar)); // NULL NULL NULL TEMPERATURE_CID len_data oi_temperature CID_HUM len_data oi_humidity + for (i=0; i<=2; i++) buf[i] = 0; + + if (oi_period == 1){ + int2buf(&buf[3],HEART_CID); + int2buf(&buf[5],2); + int2buf(&buf[7],status_val); + } + + msgsend = ul_send_query(ul_fd, ul_dyac->ul_dysa, UL_CMD_PDO, UL_BFL_NORE, (void*) buf, len); + printf("[I] DATA\n"); + free(buf); + ul_freemsg(ul_fd); +} + +void accept_SDO(void) { + // setting lan configuration + if ((ul_inepoll(ul_fd)>0) && (ul_acceptmsg(ul_fd, &msginfo)>=0)) { + if ((msginfo.cmd != UL_CMD_PDO) && (msginfo.sadr != 98)) { + if (!(msginfo.flg&(UL_BFL_PROC | UL_BFL_FAIL))) { + //waiting for msg from bus + if (uloi_process_msg(ULOI_ARG_coninfo (uloi_objdes_array_t*)&uloi_objdes_main, &msginfo)<0) { + //checking dynamic adresation + if (uldy_process_msg(ULDY_ARG_ul_dyac &msginfo)>=0){ + printf("message recieved - UL_CMD_NCS, sadr: %i, dadr: %i, cmd: %i\n",msginfo.sadr, msginfo.dadr, msginfo.cmd); + printf("server addr :%i\n",ul_dyac->ul_dysa); + } else { + ul_freemsg(ul_fd); + printf("problem in uldy_process_msg\n"); + } + } else { + printf("ULOI message processed\n"); + } + } else { + ul_freemsg(ul_fd); + } + } + } +} + +void setmyaddr(void){ + ul_setmyadr(ul_fd,98); +} + +void oiinit(void){ + oi_cid_fan=243; + oi_cid_humidifier=244; + oi_cid_light=245; + oi_period=1; + status_val = 5; +} + +void work_with(void){ + + PINSEL1 &= 0xFFFFB3FF; + + // u vetsi karbicky je SET z 0 do 3.3 + // u mensi je SET z -3.3 do 0 + // varpins yy + +// IO0SET = P0_21_BIT; +// IO0SET = P0_22_BIT; + + SET_OUT_PIN(OUT_PORT, P1_27_FAN); + CLR_OUT_PIN(OUT_PORT, P1_28_HUMIDIFIER); + SET_OUT_PIN(OUT_PORT, P1_29_LIGHT); + + IO0SET = LED1_BIT; //vypinani LED + IO0CLR = LED2_BIT; //zapinani LED + +// IO0CLR = LED1_BIT; +// IO0SET = LED2_BIT; +} diff --git a/app/control/board.h b/app/control/board.h new file mode 100644 index 0000000..3990f2d --- /dev/null +++ b/app/control/board.h @@ -0,0 +1,39 @@ +#ifndef _BOARD_H +#define _BOARD_H + +#include +#include + +#include "definitions.h" + +#define DATA_BUF_LEN 3 +#define SN 102 + +extern const ULOI_CODE uloi_objdes_array_t uloi_objdes_main; +extern uint16_t status_val; +extern uint16_t oi_fan; +extern uint16_t oi_cid_fan; +extern uint16_t oi_humidifier; +extern uint16_t oi_cid_humidifier; +extern uint16_t oi_light; +extern uint16_t oi_cid_light; +extern uint16_t oi_period; + +int oi_cid_fan_wrfnc(ULOI_PARAM_coninfo void *context); +int oi_cid_humidifier_wrfnc(ULOI_PARAM_coninfo void *context); +int oi_cid_light_wrfnc(ULOI_PARAM_coninfo void *context); + +int oi_fan_wrfnc(ULOI_PARAM_coninfo void *context); +int oi_humidifier_wrfnc(ULOI_PARAM_coninfo void *context); +int oi_light_wrfnc(ULOI_PARAM_coninfo void *context); + +int oi_period_wrfnc(ULOI_PARAM_coninfo void *context); + +void accept_SDO(void); +void setmyaddr(void); +void send_data(); +void adc2oi(void); +void oiinit(void); +void work_with(void); + +#endif diff --git a/app/control/definitions.c b/app/control/definitions.c new file mode 120000 index 0000000..16bbeff --- /dev/null +++ b/app/control/definitions.c @@ -0,0 +1 @@ +/home/stefic/BAP/build_ulan/ulan/embedded/hydro/app/sensor/definitions.c \ No newline at end of file diff --git a/app/control/definitions.h b/app/control/definitions.h new file mode 120000 index 0000000..021c6a2 --- /dev/null +++ b/app/control/definitions.h @@ -0,0 +1 @@ +/home/stefic/BAP/build_ulan/ulan/embedded/hydro/app/sensor/definitions.h \ No newline at end of file diff --git a/app/control/hydroponie.c b/app/control/hydroponie.c new file mode 120000 index 0000000..6773699 --- /dev/null +++ b/app/control/hydroponie.c @@ -0,0 +1 @@ +/home/stefic/BAP/build_ulan/ulan/embedded/hydro/app/sensor/hydroponie.c \ No newline at end of file diff --git a/app/control/hydroponie.h b/app/control/hydroponie.h new file mode 120000 index 0000000..d2c367f --- /dev/null +++ b/app/control/hydroponie.h @@ -0,0 +1 @@ +/home/stefic/BAP/build_ulan/ulan/embedded/hydro/app/sensor/hydroponie.h \ No newline at end of file diff --git a/app/control/hydroponieoi.c b/app/control/hydroponieoi.c new file mode 100644 index 0000000..56421c1 --- /dev/null +++ b/app/control/hydroponieoi.c @@ -0,0 +1,91 @@ +/* + OBJECT INTERFACE FOR CONTROL +*/ + +#include "board.h" + +#define I_FAN 400 +#define I_FAN_CID 410 +#define I_HUMIDIFIER 500 +#define I_HUMIDIFIER_CID 510 +#define I_LIGHT 600 +#define I_LIGHT_CID 610 +#define I_PERIOD 700 + + +uint16_t status_val; +uint16_t oi_fan; +uint16_t oi_cid_fan; +uint16_t oi_humidifier; +uint16_t oi_cid_humidifier; +uint16_t oi_light; +uint16_t oi_cid_light; +uint16_t oi_period; + +int status_rdfnc(ULOI_PARAM_coninfo void *context) +{ + return uloi_uint_rdfnc(ULOI_ARG_coninfo &status_val); +} + +int errclr_wrfnc(ULOI_PARAM_coninfo void *context) +{ + status_val=0; + return 1; +} + +/* description of input objects */ +const ULOI_CODE uloi_objdes_t uloid_objdes_DOII = +ULOI_GENOBJDES_RAW(ULOI_DOII,NULL,NULL_CODE,NULL,uloi_doii_fnc,(void*)&uloi_objdes_main) +/* description of output objects */ +const ULOI_CODE uloi_objdes_t uloid_objdes_DOIO = +ULOI_GENOBJDES_RAW(ULOI_DOIO,NULL,NULL_CODE,NULL,uloi_doio_fnc,(void*)&uloi_objdes_main) +/* ID numbers of recognized input objects */ +const ULOI_CODE uloi_objdes_t uloid_objdes_QOII = +ULOI_GENOBJDES_RAW(ULOI_QOII,NULL,NULL_CODE,NULL,uloi_qoii_fnc,(void*)&uloi_objdes_main) +/* ID numbers of recognized output objects */ +const ULOI_CODE uloi_objdes_t uloid_objdes_QOIO = +ULOI_GENOBJDES_RAW(ULOI_QOIO,NULL,NULL_CODE,NULL,uloi_qoio_fnc,(void*)&uloi_objdes_main) +/* object values read request */ +const ULOI_CODE uloi_objdes_t uloid_objdes_RDRQ = +ULOI_GENOBJDES_RAW(ULOI_RDRQ,NULL,NULL_CODE,NULL,uloi_rdrq_fnc,(void*)&uloi_objdes_main) + +ULOI_GENOBJDES(STATUS,ULOI_STATUS,"u2",status_rdfnc,&status_val,NULL_CODE,NULL) +ULOI_GENOBJDES(ERRCLR,ULOI_ERRCLR,"e",NULL_CODE,NULL,errclr_wrfnc,&status_val) + +ULOI_GENOBJDES(FAN,I_FAN,"u2",uloi_uint_rdfnc,&oi_fan,oi_fan_wrfnc,&oi_fan) +ULOI_GENOBJDES(FAN_CID,I_FAN_CID,"u2",uloi_uint_rdfnc,&oi_cid_fan,oi_cid_fan_wrfnc,&oi_cid_fan) + +ULOI_GENOBJDES(HUMIDIFIER,I_HUMIDIFIER,"u2",uloi_uint_rdfnc,&oi_humidifier,oi_humidifier_wrfnc,&oi_humidifier) +ULOI_GENOBJDES(HUMIDIFIER_CID,I_HUMIDIFIER_CID,"u2",uloi_uint_rdfnc,&oi_cid_humidifier,oi_cid_humidifier_wrfnc,&oi_cid_humidifier) + +ULOI_GENOBJDES(LIGHT,I_LIGHT,"u2",uloi_uint_rdfnc,&oi_light,oi_light_wrfnc,&oi_light) +ULOI_GENOBJDES(LIGHT_CID,I_LIGHT_CID,"u2",uloi_uint_rdfnc,&oi_cid_light,oi_cid_light_wrfnc,&oi_cid_light) + +ULOI_GENOBJDES(PERIOD,I_PERIOD,"u2",uloi_uint_rdfnc,&oi_period,oi_period_wrfnc,&oi_period) + +const uloi_objdes_t * ULOI_CODE uloi_objdes_main_items[]={ + &uloid_objdes_DOII, + &uloid_objdes_DOIO, + &uloid_objdes_QOII, + &uloid_objdes_QOIO, + &uloid_objdes_RDRQ, + + &uloid_objdes_STATUS, + &uloid_objdes_ERRCLR, + &uloid_objdes_FAN, + &uloid_objdes_FAN_CID, + &uloid_objdes_HUMIDIFIER, + &uloid_objdes_HUMIDIFIER_CID, + &uloid_objdes_LIGHT, + &uloid_objdes_LIGHT_CID, + &uloid_objdes_PERIOD + +}; + +const ULOI_CODE uloi_objdes_array_t uloi_objdes_main={ + { + (uloi_objdes_t **)uloi_objdes_main_items, + sizeof(uloi_objdes_main_items)/sizeof(uloi_objdes_main_items[0]), + -1 + } +}; diff --git a/app/control/load_usb.sh b/app/control/load_usb.sh new file mode 100755 index 0000000..4efb396 --- /dev/null +++ b/app/control/load_usb.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +usb_sendhex -d 0xdead -i 0x2263 -s 0x20000 -l 0x20000 -e; +sleep 2 ; +usb_sendhex -d 0xdead -i 0x2263 -s 0x20000 -f binary /home/stefic/BAP/build_ulan/ulan-build/arm-ul_usb1-ulad31/_compiled/bin/control-app.bin +usb_sendhex -d 0xdead -i 0x2263 -r ; diff --git a/app/control/ul_idstr.c b/app/control/ul_idstr.c new file mode 120000 index 0000000..75fedd0 --- /dev/null +++ b/app/control/ul_idstr.c @@ -0,0 +1 @@ +/home/stefic/BAP/build_ulan/ulan/embedded/hydro/app/sensor/ul_idstr.c \ No newline at end of file diff --git a/app/control/ul_idstr.h b/app/control/ul_idstr.h new file mode 120000 index 0000000..0e55400 --- /dev/null +++ b/app/control/ul_idstr.h @@ -0,0 +1 @@ +/home/stefic/BAP/build_ulan/ulan/embedded/hydro/app/sensor/ul_idstr.h \ No newline at end of file diff --git a/app/sensor/Makefile b/app/sensor/Makefile new file mode 100644 index 0000000..cafc99f --- /dev/null +++ b/app/sensor/Makefile @@ -0,0 +1,15 @@ +# Generic directory or leaf node makefile for OCERA make framework + +ifndef MAKERULES_DIR +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) ) +endif + +ifeq ($(MAKERULES_DIR),) +all : default +.DEFAULT:: + @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n" +else +include $(MAKERULES_DIR)/Makefile.rules +endif + +# DO NOT DELETE diff --git a/app/sensor/Makefile.omk b/app/sensor/Makefile.omk new file mode 100644 index 0000000..5c41961 --- /dev/null +++ b/app/sensor/Makefile.omk @@ -0,0 +1,33 @@ + +default_CONFIG = CONFIG_APP_SENSOR=n + +ifeq ($(CONFIG_APP_SENSOR),y) + +ULAN_ID=sensor + +default_CONFIG += CONFIG_ULOI_LT=x +default_CONFIG += CONFIG_ULAN_DY=x +default_CONFIG += MACH=$(MACH) +default_CONFIG += ULAN_ID=$(ULAN_ID) + +LOCAL_CONFIG_H = ulan_config.h + +INCLUDES += -I. + + +bin_PROGRAMS = sensor +sensor_SOURCES = hydroponie.c ul_idstr.c board.c hydroponieoi.c definitions.c + +ifeq ($(BUILD_OS),linux) +lib_LOADLIBES = uloi uldy ulan pthread rt +DEFS += -DOS_POSIX +else +sensor_MOREOBJS = $(USER_LIB_DIR)/system_stub.o +sensor_MOREOBJS += $(USER_LIB_DIR)/ivt.o +lib_LOADLIBES = uloi uldy bspbase ulan ul_drv lpciap keyval lpciap lpciap_kvpb mach_hal +endif + +# This selects linker script +link_VARIANTS = app + +endif \ No newline at end of file diff --git a/app/sensor/board.c b/app/sensor/board.c new file mode 100644 index 0000000..e51f83a --- /dev/null +++ b/app/sensor/board.c @@ -0,0 +1,186 @@ + +#include +#include +#include + +#include "board.h" + +adc_stat_t adcst; + +// OBJECT INTERFACE VARIABLES +uint16_t status_val; +int16_t oi_temperature; +uint16_t oi_cid_temp; +int16_t oi_humidity; +uint16_t oi_cid_hum; +uint16_t oi_period; + +// OBJECT INTERFACE FUNCTIONS +int oi_cid_temp_wrfnc(ULOI_PARAM_coninfo void *context){ + uloi_uint_wrfnc(ULOI_ARG_coninfo context); + return 1; +} + +int oi_cid_hum_wrfnc(ULOI_PARAM_coninfo void *context){ + uloi_uint_wrfnc(ULOI_ARG_coninfo context); + return 1; +} + +int oi_period_wrfnc(ULOI_PARAM_coninfo void *context){ + uloi_uint_wrfnc(ULOI_ARG_coninfo context); + return 1; +} + +void send_data() { + int msgsend; + uchar *buf; + int i, len; + + len = DATA_BUF_LEN; + if (oi_period == 1) len = len + 6; + + read_ADC(&adcst); + adc2oi(); + + //.preparing of msg + buf = (uchar *) malloc(len*sizeof(uchar)); // NULL NULL NULL TEMPERATURE_CID len_data oi_temperature CID_HUM len_data oi_humidity + for (i=0; i<=2; i++) buf[i] = 0; + + if (oi_period == 1){ + int2buf(&buf[3],HEART_CID); + int2buf(&buf[5],2); + int2buf(&buf[7],status_val); + int2buf(&buf[9],oi_cid_temp); + int2buf(&buf[11],2); + int2buf(&buf[13],oi_temperature); + int2buf(&buf[15],oi_cid_hum); + int2buf(&buf[17],2); + int2buf(&buf[19],oi_humidity); + } else { + int2buf(&buf[3],oi_cid_temp); + int2buf(&buf[5],2); + int2buf(&buf[7],oi_temperature); + int2buf(&buf[9],oi_cid_hum); + int2buf(&buf[11],2); + int2buf(&buf[13],oi_humidity); + } + + msgsend = ul_send_query(ul_fd, ul_dyac->ul_dysa, UL_CMD_PDO, UL_BFL_NORE, (void*) buf, len); + printf("[I] DATA\n"); + free(buf); + ul_freemsg(ul_fd); +} + +void accept_SDO(void) { + // setting lan configuration + if ((ul_inepoll(ul_fd)>0) && (ul_acceptmsg(ul_fd, &msginfo)>=0)) { + if ((msginfo.cmd != UL_CMD_PDO) && (msginfo.sadr != 99)) { + if (!(msginfo.flg&(UL_BFL_PROC | UL_BFL_FAIL))) { + //waiting for msg from bus + if (uloi_process_msg(ULOI_ARG_coninfo (uloi_objdes_array_t*)&uloi_objdes_main, &msginfo)<0) { + //checking dynamic adresation + if (uldy_process_msg(ULDY_ARG_ul_dyac &msginfo)>=0){ + printf("message recieved - UL_CMD_NCS, sadr: %i, dadr: %i, cmd: %i\n",msginfo.sadr, msginfo.dadr, msginfo.cmd); + printf("server addr :%i\n",ul_dyac->ul_dysa); + } else { + ul_freemsg(ul_fd); + printf("problem in uldy_process_msg\n"); + } + } else { + printf("ULOI message processed\n"); + } + } else { + ul_freemsg(ul_fd); + } + } + } +} + +void setmyaddr(void){ + ul_setmyadr(ul_fd,99); +} + +void adc2oi(void){ + oi_temperature = adcst.temp; + oi_humidity = adcst.hum; +} + +void oiinit(void){ + oi_cid_temp=233; + oi_cid_hum=234; + oi_period=2; + status_val = 5; +} + +void work_with(void){ + mstime_t time; + led1_time = current_time(); + led2_time = current_time(); +// adcst.read = 0; +// adcst.temp = 0; +// adcst.temp_tmp = 0; +// adcst.hum = 0; +// adcst.hum_tmp = 0; +// adcst.cnt = 0; + + time = current_time(); + + while(1){ + blink(); + read_ADC(&adcst); + + if((current_time()-time) > 1000){ + printf("AD0.1 %i\n", adcst.temp); + printf("AD0.2 %i\n", adcst.hum); + time = current_time(); + } + } +} + +void init_ADC (int selected){ + PINSEL1|= 0x05000000; // P0.28 and P0.29 set for AD0.1 and AD0.2 inputs + AD0CR &= 0x00000000; // Clear All Bit Control + switch (selected){ + case 1: AD0CR |= 0x00000002; // Select ADC = AIN1, CLKDive => Pclk/(x+1)< 4.5Mhz + break; + case 2: AD0CR |= 0x00000004; // Select ADC = AIN2 + break; + } + AD0CR |= 0x0000FF00; // ADC Clock = VBP(PCLK) / 7 1.55us + AD0CR &= 0xFFF1FFFF; // CLKS 11 ciclos de reloj Res Máx + AD0CR |= 0x00200000; // PDN = 1 = Active ADC Module +// AD0CR |= 0x00010000; // Burst = 1 = Continuing conversion +// AD0CR &= 0xFF3FFFFF; // TEST[1:0] = 00 = Modo normal +// AD0CR &= 0xF7FFFFFF; // EDGE = 0 = Flanco de bajada +// AD0STAT = 0x00000110; +} + +int read_ADC (adc_stat_t *adcst){ + init_ADC(1); + AD0CR |= 0x01000000; // start conversion + while (!(AD0GDR & (ADGDR_DONE))); // wait for DONE to go high + + adcst->read = AD0DR1; // get ADC data + adcst->read = ((adcst->read >>6) & 0x03FF); // extraction of result + adcst->temp_tmp += adcst->read; + + init_ADC(2); + AD0CR |= 0x01000000; // start conversion + while (!(AD0GDR & (ADGDR_DONE))); // wait for DONE to go high + + adcst->read = AD0DR2; + adcst->read = ((adcst->read >>6) & 0x03FF); // extraction of result + adcst->hum_tmp += adcst->read; + + adcst->cnt++; + if (adcst->cnt == 30){ + adcst->cnt = 0; + adcst->temp = adcst->temp_tmp/16; + adcst->hum = adcst->hum_tmp/16; + adcst->temp_tmp = 0; + adcst->hum_tmp = 0; + return 1; + } + + return 0; +} diff --git a/app/sensor/board.h b/app/sensor/board.h new file mode 100644 index 0000000..25eaa6e --- /dev/null +++ b/app/sensor/board.h @@ -0,0 +1,52 @@ +#ifndef _BOARD_H +#define _BOARD_H + +#include +#include + +#include "definitions.h" + +#define DATA_BUF_LEN 15 +#define SN 101 + +// OI +extern const ULOI_CODE uloi_objdes_array_t uloi_objdes_main; +extern uint16_t status_val; +extern int16_t oi_temperature; +extern uint16_t oi_cid_temp; +extern int16_t oi_humidity; +extern uint16_t oi_cid_hum; +extern uint16_t oi_period; + +int oi_cid_temp_wrfnc(ULOI_PARAM_coninfo void *context); +int oi_cid_hum_wrfnc(ULOI_PARAM_coninfo void *context); + +int oi_period_wrfnc(ULOI_PARAM_coninfo void *context); + +typedef struct +{ + int16_t read; + int16_t temp; + int16_t hum; + int16_t temp_tmp; + int16_t hum_tmp; + int cnt; +} adc_stat_t; + + +typedef struct +{ + +} adc_cal_t; + +void init_ADC (int); +int read_ADC (adc_stat_t *); + +void accept_SDO(void); +void setmyaddr(void); +void send_data(); +void adc2oi(void); +void oiinit(void); +void work_with(void); + +#endif diff --git a/app/sensor/definitions.c b/app/sensor/definitions.c new file mode 100644 index 0000000..3a16c11 --- /dev/null +++ b/app/sensor/definitions.c @@ -0,0 +1,172 @@ +#include +#include +#include +#include +#include +#include + +// #include +// #include +// #include +// #include + +#include "definitions.h" + +//variables +long sn = SN; + +#ifndef UL_WITHOUT_HANDLE +uloi_coninfo_t *coninfo=&uloi_coninfo_global; +ul_dyac_t *ul_dyac=&ul_dyac_global; +// kvpb_block_t *kvpb_block=&kvpb_block_global; +#endif + +// LED variables +int led1 = 200; +int led2 = 100; + +void long2buf(uchar *buf,unsigned long mod){ + buf[0]=mod>>0; + buf[1]=mod>>8; + buf[2]=mod>>16; + buf[3]=mod>>24; +} + +void int2buf(uchar *buf,int mod){ + buf[0]=mod>>0; + buf[1]=mod>>8; +} + +mstime_t current_time(){ + mstime_t ret = 0; + + #ifdef OS_POSIX + struct timespec tp; + if(clock_gettime(CLOCK_REALTIME, &tp) == 0){ + ret = tp.tv_sec*1000; + ret += tp.tv_nsec/1000000; + } + #else + lt_mstime_update(); + ret = actual_msec; + #endif + + return ret; +} + +void blink(void){ + #ifndef OS_POSIX + if(led1 == 0) IO0SET=LED1_BIT; + else if(led1 == 1) IO0CLR=LED1_BIT; + else if((current_time()-led1_time) > led1){ + IO0PIN=IO0PIN^LED1_BIT; + led1_time+=led1; + } + + if(led2 == 0) IO0SET=LED2_BIT; + else if(led2 == 1) IO0CLR=LED2_BIT; + else if((current_time()-led2_time) > led2){ + IO0PIN=IO0PIN^LED2_BIT; + led2_time+=led2; + } + #endif +} + +int all_init(void){ + // kvpb init +// kvpb_block->base=(uint8_t*)KEYVAL_START; +// kvpb_block->size=KEYVAL_PAGE_LEN; +// kvpb_block->flags=KVPB_DESC_DOUBLE|KVPB_DESC_CHUNKWO; +// kvpb_block->chunk_size=KVPB_CHUNK_SIZE; +// kvpb_block->erase=lpcisp_kvpb_erase; +// kvpb_block->copy=lpcisp_kvpb_copy; +// kvpb_block->flush=lpcisp_kvpb_flush; +// printf("Keyval ready\n"); + + /***********************************/ + // set configuration for device +// kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,1,&uaddr); +// kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_SN,4,&usn); +// +// kvpb_get_key(kvpb_block,KVPB_KEYID_ADC_CFG,sizeof(adc_cal_t),&adccal); +// kvpb_get_key(kvpb_block,KVPB_KEYID_CON_PARAM,sizeof(pid_con_param_t),&con_param); +// kvpb_get_key(kvpb_block,KVPB_KEYID_APPL_PARAM,sizeof(appl_param_t),&appl_param); +// printf("Keyval variables read\n"); + + //opening file descriptor + ul_fd = ul_open(NULL,NULL); + ul_fd1 = ul_open(NULL,NULL); + if ((ul_fd == UL_FD_INVALID) || (ul_fd1 == UL_FD_INVALID)){ + printf("error in creating ul_fd\n"); + return -1; + } + + //memory set and filter set + memset(&msginfo,0,sizeof(msginfo)); + addfilt=ul_addfilt(ul_fd,&msginfo); + if(addfilt<0) { + printf("spy_messages : add filter failed\n"); + return addfilt; + } + + setmyaddr(); + ul_setidstr(ul_fd,ul_idstr); + + // uLan object interface init + coninfo->cmd = UL_CMD_OISV; + coninfo->sn = SN; + coninfo->bsn = 0; + coninfo->ul_fd = ul_fd; + coninfo->ul_fd1 = ul_fd1; + + oiinit(); + + // uLan dyac init + uldy_init(ul_dyac,ul_fd,ul_save_sn,ul_save_adr,(char*)ul_idstr,sn); + + return 0; + +} + +void send_sn(void){ + int msgsend; + + //.preparing of msg + uchar buf_out[ULDY_TMBUF_LEN]; + buf_out[0]=ULNCS_ADR_RQ; + long2buf(&buf_out[1],sn); + + //address set and sign on the ulan + msgsend = ul_send_command(ul_fd, msginfo.dadr, UL_CMD_NCS, UL_BFL_NORE, (void*) buf_out, ULDY_TMBUF_LEN); + printf("[I] sn was send\n"); + ul_freemsg(ul_fd); +} + +void heartbeat(void){ + //int period; + int msgsend, i; + int len = HEART_BUF_LEN; + uchar *buf; + + //.preparing of msg + buf = (uchar *) malloc(len*sizeof(uchar)); // NULL NULL NULL CID_HEART status_val + for (i=0; i<=2; i++) buf[i] = 0; + int2buf(&buf[3],HEART_CID); + int2buf(&buf[5],2); + int2buf(&buf[7],status_val); + + msgsend = ul_send_command(ul_fd, ul_dyac->ul_dysa, UL_CMD_PDO, UL_BFL_NORE, (void*) buf, HEART_BUF_LEN); + printf("[I] BEAT\n"); + free(buf); +} + +char ul_save_sn(uint32_t usn){ +// kvpb_set_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn); + return 0; +} + +char ul_save_adr(uint8_t uaddr){ +// unsigned int v=uaddr; +// kvpb_set_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&v); + return 0; +} diff --git a/app/sensor/definitions.h b/app/sensor/definitions.h new file mode 100644 index 0000000..af5144e --- /dev/null +++ b/app/sensor/definitions.h @@ -0,0 +1,62 @@ +#ifndef _DEFS_H +#define _DEFS_H + +#include +#include + +#include "hydroponie.h" +#include "board.h" + +// CONSTANTS +#define ULDY_TMBUF_LEN 5 + +#define HEART_BUF_LEN 9 +#define HEART_CID 1023 + +#define UL_DEV "/dev/ulan" + +// #define KVPB_KEYID_ADC_CFG 0x101 +// #define KVPB_KEYID_CON_PARAM 0x102 +// #define KVPB_KEYID_APPL_PARAM 0x103 + +extern long sn; +uchar server_adr; +ul_msginfo msginfo; +int addfilt; + +ul_fd_t ul_fd; +ul_fd_t ul_fd1; + +uloi_coninfo_t uloi_coninfo_global; +ul_dyac_t ul_dyac_global; +// kvpb_block_t kvpb_block_global; + +#ifndef UL_WITHOUT_HANDLE +extern uloi_coninfo_t *coninfo; +extern ul_dyac_t *ul_dyac; +//extern kvpb_block_t *kvpb_block; +#endif + +#ifdef OS_POSIX + typedef unsigned long mstime_t; +#else + typedef lt_mstime_t mstime_t; +#endif + +mstime_t led1_time, led2_time; + +void long2buf(uchar *buf,unsigned long mod); +void int2buf(uchar *buf,int mod); + +mstime_t current_time(); +void blink(void); + +int all_init(void); +void send_sn(void); +void heartbeat(void); + +char ul_save_sn(uint32_t usn); +char ul_save_adr(uint8_t uaddr); + + +#endif diff --git a/app/sensor/hydroponie.c b/app/sensor/hydroponie.c new file mode 100644 index 0000000..341732a --- /dev/null +++ b/app/sensor/hydroponie.c @@ -0,0 +1,101 @@ +/*************************************************************************** + * Copyright (C) 2008 by stefic * + * stefaj1@fel.cvut.cz * + * * + * 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. * + ***************************************************************************/ + +//#define OS_POSIX + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include +#include + +//INCLUDE IN CURRENT DIRECTORY +#include "hydroponie.h" + +void loop(void){ + mstime_t ltime, l2time; + mstime_t ctime; + + led1_time = current_time(); + led2_time = current_time(); + + while(1){ + blink(); + send_sn(); + ltime = current_time(); + while(1){ + ctime = current_time(); + if((ctime-ltime) > 1000){ + break; + } + #ifdef OS_POSIX + usleep(1); + #endif + accept_SDO(); + } + if (ul_dyac->ul_dysa != 0) break; + } + + ltime = current_time(); + l2time = current_time(); + + while(1){ + blink(); + ctime = current_time(); + + if (oi_period == 1){ + if((ctime-ltime) > 1000){ + send_data(); + ltime = current_time(); + } + } else { + if((ctime-ltime) > 1000){ + heartbeat(); + ltime = current_time(); + } + if((ctime-l2time) > 1000*oi_period){ + send_data(); + l2time = current_time(); + } + } + accept_SDO(); + #ifdef OS_POSIX + usleep(1); + #endif + } +} + +int main(int argc, char *argv[]) { + + all_init(); + + loop(); + +// work_with(); + + ul_close(ul_fd); + ul_close(ul_fd1); + + return EXIT_SUCCESS; +} diff --git a/app/sensor/hydroponie.h b/app/sensor/hydroponie.h new file mode 100644 index 0000000..7b9cba2 --- /dev/null +++ b/app/sensor/hydroponie.h @@ -0,0 +1,10 @@ +#ifndef _HYDROPONIE_H +#define _HYDROPONIE_H + +#include +#include + +#include "definitions.h" +#include "ul_idstr.h" + +#endif /* HYDRO */ diff --git a/app/sensor/hydroponieoi.c b/app/sensor/hydroponieoi.c new file mode 100644 index 0000000..03e529a --- /dev/null +++ b/app/sensor/hydroponieoi.c @@ -0,0 +1,82 @@ +/* + OBJECT INTERFACE FOR SENSOR +*/ + +#include "board.h" + +#define I_TEMPERATURE 100 +#define I_TEMPERATURE_CID 110 +#define I_HUMIDITY 200 +#define I_HUMIDITY_CID 210 +#define I_PERIOD 300 + + +uint16_t status_val; +int16_t oi_temperature; +uint16_t oi_cid_temp; +int16_t oi_humidity; +uint16_t oi_cid_hum; +uint16_t oi_period; + +int status_rdfnc(ULOI_PARAM_coninfo void *context) +{ + return uloi_uint_rdfnc(ULOI_ARG_coninfo &status_val); +} + +int errclr_wrfnc(ULOI_PARAM_coninfo void *context) +{ + status_val=0; + return 1; +} + +/* description of input objects */ +const ULOI_CODE uloi_objdes_t uloid_objdes_DOII = +ULOI_GENOBJDES_RAW(ULOI_DOII,NULL,NULL_CODE,NULL,uloi_doii_fnc,(void*)&uloi_objdes_main) +/* description of output objects */ +const ULOI_CODE uloi_objdes_t uloid_objdes_DOIO = +ULOI_GENOBJDES_RAW(ULOI_DOIO,NULL,NULL_CODE,NULL,uloi_doio_fnc,(void*)&uloi_objdes_main) +/* ID numbers of recognized input objects */ +const ULOI_CODE uloi_objdes_t uloid_objdes_QOII = +ULOI_GENOBJDES_RAW(ULOI_QOII,NULL,NULL_CODE,NULL,uloi_qoii_fnc,(void*)&uloi_objdes_main) +/* ID numbers of recognized output objects */ +const ULOI_CODE uloi_objdes_t uloid_objdes_QOIO = +ULOI_GENOBJDES_RAW(ULOI_QOIO,NULL,NULL_CODE,NULL,uloi_qoio_fnc,(void*)&uloi_objdes_main) +/* object values read request */ +const ULOI_CODE uloi_objdes_t uloid_objdes_RDRQ = +ULOI_GENOBJDES_RAW(ULOI_RDRQ,NULL,NULL_CODE,NULL,uloi_rdrq_fnc,(void*)&uloi_objdes_main) + +ULOI_GENOBJDES(STATUS,ULOI_STATUS,"u2",status_rdfnc,&status_val,NULL_CODE,NULL) +ULOI_GENOBJDES(ERRCLR,ULOI_ERRCLR,"e",NULL_CODE,NULL,errclr_wrfnc,&status_val) + +ULOI_GENOBJDES(TEMPERATURE,I_TEMPERATURE,"s2",uloi_int_rdfnc,&oi_temperature,NULL_CODE,NULL) +ULOI_GENOBJDES(TEMPERATURE_CID,I_TEMPERATURE_CID,"u2",uloi_uint_rdfnc,&oi_cid_temp,oi_cid_temp_wrfnc,&oi_cid_temp) + +ULOI_GENOBJDES(HUMIDITY,I_HUMIDITY,"s2",uloi_int_rdfnc,&oi_humidity,NULL_CODE,NULL) +ULOI_GENOBJDES(HUMIDITY_CID,I_HUMIDITY_CID,"u2",uloi_uint_rdfnc,&oi_cid_hum,oi_cid_hum_wrfnc,&oi_cid_hum) + +ULOI_GENOBJDES(PERIOD,I_PERIOD,"u2",uloi_uint_rdfnc,&oi_period,oi_period_wrfnc,&oi_period) + +const uloi_objdes_t * ULOI_CODE uloi_objdes_main_items[]={ + &uloid_objdes_DOII, + &uloid_objdes_DOIO, + &uloid_objdes_QOII, + &uloid_objdes_QOIO, + &uloid_objdes_RDRQ, + + &uloid_objdes_STATUS, + &uloid_objdes_ERRCLR, + &uloid_objdes_TEMPERATURE, + &uloid_objdes_TEMPERATURE_CID, + &uloid_objdes_HUMIDITY, + &uloid_objdes_HUMIDITY_CID, + &uloid_objdes_PERIOD + +}; + +const ULOI_CODE uloi_objdes_array_t uloi_objdes_main={ + { + (uloi_objdes_t **)uloi_objdes_main_items, + sizeof(uloi_objdes_main_items)/sizeof(uloi_objdes_main_items[0]), + -1 + } +}; diff --git a/app/sensor/load_usb.sh b/app/sensor/load_usb.sh new file mode 100755 index 0000000..915a536 --- /dev/null +++ b/app/sensor/load_usb.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +usb_sendhex -d 0xdead -i 0x2263 -s 0x20000 -l 0x20000 -e; +sleep 2 ; +usb_sendhex -d 0xdead -i 0x2263 -s 0x20000 -f binary /home/stefic/BAP/build_ulan/ulan-build/arm-ul_usb1-ulad31/_compiled/bin/sensor-app.bin +usb_sendhex -d 0xdead -i 0x2263 -r ; diff --git a/app/sensor/ul_idstr.c b/app/sensor/ul_idstr.c new file mode 100644 index 0000000..3c13d6c --- /dev/null +++ b/app/sensor/ul_idstr.c @@ -0,0 +1,27 @@ +#include + +#define __STRINGIFY(x) #x /* stringify without expanding x */ +#define STRINGIFY(x) __STRINGIFY(x) /* expand x, then stringify */ + +#ifdef CONFIG_ULAN_DY + #define UL_DYC " .dy" +#else + #define UL_DYC +#endif + +#ifdef CONFIG_ULOI_LT + #define UL_OIC " .oi" +#else + #define UL_OIC +#endif + +#define NAME ".mt " \ + STRINGIFY(ULAN_ID) \ + " .uP " \ + STRINGIFY(MACH) \ + UL_DYC \ + UL_OIC \ + " .co " \ + __DATE__ " " __TIME__ + +const char *ul_idstr = NAME; diff --git a/app/sensor/ul_idstr.h b/app/sensor/ul_idstr.h new file mode 100644 index 0000000..2221d1d --- /dev/null +++ b/app/sensor/ul_idstr.h @@ -0,0 +1,14 @@ +#ifndef _UL_IDSTR_H +#define _UL_IDSTR_H + +#ifdef __cplusplus +/*extern "C" {*/ +#endif + +extern const char *ul_idstr; + +#ifdef __cplusplus +/*}*/ /* extern "C"*/ +#endif + +#endif /* _UL_IDSTR_H */ -- 2.39.2