| 1 | #include <fcntl.h>
|
|---|
| 2 | #include <termios.h>
|
|---|
| 3 | #include <stdio.h>
|
|---|
| 4 |
|
|---|
| 5 | // For Evidence server
|
|---|
| 6 | #define SERVER_NAME "ARDUINO" // Name to use in DIM
|
|---|
| 7 | #include "Evidence.h"
|
|---|
| 8 | #define NUM_VAL 10
|
|---|
| 9 |
|
|---|
| 10 | #define MODEMDEVICE "/dev/myArduino"
|
|---|
| 11 |
|
|---|
| 12 | int main() {
|
|---|
| 13 |
|
|---|
| 14 | int fd, res;
|
|---|
| 15 | struct termios oldtio,newtio;
|
|---|
| 16 | char Textbuffer[255], Temp[sizeof(Textbuffer)], *Token;
|
|---|
| 17 |
|
|---|
| 18 | // Start Evidence server and create services
|
|---|
| 19 | EvidenceServer Srv(SERVER_NAME);
|
|---|
| 20 |
|
|---|
| 21 | float Val[NUM_VAL]={0};
|
|---|
| 22 | DimService Data(SERVER_NAME"/Data", "F", Val, sizeof(Val));
|
|---|
| 23 | DimService TextService(SERVER_NAME"/Textdata", Textbuffer);
|
|---|
| 24 |
|
|---|
| 25 | // Open modem device for reading and writing and not as controlling tty
|
|---|
| 26 | // because we don't want to get killed if linenoise sends CTRL-C.
|
|---|
| 27 | fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
|
|---|
| 28 | if (fd <0) {
|
|---|
| 29 | Srv.Message(Srv.FATAL, "Could not open modem device (%s)", strerror(errno));
|
|---|
| 30 | }
|
|---|
| 31 |
|
|---|
| 32 | tcgetattr(fd,&oldtio); /* save current serial port settings */
|
|---|
| 33 | memset(&newtio, 0, sizeof(newtio)); /* clear struct for new port settings */
|
|---|
| 34 |
|
|---|
| 35 | /*
|
|---|
| 36 | BAUDRATE: Set bps rate. You could also use cfsetispeed and cfsetospeed.
|
|---|
| 37 | CRTSCTS : output hardware flow control (only used if the cable has
|
|---|
| 38 | all necessary lines. See sect. 7 of Serial-HOWTO)
|
|---|
| 39 | CS8 : 8n1 (8bit,no parity,1 stopbit)
|
|---|
| 40 | CLOCAL : local connection, no modem contol
|
|---|
| 41 | CREAD : enable receiving characters
|
|---|
| 42 | */
|
|---|
| 43 | newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
|
|---|
| 44 |
|
|---|
| 45 | // CRTSCTS | maybe not needed //DN 090907
|
|---|
| 46 |
|
|---|
| 47 | /*
|
|---|
| 48 | IGNPAR : ignore bytes with parity errors
|
|---|
| 49 | ICRNL : map CR to NL (otherwise a CR input on the other computer
|
|---|
| 50 | will not terminate input)
|
|---|
| 51 | otherwise make device raw (no other input processing)
|
|---|
| 52 | */
|
|---|
| 53 | newtio.c_iflag = IGNPAR ;
|
|---|
| 54 |
|
|---|
| 55 | // | ICRNL // i guess this is not needed here. DN 090907
|
|---|
| 56 |
|
|---|
| 57 | // Raw output.
|
|---|
| 58 | newtio.c_oflag = 0;
|
|---|
| 59 |
|
|---|
| 60 | /*
|
|---|
| 61 | ICANON : enable canonical input
|
|---|
| 62 | disable all echo functionality, and don't send signals to calling program
|
|---|
| 63 | */
|
|---|
| 64 | newtio.c_lflag = ICANON;
|
|---|
| 65 |
|
|---|
| 66 | /*
|
|---|
| 67 | initialize all control characters
|
|---|
| 68 | default values can be found in /usr/include/termios.h, and are given
|
|---|
| 69 | in the comments, but we don't need them here
|
|---|
| 70 | */
|
|---|
| 71 | newtio.c_cc[VINTR] = 0; /* Ctrl-c */
|
|---|
| 72 | newtio.c_cc[VQUIT] = 0; /* Ctrl-\ */
|
|---|
| 73 | newtio.c_cc[VERASE] = 0; /* del */
|
|---|
| 74 | newtio.c_cc[VKILL] = 0; /* @ */
|
|---|
| 75 | newtio.c_cc[VEOF] = 4; /* Ctrl-d */
|
|---|
| 76 | newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
|
|---|
| 77 | newtio.c_cc[VMIN] = 1; /* blocking read until 1 character arrives */
|
|---|
| 78 | newtio.c_cc[VSWTC] = 0; /* '\0' */
|
|---|
| 79 | newtio.c_cc[VSTART] = 0; /* Ctrl-q */
|
|---|
| 80 | newtio.c_cc[VSTOP] = 0; /* Ctrl-s */
|
|---|
| 81 | newtio.c_cc[VSUSP] = 0; /* Ctrl-z */
|
|---|
| 82 | newtio.c_cc[VEOL] = 0; /* '\0' */
|
|---|
| 83 | newtio.c_cc[VREPRINT] = 0; /* Ctrl-r */
|
|---|
| 84 | newtio.c_cc[VDISCARD] = 0; /* Ctrl-u */
|
|---|
| 85 | newtio.c_cc[VWERASE] = 0; /* Ctrl-w */
|
|---|
| 86 | newtio.c_cc[VLNEXT] = 0; /* Ctrl-v */
|
|---|
| 87 | newtio.c_cc[VEOL2] = 0; /* '\0' */
|
|---|
| 88 |
|
|---|
| 89 | // now clean the modem line and activate the settings for the port
|
|---|
| 90 | tcflush(fd, TCIFLUSH);
|
|---|
| 91 | tcsetattr(fd,TCSANOW,&newtio);
|
|---|
| 92 |
|
|---|
| 93 | while (!Srv.ExitRequest) {
|
|---|
| 94 |
|
|---|
| 95 | /* read blocks program execution until a line terminating character is
|
|---|
| 96 | input, even if more than 255 chars are input. If the number
|
|---|
| 97 | of characters read is smaller than the number of chars available,
|
|---|
| 98 | subsequent reads will return the remaining chars. res will be set
|
|---|
| 99 | to the actual number of characters actually read */
|
|---|
| 100 | res = read(fd, Textbuffer, sizeof(Textbuffer));
|
|---|
| 101 |
|
|---|
| 102 | // Set end of string marker anbd replace all non-printable characters
|
|---|
| 103 | Textbuffer[res]=0;
|
|---|
| 104 | for (unsigned int i=0; i<strlen(Textbuffer); i++) if (isprint(Textbuffer[i])==0) Textbuffer[i] = ' ';
|
|---|
| 105 |
|
|---|
| 106 | printf("%s\n", Textbuffer);
|
|---|
| 107 | TextService.updateService();
|
|---|
| 108 | if (strncmp (Textbuffer,"[Temp,",6) != 0) continue;
|
|---|
| 109 |
|
|---|
| 110 | // Update DIM services
|
|---|
| 111 | memcpy(Temp, Textbuffer, sizeof(Textbuffer));
|
|---|
| 112 | Token = strtok(Temp, ", ");
|
|---|
| 113 | for (int i=0; i<NUM_VAL; i++) {
|
|---|
| 114 | Token = strtok(NULL, ", ");
|
|---|
| 115 | if (Token != NULL) Val[i] = atof(Token);
|
|---|
| 116 | }
|
|---|
| 117 | Data.updateService();
|
|---|
| 118 |
|
|---|
| 119 | usleep(atoi(Srv.GetConfig("Period", "10").c_str()) * 1000000);
|
|---|
| 120 | } // while()
|
|---|
| 121 |
|
|---|
| 122 | /* restore the old port settings */
|
|---|
| 123 | tcsetattr(fd,TCSANOW,&oldtio);
|
|---|
| 124 | }
|
|---|