diff options
Diffstat (limited to 'software/main/HMI.cpp')
| -rw-r--r-- | software/main/HMI.cpp | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/software/main/HMI.cpp b/software/main/HMI.cpp new file mode 100644 index 0000000..8ed8cda --- /dev/null +++ b/software/main/HMI.cpp @@ -0,0 +1,176 @@ +/* + * HMI.cpp + * + * Created on: 17.08.2021 + * Author: steffen + */ +#include "HMI.h" + +#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 + + +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 +} + +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 +} + +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; +} + +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; +} +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; +} +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; +} +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"); +} |
