| 1 | // Reading data from FSC over Ethernet
|
|---|
| 2 |
|
|---|
| 3 | #include <stdio.h>
|
|---|
| 4 | #include <string.h>
|
|---|
| 5 | #include <sys/socket.h>
|
|---|
| 6 | #include <netdb.h>
|
|---|
| 7 | #include <math.h>
|
|---|
| 8 |
|
|---|
| 9 | #include "Evidence.h"
|
|---|
| 10 |
|
|---|
| 11 | #define SERVER_NAME "FSCctrl" // Name to use in DIM
|
|---|
| 12 |
|
|---|
| 13 | const unsigned int MAX_SIZE = 10000;
|
|---|
| 14 |
|
|---|
| 15 | const unsigned int TIME_OFF = 3;
|
|---|
| 16 | const unsigned int TEMP_NUM = 64;
|
|---|
| 17 | const unsigned int TEMP_OFF = 134;
|
|---|
| 18 | const unsigned int VOLT_NUM = 40;
|
|---|
| 19 | const unsigned int VOLT_OFF = 30;
|
|---|
| 20 | const unsigned int CURR_NUM = 40;
|
|---|
| 21 | const unsigned int CURR_OFF = 70;
|
|---|
| 22 | const unsigned int HUMI_NUM = 4;
|
|---|
| 23 | const unsigned int HUMI_OFF = 110;
|
|---|
| 24 |
|
|---|
| 25 | const unsigned int MAX_VAL = TEMP_OFF + TEMP_NUM +100;
|
|---|
| 26 |
|
|---|
| 27 | // Parameters for PT1000
|
|---|
| 28 | const float R0 = 1000, A = 3.9083e-3, B = -5.775e-7;
|
|---|
| 29 |
|
|---|
| 30 | using namespace std;
|
|---|
| 31 |
|
|---|
| 32 | //
|
|---|
| 33 | // Main program
|
|---|
| 34 | //
|
|---|
| 35 | int main(int argc, char *argv[]) {
|
|---|
| 36 |
|
|---|
| 37 | int Result;
|
|---|
| 38 | char Buffer[1000];
|
|---|
| 39 | float Val[MAX_VAL]={0};
|
|---|
| 40 | string Data;
|
|---|
| 41 | int Socket;
|
|---|
| 42 | struct sockaddr_in SocketAddress;
|
|---|
| 43 | vector<string> Items;
|
|---|
| 44 | time_t Time;
|
|---|
| 45 |
|
|---|
| 46 | // Start Evidence server
|
|---|
| 47 | EvidenceServer S(SERVER_NAME);
|
|---|
| 48 |
|
|---|
| 49 | // Get configuration data
|
|---|
| 50 | string Address = S.GetConfig("Address", "10.0.128.127");
|
|---|
| 51 | int Port = atoi(S.GetConfig("Port", "5000").c_str());
|
|---|
| 52 |
|
|---|
| 53 | if (argc > 1) Address = argv[1];
|
|---|
| 54 | if (argc > 2) Port = atoi(argv[2]);
|
|---|
| 55 |
|
|---|
| 56 | // Resolve hostname
|
|---|
| 57 | struct hostent *Host = gethostbyname(Address.c_str());
|
|---|
| 58 | if (Host == 0) S.Message(S.FATAL, "Could not resolve host name '%s'", Address.c_str());
|
|---|
| 59 |
|
|---|
| 60 | SocketAddress.sin_family = PF_INET;
|
|---|
| 61 | SocketAddress.sin_port = htons(Port);
|
|---|
| 62 | SocketAddress.sin_addr = *(struct in_addr*) Host->h_addr;
|
|---|
| 63 |
|
|---|
| 64 | // Open socket descriptor
|
|---|
| 65 | if ((Socket = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
|
|---|
| 66 | S.Message(S.FATAL, "Could not open socket (%s)\n", strerror(errno));
|
|---|
| 67 | }
|
|---|
| 68 |
|
|---|
| 69 | // Connect to server
|
|---|
| 70 | if (connect(Socket, (struct sockaddr *) &SocketAddress, sizeof(SocketAddress)) == -1) {
|
|---|
| 71 | S.Message(S.FATAL, "Could not connect to %s:%hu (%s)", Address.c_str(), Port, strerror(errno));
|
|---|
| 72 | }
|
|---|
| 73 |
|
|---|
| 74 | // Create DIM services
|
|---|
| 75 | DimService Update(SERVER_NAME"/Time", "F", Val+TIME_OFF, sizeof(float));
|
|---|
| 76 | DimService Temperature(SERVER_NAME"/Temperature", "F", Val+TEMP_OFF, sizeof(float)*TEMP_NUM);
|
|---|
| 77 | DimService Humidity(SERVER_NAME"/Humindity", "F", Val+HUMI_OFF, sizeof(float)*HUMI_NUM);
|
|---|
| 78 | DimService Voltage(SERVER_NAME"/Voltage", "F",Val+VOLT_OFF, sizeof(float)*VOLT_NUM);
|
|---|
| 79 | DimService Current(SERVER_NAME"/Current", "F", Val+CURR_OFF, sizeof(float)*CURR_NUM);
|
|---|
| 80 |
|
|---|
| 81 | // Send start command to FSC board
|
|---|
| 82 | snprintf(Buffer, sizeof(Buffer), "m\n");
|
|---|
| 83 | Result = write(Socket, Buffer, 1);
|
|---|
| 84 | if (Result != 1) S.Message(S.ERROR, "Could not write to socket (%s)", strerror(errno));
|
|---|
| 85 |
|
|---|
| 86 | // Loop receiving data from FSC board
|
|---|
| 87 | while (!S.ExitRequest) {
|
|---|
| 88 |
|
|---|
| 89 | Result = read(Socket, Buffer, sizeof(Buffer));
|
|---|
| 90 |
|
|---|
| 91 | if (Result == -1) {
|
|---|
| 92 | S.Message(S.ERROR, "Could not read from socket, exiting (%s)", strerror(errno));
|
|---|
| 93 | break;
|
|---|
| 94 | }
|
|---|
| 95 | else if (Result == 0) {
|
|---|
| 96 | S.Message(S.INFO, "Server not existing anymore, exiting");
|
|---|
| 97 | break;
|
|---|
| 98 | }
|
|---|
| 99 |
|
|---|
| 100 | // Append received data and check for maxumum length and end marker
|
|---|
| 101 | Data.append(Buffer, Result);
|
|---|
| 102 |
|
|---|
| 103 | if (Data.size() > MAX_SIZE) {
|
|---|
| 104 | S.Message(S.ERROR, "Received more than %u characters without end marker, deleting", MAX_SIZE);
|
|---|
| 105 | Data.clear();
|
|---|
| 106 | }
|
|---|
| 107 |
|
|---|
| 108 | if (Data.find("end.\n")==string::npos || Data.find("status:")==string::npos) continue;
|
|---|
| 109 |
|
|---|
| 110 | Data = Data.substr(Data.rfind("status:"), Data.rfind("end.\n")-Data.rfind("status:"));
|
|---|
| 111 |
|
|---|
| 112 | //
|
|---|
| 113 | // Full event received
|
|---|
| 114 | //
|
|---|
| 115 | Time = time(NULL);
|
|---|
| 116 | printf("%s%s\n", ctime(&Time), Data.c_str());
|
|---|
| 117 |
|
|---|
| 118 | // Extract numbers
|
|---|
| 119 | Items = S.Tokenize(Data, " \n\t:");
|
|---|
| 120 |
|
|---|
| 121 | for (unsigned int i=0; i<MAX_VAL && i<Items.size(); i++) {
|
|---|
| 122 | Val[i] = atof(Items[i].c_str());
|
|---|
| 123 | //printf("Value %i: %s / %.2f \n", i, Items[i].c_str(), Val[i]);
|
|---|
| 124 | }
|
|---|
| 125 |
|
|---|
| 126 | // Translate resistance to temperatures
|
|---|
| 127 | for (unsigned int i=0; i<TEMP_NUM; i++) {
|
|---|
| 128 | Val[i+TEMP_OFF] = -A/(2*B)-sqrt(pow(A/(2*B),2)-(R0-Val[i+TEMP_OFF])/(B*R0));
|
|---|
| 129 | }
|
|---|
| 130 |
|
|---|
| 131 | // Update DIM service
|
|---|
| 132 | Temperature.updateService();
|
|---|
| 133 | Humidity.updateService();
|
|---|
| 134 | Voltage.updateService();
|
|---|
| 135 | Current.updateService();
|
|---|
| 136 | Update.updateService();
|
|---|
| 137 |
|
|---|
| 138 | Data.clear();
|
|---|
| 139 | } // while()
|
|---|
| 140 |
|
|---|
| 141 | if (close(Socket) == -1) {
|
|---|
| 142 | S.Message(S.ERROR, "Could not close socket descriptor (%s)", strerror(errno));
|
|---|
| 143 | }
|
|---|
| 144 |
|
|---|
| 145 | }
|
|---|