From bed925d8e3e07724aea019d2e03162750f04dd4d Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Thu, 7 Feb 2019 23:25:05 -0800 Subject: [PATCH 1/2] Added isegHAL support headers --- isegHALSup/Makefile | 30 +++++++++ isegHALSup/isegapi.h | 48 ++++++++++++++ isegHALSup/isegclientapi.h | 31 +++++++++ isegHALSup/isegcommon.h | 127 +++++++++++++++++++++++++++++++++++++ 4 files changed, 236 insertions(+) create mode 100755 isegHALSup/Makefile create mode 100644 isegHALSup/isegapi.h create mode 100644 isegHALSup/isegclientapi.h create mode 100644 isegHALSup/isegcommon.h diff --git a/isegHALSup/Makefile b/isegHALSup/Makefile new file mode 100755 index 0000000..384ff91 --- /dev/null +++ b/isegHALSup/Makefile @@ -0,0 +1,30 @@ +TOP=.. +include $(TOP)/configure/CONFIG +#---------------------------------------- +# ADD MACRO DEFINITIONS AFTER THIS LINE +#============================= + +# The files in this directory are installed first because they are needed to build libisegHAL-client +INC += isegapi.h +INC += isegclientapi.h +INC += isegcommon.h + +# Note, the following files were manually copied from the iSeg apalis image +# to this directory after building +ifeq (linux-arm-apalis, $(findstring linux-arm-apalis, $(T_A))) +#LIB_INSTALLS_Linux += ../os/linux-arm-apalis/libisegHAL-client.so +#LIB_INSTALLS_Linux += ../os/linux-arm-apalis/libisegHAL-client.so.1 +#LIB_INSTALLS_Linux += ../os/linux-arm-apalis/libisegHAL-client.so.1.1 +#LIB_INSTALLS_Linux += ../os/linux-arm-apalis/libisegHAL-client.so.1.1.2 +#LIB_INSTALLS_Linux += ../os/linux-arm-apalis/libisegHAL.so +#LIB_INSTALLS_Linux += ../os/linux-arm-apalis/libisegHAL.so.1 +#LIB_INSTALLS_Linux += ../os/linux-arm-apalis/libisegHAL.so.1.1 +#LIB_INSTALLS_Linux += ../os/linux-arm-apalis/libisegHAL.so.1.1.2 +endif + +#============================= + +include $(TOP)/configure/RULES +#---------------------------------------- +# ADD RULES AFTER THIS LINE + diff --git a/isegHALSup/isegapi.h b/isegHALSup/isegapi.h new file mode 100644 index 0000000..af77ea3 --- /dev/null +++ b/isegHALSup/isegapi.h @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2016 - 2017 iseg Spezialelektronik GmbH +** Contact: http://www.iseg-hv.com +** Contact: sales@iseg-hv.com +** +** This file is part of the isegHAL project +** +** Commercial License Usage +** Licensees holding valid commercial licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained +** in a written agreement between you and iseg. For licensing terms +** and conditions contact sales@iseg-hv.com. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +****************************************************************************/ + +#ifndef ISEGAPI_H +#define ISEGAPI_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "isegcommon.h" + +unsigned int iseg_getVersion(void); +const char *iseg_getVersionString(void); + +IsegResult iseg_connect(const char *name, const char *interface, void *reserved); +IsegResult iseg_disconnect(const char *name); +IsegResult iseg_setItem(const char *name, const char *object, const char *value); +IsegItem iseg_getItem(const char *name, const char *object); +IsegItemProperty iseg_getItemProperty(const char *name, const char *object); + +#ifdef __cplusplus + } +#endif + +#endif // ISEGAPI_H diff --git a/isegHALSup/isegclientapi.h b/isegHALSup/isegclientapi.h new file mode 100644 index 0000000..bae66fe --- /dev/null +++ b/isegHALSup/isegclientapi.h @@ -0,0 +1,31 @@ +/**************************************************************************** +** +** Copyright (C) 2016 - 2017 iseg Spezialelektronik GmbH +** Contact: http://www.iseg-hv.com +** Contact: sales@iseg-hv.com +** +** This file is part of the isegHAL project +** +** Commercial License Usage +** Licensees holding valid commercial licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained +** in a written agreement between you and iseg. For licensing terms +** and conditions contact sales@iseg-hv.com. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +****************************************************************************/ + +#ifndef ISEGCLIENTAPI_H +#define ISEGCLIENTAPI_H + +#include "isegapi.h" + +#endif // ISEGCLIENTAPI_H diff --git a/isegHALSup/isegcommon.h b/isegHALSup/isegcommon.h new file mode 100644 index 0000000..492bda6 --- /dev/null +++ b/isegHALSup/isegcommon.h @@ -0,0 +1,127 @@ +/**************************************************************************** +** +** Copyright (C) 2016 - 2017 iseg Spezialelektronik GmbH +** Contact: http://www.iseg-hv.com +** Contact: sales@iseg-hv.com +** +** This file is part of the isegHAL project +** +** Commercial License Usage +** Licensees holding valid commercial licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained +** in a written agreement between you and iseg. For licensing terms +** and conditions contact sales@iseg-hv.com. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +****************************************************************************/ + +#ifndef ISEG_COMMON_H +#define ISEG_COMMON_H + +#define INTERFACE_NAME_SIZE 128 +#define INTERFACE_TYPE_SIZE 128 + +#define FULLY_QUALIFIED_OBJECT_SIZE 128 +#define OBJECT_NAME_SIZE 32 +#define VALUE_SIZE 200 +#define DATA_TYPE_SIZE 5 +#define UNIT_SIZE 4 +#define ACCESS_SIZE 3 +#define QUALITY_SIZE 4 +#define TIME_SIZE 25 + +#define WRITE_READ_SIZE 20 +#define MAX_READ_MESSAGES 10 +#define NO_BIT_ARRAY_INDEX 32 +#define NO_FLOAT_ARRAY_INDEX NO_BIT_ARRAY_INDEX + 1 + +#define ISEG_ITEM_QUALITY_INVALID "000" +#define ISEG_ITEM_QUALITY_INITIALIZE "001" +#define ISEG_ITEM_QUALITY_OK "002" +#define ISEG_ITEM_QUALITY_COMMUNICATION_BAD "003" +#define ISEG_ITEM_QUALITY_ERROR "004" + +#define UDS_FILE "/tmp/iseghal.uds" + +#ifndef UNREFERENCED_PARAMETER +# define UNREFERENCED_PARAMETER(P) (void)(P) +#endif + +enum { + DataCacheMaxLines = 16, + DataCacheMaxCrates = 16, + DataCacheMaxModules = 64, + DataCacheMaxChannels = 48 +}; + +typedef enum KSupplyVoltages { + VCC_POSITIVE_EXTERN = 0, ///< +24 Volt external + VCC_NEGATIVE_EXTERN = 1, ///< -24 Volt external + VCC_LOGIC_EXTERN = 2, ///< 5..6 Volt external + VCC_POSITIVE_OPV = 3, ///< +12..15 Volt internal + VCC_NEGATIVE_OPV = 4, ///< -12..-15 Volt internal + VCC_LOGIC_5V_INTERN = 5, ///< +5 Volt internal + VCC_LOGIC_3V_INTERN = 6, ///< +3.3 Volt internal + VCC_EXTERN_AC_POWER = 7, ///< 230 / 110 Volt AC Power line external + VCC_BATTERY = 8, ///< 24 Volt UPS battery + VCC_ARRAY_SIZE +} KSupplyVoltages; + +typedef enum KInternalTemperatures { + INTERNAL_TEMPERATURE_ARRAY_SIZE = 9 +} KInternalTemperatures; + +typedef enum IsegLogLevel { + LogErrors = 1, ///< Log CAN bus error messages, loss of communication + LogInformation = 2, ///< Log state of initialising, switch on/off live insertion mode + LogApiRead = 4, ///< Log API read accesses + LogApiWrite = 8, ///< Log API write accesses + LogCanReceive = 32, ///< Log CAN receive messages (CANRX) + LogCanReadRequest = 64, ///< Log CAN read requests messages (CANRQ) + LogCanWriteRequest = 128 ///< Log CAN write request messages (CANTX) +} IsegLogLevel; + +typedef enum IsegResult { + ISEG_OK = 0, ///< The function returned without problems + ISEG_ERROR = 1, ///< The function returned an error + ISEG_WRONG_SESSION_NAME, ///< The iseg_connect() parameter name is already in use + ISEG_WRONG_USER, ///< The remote iseg_connect() user name is invalid + ISEG_WRONG_PASSWORD, ///< The remote iseg_connect() password is invalid + ISEG_NOT_AUTHORIZED, ///< The remote access is not allowed due to wrong user name or password + ISEG_NO_SSL_SUPPORT ///< The iseg_connect() failed due to missing SSL libraries +} IsegResult; + +typedef struct IsegItem { + char object[FULLY_QUALIFIED_OBJECT_SIZE]; //line.module.channel.item 0.0.1.VoltageSet + char value[VALUE_SIZE]; + char quality[QUALITY_SIZE]; + char timeStampLastRefreshed[TIME_SIZE]; + char timeStampLastChanged[TIME_SIZE]; +} IsegItem; +#define EmptyIsegItem { "" ,"" , "", "", ""} + +typedef struct IsegItemProperty { + char object[FULLY_QUALIFIED_OBJECT_SIZE]; //line.module.channel.item 0.0.1.VoltageSet + char type[DATA_TYPE_SIZE]; // "R4", "UI4", "STR", "BOOL" + char unit[UNIT_SIZE]; // "V", "A", "C", "%", "%/s", "s" + char access[ACCESS_SIZE]; // "R", "W", "RW" + char quality[QUALITY_SIZE]; +} IsegItemProperty; +#define EmptyIsegItemProperty { "", "", "", "", "" } + +#define TIME_STAMP 1 +#define TIME_OUT_ECH4XA_BACK_PLANE 2000 +#define TIME_OUT_MODULE_LOG_ON 3000 + +#define LOG_PATH "/tmp" + +#endif // ISEG_COMMON_H + From f97442e610ce70ca33bf808822914f1f988f8b02 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Fri, 8 Feb 2019 22:28:22 -0800 Subject: [PATCH 2/2] Install isegHAL linux-arm-apalis libs --- isegHALSup/Makefile | 1 + .../os/linux-arm-apalis/libisegHAL-client.so | 1 + .../os/linux-arm-apalis/libisegHAL-client.so.1 | 1 + .../linux-arm-apalis/libisegHAL-client.so.1.1 | 1 + .../linux-arm-apalis/libisegHAL-client.so.1.1.2 | Bin 0 -> 5160 bytes isegHALSup/os/linux-arm-apalis/libisegHAL.so | 1 + isegHALSup/os/linux-arm-apalis/libisegHAL.so.1 | 1 + .../os/linux-arm-apalis/libisegHAL.so.1.1 | 1 + .../os/linux-arm-apalis/libisegHAL.so.1.1.2 | Bin 0 -> 15668 bytes 9 files changed, 7 insertions(+) create mode 120000 isegHALSup/os/linux-arm-apalis/libisegHAL-client.so create mode 120000 isegHALSup/os/linux-arm-apalis/libisegHAL-client.so.1 create mode 120000 isegHALSup/os/linux-arm-apalis/libisegHAL-client.so.1.1 create mode 100755 isegHALSup/os/linux-arm-apalis/libisegHAL-client.so.1.1.2 create mode 120000 isegHALSup/os/linux-arm-apalis/libisegHAL.so create mode 120000 isegHALSup/os/linux-arm-apalis/libisegHAL.so.1 create mode 120000 isegHALSup/os/linux-arm-apalis/libisegHAL.so.1.1 create mode 100755 isegHALSup/os/linux-arm-apalis/libisegHAL.so.1.1.2 diff --git a/isegHALSup/Makefile b/isegHALSup/Makefile index 384ff91..2453e54 100755 --- a/isegHALSup/Makefile +++ b/isegHALSup/Makefile @@ -12,6 +12,7 @@ INC += isegcommon.h # Note, the following files were manually copied from the iSeg apalis image # to this directory after building ifeq (linux-arm-apalis, $(findstring linux-arm-apalis, $(T_A))) +LIB_INSTALLS_Linux += $(wildcard ../os/linux-arm-apalis/libisegHAL*) #LIB_INSTALLS_Linux += ../os/linux-arm-apalis/libisegHAL-client.so #LIB_INSTALLS_Linux += ../os/linux-arm-apalis/libisegHAL-client.so.1 #LIB_INSTALLS_Linux += ../os/linux-arm-apalis/libisegHAL-client.so.1.1 diff --git a/isegHALSup/os/linux-arm-apalis/libisegHAL-client.so b/isegHALSup/os/linux-arm-apalis/libisegHAL-client.so new file mode 120000 index 0000000..c7a4969 --- /dev/null +++ b/isegHALSup/os/linux-arm-apalis/libisegHAL-client.so @@ -0,0 +1 @@ +libisegHAL-client.so.1.1.2 \ No newline at end of file diff --git a/isegHALSup/os/linux-arm-apalis/libisegHAL-client.so.1 b/isegHALSup/os/linux-arm-apalis/libisegHAL-client.so.1 new file mode 120000 index 0000000..c7a4969 --- /dev/null +++ b/isegHALSup/os/linux-arm-apalis/libisegHAL-client.so.1 @@ -0,0 +1 @@ +libisegHAL-client.so.1.1.2 \ No newline at end of file diff --git a/isegHALSup/os/linux-arm-apalis/libisegHAL-client.so.1.1 b/isegHALSup/os/linux-arm-apalis/libisegHAL-client.so.1.1 new file mode 120000 index 0000000..c7a4969 --- /dev/null +++ b/isegHALSup/os/linux-arm-apalis/libisegHAL-client.so.1.1 @@ -0,0 +1 @@ +libisegHAL-client.so.1.1.2 \ No newline at end of file diff --git a/isegHALSup/os/linux-arm-apalis/libisegHAL-client.so.1.1.2 b/isegHALSup/os/linux-arm-apalis/libisegHAL-client.so.1.1.2 new file mode 100755 index 0000000000000000000000000000000000000000..43cefe77da00d9b7b3e7942fc4fd8c8e1a128134 GIT binary patch literal 5160 zcmbtYdu&uy8b33gw$q`lwYIe&nrTb5f*k>Ix0+o;%W(Umz_PeovN6MS=F%CR&J6e7 zl4+s4HA{SKAfWIEMib43UCE|hF%cgTgt+d8tdg(+pQ~;I7OK(*2IxdxW`Dmsb0*hO zH*WU8*YA10?>n#WoIAf+xk|CwY(lm?(I6zZ48muwF*W(igj*CsccYju3Lv6R!Wd|R zBLlKOShMXd7J`sZu1uKzP1$_N0SR>22cTc-?Lbz&*&(BsF)F}ISO9y1)U6#if;$jT zf)hG|)c*{6u-|HCd`M|m0muWiuD(}1H1tIGyZzJM&21m|{&e5;uQvR$>P@J=(U4BI zxj|tV*;Wo}b(Ryt4f_5Ze!GRQ1--|@yFq_o;py*e4u2(w|0;*iE-K{gUuj90{QMlg zE{9)~!z&j4TJ*oq!qZn)1K^9nvz3X9 zsaL_@X5m{PKb~2@a(Fob{;%*?20Qv20QSRq0&?mAWJrOmn`)-Xdknq!iKN22jXyLdK(}Zqd&{{fvFs#cSm`oiGbVG}BQh_6CR0JY1T}|6U+is|R z+2MSPS*yk3s%8ubpBnTVeymoHuBR6ZA`F6OzY@S&PzXSC4Ldg$6)jL~j}(Xk>gEEt z1=ro%Qk%H%jtwm<-@fqb*~hoNyz^q|JLd*l|M-VGaV+t#1@CX}p8wgY>C%as`qMAE zc7OHcTOqUlu+F8cogFpr`~KN*bpQLm$L=}hV!dKpltyNc8ql&1RfNMOjCFlRzxPIA z(obdZGa0-en6=>mF(zSz7?W_27zO+VVw|(X#BlyHag`8n0au~lNn+TYCdS0QM~rjx zAu-O&7%|StC&V~k6T~=F7l@JJ3~{LtmxyuqB#BXAz9wd2!Gu>`hjk&wpq<2+Naym# zPwy1sbLa4p3CCFDxMS?;@zSwfW6qh^#y>=U;%~do*#5rb%!gMFk4yTrg?`IIzhR*d zTj&=o^oWJtZ=s*E(0eWP4hy~ALT|IshJ}t;=pg8d#ZQk{xSt-+TfA$`?%s1AyYB2w zsoQPGQ>o9K7~dzURLa>=)H&!aYTxS3TY75VfVW^#{`&=;Z+2hzd_h~nTiqIO6-SR_ z%Jo-79Bt8c&_oIJ3Ce=Yc7e+Cz4|K zptng8^`pt+wL6ogYg4mgI&WlHX@oD*iiHjYE!e0 z=@LXcGBNXTO_$@jH8Zx-l8fc8A@8$EF?P*~#>9zaxri$#l2v7!@pqnE)b32yu04^w zX>n@y!jx!Oys`YB(b~I|)a+;A{(Q2m^V;^Mp|jls=B%BYvbm*ySLZrqPP^26Fm>_# z1onIqb1{fJZOO$V zLAtWdK2q70@K&x)&2FD^BbUQdL*5!i)QxOdsMtpBiW~E=4ShsiUTvD5W6r~`r^t;= ziMj@5F6N_dV`_GAsss_^N5s)m^YIH+?$H$Sr2%HJ6U|GrBc#}n!9?)YgbAxK8E$NPgR+jy*SB;Glm*v#$YN#us;oTtT^yfomu0j!yxM<#=d+8Hent3eB=Gc?~ZOLn8Pv1FJDc?sv!g^Y5=%y%zKk>yW{AL zYsh^2%>(BBh))#r9l-mZ_v8&39(631fFGQ_*kRy*1JmbK;P=2|C?*fl|I~Olvo+)1 zd=T(M+iB$f{{Y`QxT4Lm^1G)u774nsIhH`yybOQ*s=p^JYzsl=|G2SP6u1hTowg#o zE3epA?zqlYVXL%N*{;v4w#~E8x7FId`(?}BCd5Z?JaSBU^bj6zhQCL6qA^4D^hWzV zJ^kTGurVAIp5Q=KALvVCLldSpIlf0=Ly$fo%F<6* z?5w}1(1uO+c@{M1g!9kebol!X1CeK=9rHa1V0_aKb#5<;t@HtLmVVJXBdN~e$Gwp|62r}8EzX=F9 zZu;Zz3&n8m1}&Skn}h&MpKY|`zL!nfInr~=?PazG*xe}^VCKZe8X#%%_vOTuI%4J~ N+Ys!mzx_zN{{S7ClW+h4 literal 0 HcmV?d00001 diff --git a/isegHALSup/os/linux-arm-apalis/libisegHAL.so b/isegHALSup/os/linux-arm-apalis/libisegHAL.so new file mode 120000 index 0000000..a8eb32b --- /dev/null +++ b/isegHALSup/os/linux-arm-apalis/libisegHAL.so @@ -0,0 +1 @@ +libisegHAL.so.1.1.2 \ No newline at end of file diff --git a/isegHALSup/os/linux-arm-apalis/libisegHAL.so.1 b/isegHALSup/os/linux-arm-apalis/libisegHAL.so.1 new file mode 120000 index 0000000..a8eb32b --- /dev/null +++ b/isegHALSup/os/linux-arm-apalis/libisegHAL.so.1 @@ -0,0 +1 @@ +libisegHAL.so.1.1.2 \ No newline at end of file diff --git a/isegHALSup/os/linux-arm-apalis/libisegHAL.so.1.1 b/isegHALSup/os/linux-arm-apalis/libisegHAL.so.1.1 new file mode 120000 index 0000000..a8eb32b --- /dev/null +++ b/isegHALSup/os/linux-arm-apalis/libisegHAL.so.1.1 @@ -0,0 +1 @@ +libisegHAL.so.1.1.2 \ No newline at end of file diff --git a/isegHALSup/os/linux-arm-apalis/libisegHAL.so.1.1.2 b/isegHALSup/os/linux-arm-apalis/libisegHAL.so.1.1.2 new file mode 100755 index 0000000000000000000000000000000000000000..65cd239d8ee54c366bbefc436681d60ba0660caa GIT binary patch literal 15668 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