diff options
| author | MDC Service <michael.schmid@mdc-service.de> | 2022-05-26 10:34:22 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-26 10:34:22 +0200 |
| commit | c3c24556605f92c19d633a5da58abbdb60a1a8da (patch) | |
| tree | 81c8a426c892a9901c030283a79befcd57e80d10 /software/drivers | |
| parent | c4a8a10ba463b77cc4c406d3d1fdd4892977a43f (diff) | |
Initial check in HMI driver
Diffstat (limited to 'software/drivers')
| -rw-r--r-- | software/drivers/HMI.cpp | 230 | ||||
| -rw-r--r-- | software/drivers/HMI.h | 116 |
2 files changed, 346 insertions, 0 deletions
diff --git a/software/drivers/HMI.cpp b/software/drivers/HMI.cpp new file mode 100644 index 0000000..1c316a1 --- /dev/null +++ b/software/drivers/HMI.cpp @@ -0,0 +1,230 @@ +/* + * HMI.cpp + * + * Created on: 17.08.2021 + * Author: steffen + * SPDX-FileCopyrightText: 2022 MDC Service <info@mdc-service.de> + * SPDX-License-Identifier: GPL-3.0-or-later + */ +#include "HMI.h" + +/** + * HMI: constructor + * + * @param fh device handle. + */ +#ifdef ESP32 +HMI::HMI(int fh) { + _devh = fh; +} +#else +HMI::HMI(const char *dev, const uint16_t baud) { + struct termios t1, t2; + + int bd = B115200; + if (baud == 57600) + bd = B57600; + + _devh = open(dev, O_RDWR | O_NONBLOCK); + if (_devh < 0) { + fprintf(stderr, "Unable to open serial device %s", dev); + } else { + + tcgetattr(_devh, &t1); + tcgetattr(_devh, &t2); + cfmakeraw(&t1); + + t1.c_cflag = (CLOCAL | CS8 | CREAD); + cfsetspeed(&t1, bd); + t1.c_cc[VMIN] = 0; + t1.c_cc[VTIME] = 0; + tcsetattr(_devh, TCSADRAIN, &t1); + } + +} +#endif + +/** + * HMI::serial_read: read from the serial port + * + * @param fh device handle. + * @param buf buffer to read into. + * @returns number of bytes read. + */ +int HMI::serial_read(int fh, char *buf) { +#ifdef ESP32 + return (uart_read_bytes(fh, buf, 1, 1)); +#else + return (read(fh,buf,1)); +#endif +} + +/** + * HMI::serial_write: write from the serial port + * + * @param fh device handle. + * @param buf buffer to read into. + * @param len buffer lenght. + * @returns number of bytes written. + */ +int HMI::serial_write(int fh, char *buf, int len) { +#ifdef ESP32 + return (uart_write_bytes(fh, buf, len)); +#else + return(write(fh,buf,len)); +#endif +} + +/** + * HMI::iReadProt: read protocol from HMI + * + * @param ms timeout in milliseconds. + * @returns number of bytes written. + */ +int HMI::iReadProt(int ms) { + int cnt = ms; + int ec = 0; // end counter (3 x 0xFF) + char rc; + int i=0; + int res; + printf("CNT:%d\n",cnt);fflush(stdout); + while (cnt > 0) { + if ((res=serial_read(_devh, &rc)) == 1) { +#ifdef DEBUG + printf(" <%02X> ", rc); + fflush (stdout); +#endif + RecvBuf[i++]=rc; + if (rc==0xFF) { + ec++; + if (ec==3) { + i-=3; + RecvBuf[i]=0; +#ifdef DEBUG + idumpbuf(RecvBuf,i); + printf("OK Received:%d\n", i); + fflush(stdout); +#endif + return HMIResultOK; + } + } + cnt = ms; + } else { + cnt--; +#ifdef DEBUG + printf(" - "); + fflush (stdout); +#endif +#ifdef ESP32 + vTaskDelay(1); +#else + usleep(1000); +#endif + } + } + if (i==0) return HMIResultReadErr; + RecvBuf[i]=0; +#ifdef DEBUG + printf("ERR Received:%d:%s\n", i,RecvBuf); + fflush(stdout); +#endif + return HMIResultReadErr; +} + +/** + * HMI::iReadValue: read an integer + * + * @param name, value the key/value(integer) pair to read. + * @returns number of bytes written. + */ +int HMI::iReadValue(char *name,int *result) { + char cmd[64]; + int res; + sprintf(cmd,"get %s.txt",name); + res=iSendProt((int)strlen(cmd),cmd); + return res; +} + +/** + * HMI::iReadValue: read an string + * + * @param name, value the key/value(string) pair to read. + * @returns number of bytes written. + */ +int HMI::iReadValue(char *name, char *result) { + char cmd[64]; + int res; + sprintf(cmd,"get %s.txt",name); + res=iSendProt((int)strlen(cmd),cmd,10); +// printf(">%s:%d<\n",cmd,res);fflush(stdout); + if (res==HMIResultOK) { +// idumpbuf((void *)RecvBuf, (int)strlen((char *)RecvBuf)); + strncpy(result,(char *)&RecvBuf[1],16); + } + return res; +} + +/** + * HMI::iWriteValue: write an integer + * + * @param name, value the key/value(integer) pair to write. + * @returns number of bytes written. + */ +int HMI::iWriteValue(char *name,int value) { + char cmd[64]; + int res; + sprintf(cmd,"%s.txt=\"%d\"",name,value); +#ifdef DEBUG +// printf(">%s<\n",cmd);fflush(stdout); +#endif + res=iSendProt((int)strlen(cmd),cmd); + return res; +} + +/** + * HMI::iWriteValue: write a string + * + * @param name, value the key/value(string) pair to write. + * @returns number of bytes written. + */ +int HMI::iWriteValue(char *name,char * value) { + char cmd[64]; + int res; + sprintf(cmd,"%s.txt=\"%s\"",name,value); +#ifdef DEBUG +// printf(">%s<\n",cmd);fflush(stdout); +#endif + res=iSendProt((int)strlen(cmd),cmd); + return res; +} +int HMI::iSendProt(int len, char *data) { + int res = 0; + int res2=0; + char lbuf[]={0xFF,0xFF,0xFF}; + res = serial_write(_devh, (char *)data, (int)len); + if (res>0) res2=serial_write(_devh, lbuf, 3); + else return HMIResultWriteErr; + if (res2<0) return HMIResultWriteErr; + return HMIResultOK;; +} +int HMI::iSendProt(int len, char *data, int wait) { + int res = 0; + int res2=0; + char lbuf[]={0xFF,0xFF,0xFF}; + res = serial_write(_devh, (char *)data, (int)len); + if (res>0) res2=serial_write(_devh, (char *)lbuf, 3); + else return HMIResultWriteErr; + if (res2<0) return HMIResultWriteErr; + if (wait==0) return res; + res = iReadProt(wait); + return res; +} +void HMI::idumpbuf(void *buf, int len) { + int i, c; + char *lb = (char*) buf; + for (i = 0; i < len; i++) { + c = (char) *lb++; + printf("%02X ", c); + } + printf("\n"); +} diff --git a/software/drivers/HMI.h b/software/drivers/HMI.h new file mode 100644 index 0000000..055190a --- /dev/null +++ b/software/drivers/HMI.h @@ -0,0 +1,116 @@ +/* + * LCD.h + * + * Created on: 17.08.2021 + * Author: steffen + * SPDX-FileCopyrightText: 2022 MDC Service <info@mdc-service.de> + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#ifndef HMI_H_ +#define HMI_H_ +#include "main.h" + +#define DEBUG +#define ESP32 +#define ProtBufLen 260 + +#define ERR_NOERR 0 +#define ERR_CRC -1 +#define ERR_WRITE -2 +#define ERR_NOANSWER -3 +#define ERR_DECODE -4 + + +#define BAUD_9600 0 +#define BAUD_19200 1 +#define BAUD_38400 2 +#define BAUD_57600 5 +#define BAUD_115200 6 + +#define PIC_WELCOME 0 +#define PIC_OPENDOOR 1 +#define PIC_EMPTY 2 +#define PIC_KAS_OK 3 +#define PIC_KAS_DIS 4 +#define PIC_TRS_OK 5 +#define PIC_TRS_DIS 6 + +#define BUT0 p0 +#define TXT0 t0 +#define BUT1 p1 +#define TXT1 t1 +#define BUT2 p2 +#define TXT2 t2 +#define BUT3 p3 +#define TXT3 t3 +#define BUT4 p4 +#define TXT4 t4 +#define BUT5 p5 +#define TXT5 t5 + +#ifdef ESP32 +#include <sys/types.h> +#include <stdio.h> +#include <string.h> +#include <stdint.h> +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_event.h" +#include "esp_log.h" +#include "driver/uart.h" +#else +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <unistd.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <fcntl.h> +#include <termios.h> +#endif + +#define ESP32 +#define HMIResultOK 0 +#define HMIResultWriteErr -1 +#define HMIResultReadErr -2 +#define HMIResultProtErr -3 + +typedef struct { + int page; + int id; + int state; +} HMI_t; + +class HMI { +public: + +#ifdef ESP32 + HMI(const int fh); +#else + HMI(const char *dev = "/dev/ttyUSB0", const uint16_t baud = 57600); +#endif + ~HMI(void); + + int iReadProt(int ms); + int iReadValue(char *name, int *res); + int iReadValue(char *name,char *res); + int iWriteValue(char *name,int value); + int iWriteValue(char *name,char *value); + int iSendProt(int len, char *data); // done + int iSendProt(int len, char *data, int wait); // done + +private: + int _devh; + unsigned char SendBuf[ProtBufLen]; + unsigned char RecvBuf[ProtBufLen]; + int serial_read(int fh, char *buf); + int serial_write(int fh, char * buf,int len); + void idumpbuf(void *buf, int len); + +}; +#endif /* HMI_H_ */ |
