source: fact/FSCctrl/FSCctrl.cc@ 15121

Last change on this file since 15121 was 13157, checked in by ogrimm, 13 years ago
FSC resistances converted into temperature for online display
File size: 4.1 KB
Line 
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
13const unsigned int MAX_SIZE = 10000;
14
15const unsigned int TIME_OFF = 3;
16const unsigned int TEMP_NUM = 64;
17const unsigned int TEMP_OFF = 134;
18const unsigned int VOLT_NUM = 40;
19const unsigned int VOLT_OFF = 30;
20const unsigned int CURR_NUM = 40;
21const unsigned int CURR_OFF = 70;
22const unsigned int HUMI_NUM = 4;
23const unsigned int HUMI_OFF = 110;
24
25const unsigned int MAX_VAL = TEMP_OFF + TEMP_NUM +100;
26
27// Parameters for PT1000
28const float R0 = 1000, A = 3.9083e-3, B = -5.775e-7;
29
30using namespace std;
31
32//
33// Main program
34//
35int 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}
Note: See TracBrowser for help on using the repository browser.