source: fact/FSCctrl/FSCctrl.cc@ 12058

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