17 #include <sys/types.h>
26 #define closesocket(s) close(s)
28 #define LEMPLUG_MAX_READ 5
30 #define LEMPLUG_SUCCESS 0
31 #define LEMPLUG_NOSUCCESS -1
32 #define LEMPLUG_STARTUP_ERROR -2
33 #define LEMPLUG_NO_HOST_ERROR -3
34 #define LEMPLUG_CONNECT_ERROR -4
41 char log[2*NAME_LENGTH];
43 char host[NAME_LENGTH];
45 char user_name[NAME_LENGTH];
46 char pwd[NAME_LENGTH];
51 #define LEMPLUG_SETTINGS_STR "\
52 Enable Log = INT : 0\n\
53 Log = STRING : [64]\n\
54 Read Time = DWORD : 5\n\
55 Host = STRING : [32]\n\
57 User Name = STRING : [32]\n\
58 Pwd = STRING : [32]\n\
59 Firmware Tag = INT : 0\n\
65 float outlet_state[8];
66 char outlet_name[8][NAME_LENGTH];
68 INT(*bd) (INT cmd, ...);
78 char *
map =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
92 pad = 3 - strlen(s) % 3;
102 *(d + 3) =
map[t & 63];
104 *(d + 2) =
map[t & 63];
106 *(d + 1) =
map[t & 63];
108 *(d + 0) =
map[t & 63];
127 if (strlen(str) == 0)
156 fd = open(info->
dd_settings.
log, O_CREAT | O_WRONLY | O_APPEND, 0644);
161 strcpy(tt, ctime(&err_time));
162 tt[strlen(tt)-1]=
'\0';
164 sprintf(str,
"----------------------------------------------\n");
165 write(fd, str, strlen(str));
167 sprintf(str,
"[%s]:\r\n%s\n", tt, log);
168 write(fd, str, strlen(str));
187 struct sockaddr_in bind_addr;
196 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
197 perror(
"cannot create socket");
202 memset(&bind_addr, 0,
sizeof(bind_addr));
203 bind_addr.sin_family = AF_INET;
204 bind_addr.sin_addr.s_addr = 0;
209 perror(
"cannot get host name");
212 memcpy((
char *) &(bind_addr.sin_addr), phe->h_addr, phe->h_length);
215 status = connect(sock, (
void *) &bind_addr,
sizeof(bind_addr));
217 cm_msg(MINFO,
"lemplug_cmd_0",
"Cannot connect to host %s, port %d\n",
229 perror(
"Cannot receive response");
233 if (strstr(
response,
"303 See Other")) {
264 struct sockaddr_in bind_addr;
273 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
274 perror(
"cannot create socket");
279 memset(&bind_addr, 0,
sizeof(bind_addr));
280 bind_addr.sin_family = AF_INET;
281 bind_addr.sin_addr.s_addr = 0;
286 perror(
"cannot get host name");
289 memcpy((
char *) &(bind_addr.sin_addr), phe->h_addr, phe->h_length);
292 status = connect(sock, (
void *) &bind_addr,
sizeof(bind_addr));
294 cm_msg(MINFO,
"lemplug_read_0",
"lemplug_read_0: Cannot connect to host %s, port %d\n",
308 perror(
"Cannot receive response");
332 if ((s == NULL) || strlen(
response)<686)
336 for (i=0; i<8; i++) {
337 memset(name, 0,
sizeof(name));
338 strncpy(name, s, 32);
340 snprintf(info->
outlet_name[i], NAME_LENGTH,
"lemplug%%%s", name);
342 sscanf(s,
"%d", &state);
363 struct sockaddr_in bind_addr;
372 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
373 perror(
"cannot create socket");
378 memset(&bind_addr, 0,
sizeof(bind_addr));
379 bind_addr.sin_family = AF_INET;
380 bind_addr.sin_addr.s_addr = 0;
385 perror(
"cannot get host name");
388 memcpy((
char *) &(bind_addr.sin_addr), phe->h_addr, phe->h_length);
391 status = connect(sock, (
void *) &bind_addr,
sizeof(bind_addr));
393 cm_msg(MINFO,
"lemplug_cmd_1",
"lemplug_cmd_1: Cannot connect to host %s, port %d\n",
404 memset(str, 0,
sizeof(str));
405 i = recv(sock, str,
sizeof(str), 0);
408 perror(
"Cannot receive response");
433 for (i=1; i<=8; i++) {
434 sprintf(str,
"M0:O%d=", i);
437 memset(str, 0,
sizeof(str));
438 for (j=0; j<10; j++) {
443 if (strstr(str,
"Off"))
445 else if (strstr(str,
"On"))
468 struct sockaddr_in bind_addr;
477 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
478 perror(
"cannot create socket");
483 memset(&bind_addr, 0,
sizeof(bind_addr));
484 bind_addr.sin_family = AF_INET;
485 bind_addr.sin_addr.s_addr = 0;
490 perror(
"cannot get host name");
493 memcpy((
char *) &(bind_addr.sin_addr), phe->h_addr, phe->h_length);
496 status = connect(sock, (
void *) &bind_addr,
sizeof(bind_addr));
498 cm_msg(MINFO,
"lemplug_cmd_2",
"lemplug_cmd_2: Cannot connect to host %s, port %d\n",
509 memset(str, 0,
sizeof(str));
510 i = recv(sock, str,
sizeof(str), 0);
513 perror(
"Cannot receive response");
538 for (i=1; i<=8; i++) {
539 sprintf(str,
"P0%d=", i);
542 memset(str, 0,
sizeof(str));
543 for (j=0; j<10; j++) {
548 if (strstr(str,
"=0"))
550 else if (strstr(str,
"=1"))
575 INT
lemplug_init(HNDLE hkey,
void **pinfo, INT channels, INT(*bd) (INT cmd, ...))
587 cm_get_experiment_database(&hDB, NULL);
591 if ((status != DB_SUCCESS) && (status != DB_OPEN_RECORD)) {
592 cm_msg(MERROR,
"lemplug_init",
"lemplug_init: Error creating Bruker DD record in ODB, status=%d", status);
597 db_find_key(hDB, hkey,
"DD", &hkeydd);
599 db_get_record(hDB, hkeydd, &info->
dd_settings, &size, 0);
614 if (status != SUCCESS) {
620 strcpy(
request,
"GET / HTTP/1.0\r\n");
621 strcat(
request,
"Host: lemplug\r\n");
622 strcat(
request,
"User-Agent: lemPlug/0.1\r\n");
623 strcat(
request,
"Accept: text/html, */*\r\n");
626 sprintf(str,
"Authorization: Basic %s\r\n", pwd);
632 cm_msg(MINFO,
"lemplug_init",
"lemplug_init: initialized ...");
637 cm_msg(MERROR,
"lemplug_init",
"lemplug_init: **ERROR** found unkown firmware tag: %d", info->
dd_settings.
firmware_tag);
650 cm_msg(MINFO,
"lemplug_init",
"lemplug_init: no response from lemplug");
659 cm_msg(MINFO,
"lemplug_init",
"lemplug_init: initialized ...");
706 sprintf(cmd,
"P1%d=%d", channel+1, (
int)value);
709 strcpy(
request,
"POST /rack1.html HTTP/1.0\r\n");
710 strcat(
request,
"Host: lemplug\r\n");
711 strcat(
request,
"User-Agent: lemPlug/0.1\r\n");
712 strcat(
request,
"Accept: text/html, */*\r\n");
713 sprintf(str,
"Content-Length: %d\r\n", (
int)strlen(cmd));
717 sprintf(str,
"Authorization: Basic %s\r\n", pwd);
730 sprintf(
request,
"GET /hidden.htm?M0:O%d=OFF HTTP/1.0\r\n", channel+1);
731 }
else if (value == 1.0) {
732 sprintf(
request,
"GET /hidden.htm?M0:O%d=ON HTTP/1.0\r\n", channel+1);
734 cm_msg(MERROR,
"lemplug_set",
"lemplug_set: only values 0.0 and 1.0 are allowed, found %f", value);
737 strcat(
request,
"Host: lemplug\r\n");
738 strcat(
request,
"User-Agent: lemPlug/0.1\r\n");
739 strcat(
request,
"Accept: text/html, */*\r\n");
745 sprintf(
request,
"GET /hidden.htm?P0%d=0 HTTP/1.0\r\n", channel+1);
746 }
else if (value == 1.0) {
747 sprintf(
request,
"GET /hidden.htm?P0%d=1 HTTP/1.0\r\n", channel+1);
749 cm_msg(MERROR,
"lemplug_set",
"lemplug_set: only values 0.0 and 1.0 are allowed, found %f", value);
752 strcat(
request,
"Host: lemplug\r\n");
753 strcat(
request,
"User-Agent: lemPlug/0.1\r\n");
754 strcat(
request,
"Accept: text/html, */*\r\n");
759 cm_msg(MERROR,
"lemplug_get",
"lemplug_get: **ERROR** found unkown firmware tag = %d", info->
dd_settings.
firmware_tag);
799 strcpy(
request,
"GET /rack1.html HTTP/1.0\r\n");
800 strcat(
request,
"Host: lemplug\r\n");
801 strcat(
request,
"User-Agent: lemPlug/0.1\r\n");
802 strcat(
request,
"Accept: text/html, */*\r\n");
803 sprintf(str,
"Content-Length: %d\r\n", (
int)strlen(cmd));
807 sprintf(str,
"Authorization: Basic %s\r\n", pwd);
814 strcpy(
request,
"GET /hidden.htm HTTP/1.0\r\n");
815 strcat(
request,
"Host: lemplug\r\n");
816 strcat(
request,
"User-Agent: lemPlug/0.1\r\n");
817 strcat(
request,
"Accept: text/html, */*\r\n");
822 strcpy(
request,
"GET /hidden.htm HTTP/1.0\r\n");
823 strcat(
request,
"Host: lemplug\r\n");
824 strcat(
request,
"User-Agent: lemPlug/0.1\r\n");
825 strcat(
request,
"Accept: text/html, */*\r\n");
830 cm_msg(MERROR,
"lemplug_get",
"lemplug_get: **ERROR** found unkown firmware tag = %d", info->
dd_settings.
firmware_tag);
871 float value, *pvalue;
875 va_start(argptr, cmd);
880 hKey = va_arg(argptr, HNDLE);
881 info = va_arg(argptr,
void *);
882 channel = va_arg(argptr, INT);
883 flags = va_arg(argptr, DWORD);
884 bd = va_arg(argptr,
void *);
889 info = va_arg(argptr,
void *);
894 info = va_arg(argptr,
void *);
895 channel = va_arg(argptr, INT);
896 value = (float) va_arg(argptr,
double);
901 info = va_arg(argptr,
void *);
902 channel = va_arg(argptr, INT);
903 pvalue = va_arg(argptr,
float *);
908 info = va_arg(argptr,
void *);
909 channel = va_arg(argptr, INT);
910 name = va_arg(argptr,
char *);
char host[32]
host name of the ePowerSwitch M8
#define LEMPLUG_SETTINGS_STR
Initializing string for the struct LEMPLUG_SETTINGS.
HNDLE hkey
ODB key for bus driver info.
void lemplug_base64_encode(char *s, char *d)
#define LEMPLUG_STARTUP_ERROR
#define LEMPLUG_CONNECT_ERROR
void * bd_info
private info of bus driver
char outlet_name[8][NAME_LENGTH]
name of the power outlets
device specific information stored in the DD ODB
char user_name[32]
user name on the ePowerSwitch M8
INT lemplug_get(LEMPLUG_INFO *info, INT channel, float *pvalue)
int port
communication port of the ePowerSwitch M8
INT lemplug_exit(LEMPLUG_INFO *info)
void lemplug_write_log(LEMPLUG_INFO *info, char *log)
DWORD read_time_stamp
time stamp when the last reading took place
INT lemplug_init(HNDLE hkey, void **pinfo, INT channels, INT(*bd)(INT cmd,...))
int startup_error
flag indicating any satrtup error
INT lemplug_cmd_1(LEMPLUG_INFO *info)
INT lemplug_read_0(LEMPLUG_INFO *info)
INT num_channels
number of channels
INT lemplug_strip_whitespace(char *str)
int enable_log
enable log tag
INT lemplug_cmd_2(LEMPLUG_INFO *info)
INT(* bd)(INT cmd,...)
bus driver entry function
LEMPLUG_SETTINGS dd_settings
private settings of the device driver
INT lemplug_set(LEMPLUG_INFO *info, INT channel, float value)
This structure contains private variables for the device driver.
int firmware_tag
firmware tag: 0 for ePowerSwitch M8 (old one), 1 for ePowerSwitch M8+R2
#define LEMPLUG_NOSUCCESS
float outlet_state[8]
current state of the power outlets
DWORD read_time
time in (sec) how often to communicate with the ePowerSwitch M8
INT lemplug_cmd_0(LEMPLUG_INFO *info)
char log[64]
name and path of the log-file
#define LEMPLUG_NO_HOST_ERROR
char pwd[32]
password on the ePowerSwitch M8
INT lemplug_get_label(LEMPLUG_INFO *info, INT channel, char *name)