-
Notifications
You must be signed in to change notification settings - Fork 0
/
vatttel_com.c
144 lines (112 loc) · 3.19 KB
/
vatttel_com.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
#include <time.h>
#include "vatttel_com.h"
/*
* Read the index {0-63} of of the vatt pkt as
* an integer. This can later be converted
* to a float in arcseconds.
*
*
*/
int read_value( signed char pkt[], int index )
{
int temp;
int idxbase = 8 + index*4 + 3;
if( (index < 0) || (index >= 64) ) {
printf("bad index %i", index);
return 0;
}
temp = (int)pkt[idxbase--] & 0xFF;
temp += ((int)pkt[idxbase--] & 0xFF) * 0x100;
temp += ((int)pkt[idxbase--] & 0xFF) * 0x10000;
temp += (int)pkt[idxbase]*0x1000000;
return temp;
}
/*
* Populate the cmd_pkt for retrieving the secondary1
* vatttel server information.
*/
void put_cmd( signed char cmd_pkt[], int command )
{
//VATT_CMD_STATUS_SECONDARY1
//THe VATT header
cmd_pkt[0] = 'V';
cmd_pkt[1] = 'A';
cmd_pkt[2] = 'T';
cmd_pkt[3] = 'T';
cmd_pkt[4] = 0; // we won't be using the upper byte for now. Maybe later
cmd_pkt[5] = (char)( (command >> 16) & 0xFF ); // LS three bytes are delivered for now
cmd_pkt[6] = (char)( (command >> 8) & 0xFF );
cmd_pkt[7] = (char)( command & 0xFF );
}
int query_vatttel( int command, int index, double *value, char *errmsg )
{
int sockfd = 0, n = 0;
signed char recvBuff[64];
signed char pkt[64];
char rcv_pkt[64];
//Populate the secondary status request pkt.
put_cmd(pkt, command );
//Socket stuff
struct sockaddr_in serv_addr;
memset(recvBuff, '0',sizeof(recvBuff));
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Error : Could not create socket \n");
strcpy(errmsg, " Error : Could not create socket ");
return 1;
}
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET; //address type (IPV4)
serv_addr.sin_port = htons(1040); //port
if(inet_pton(AF_INET, "10.0.1.10", &serv_addr.sin_addr)<=0)
{
printf("\n inet_pton error occured\n");
strcpy(errmsg, " inet_pton error occured");
return 1;
}
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\n Error : Connect Failed \n");
strcpy(errmsg, " Error : Connect Failed ");
return 1;
}
//send the secondary status request pkt.
write(sockfd, pkt, sizeof(pkt));
//read the 64 bytes
n=read(sockfd, recvBuff, sizeof(recvBuff));
int i;
//print the values one by one seperated by white space.
//divide by 3600000.0 to convert to GUI units or arcseconds.
*value = read_value(recvBuff, index)/3600000.0;
//give us a new line.
printf("\n");
if(n < 0)
{
printf("\n Read error \n");
strcpy(errmsg, " Read error ");
}
close(sockfd);
return 0;
}
double GetStrutTemp(char *msg )
{
double temp;
query_vatttel(VATT_CMD_STATUS_TEMPS, STRUT_INDEX, &temp, msg );
return temp;
}
double GetAlt(char *msg )
{
double alt;
query_vatttel(VATT_CMD_STATUS_ALTAZ, ALT_INDEX, &alt, msg );
return alt;
}