971fb0f07b7b42aa03d4ea4481a94d4b1f0ab06a
[mTask.git] / client / linux / interface.c
1 #include <stdbool.h>
2 #include <stdint.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 #include <stdio.h>
7 #include <netdb.h>
8 #include <netinet/in.h>
9 #include <signal.h>
10 #include <sys/socket.h>
11 #include <sys/time.h>
12 #include <sys/types.h>
13 #include <unistd.h>
14
15 #include "interface.h"
16
17 struct timeval tv1;
18 int sock_fd = -1;
19 int fd = -1;
20 int gargc;
21 char **gargv;
22
23 uint8_t bt;
24
25 void killHandler(int i)
26 {
27 printf("%i caught, Bye...\n", i);
28 exit(1);
29 }
30
31 void usage(FILE *o, char *arg0){
32 fprintf(o, "Usage: %s [opts]\n\nOptions\n"
33 "-p PORT Custom port number, default: 8123\n" , arg0);
34 }
35
36 long getmillis(void) {
37 if (gettimeofday(&tv1, NULL) == -1)
38 pdie("gettimeofday");
39 return tv1.tv_sec*1000 + tv1.tv_usec/1000;
40 }
41
42 bool input_available(void){
43 struct timeval tv;
44 fd_set fds;
45 tv.tv_sec = 0;
46 tv.tv_usec = 0;
47 FD_ZERO(&fds);
48 FD_SET(fd, &fds);
49 if (select(fd+1, &fds, NULL, NULL, &tv) == -1)
50 pdie("select");
51 if(!FD_ISSET(fd, &fds))
52 return false;
53 return true;
54 }
55
56 uint8_t read_byte(void)
57 {
58 read(fd, &bt, 1);
59 return bt;
60 }
61
62 void write_byte(uint8_t b)
63 {
64 write(fd, &b, 1);
65 }
66
67 void write_dpin(uint8_t i, bool b)
68 {
69 debug("dwrite %d: %d", i, b);
70 (void) i;
71 (void) b;
72 }
73
74 bool read_dpin(uint8_t i)
75 {
76 debug("dread %d", i);
77 return true;
78 (void) i;
79 }
80
81 void write_apin(uint8_t i, uint8_t a)
82 {
83 debug("awrite %d: %d", i, a);
84 (void) a;
85 (void) i;
86 }
87
88 uint8_t read_apin(uint8_t i)
89 {
90 debug("aread %d", i);
91 return 0;
92 (void) i;
93 }
94
95 void msdelay(long ms)
96 {
97 usleep(ms*1000);
98 }
99
100 void led_on(uint8_t i)
101 {
102 debug("led %d on\n", i);
103 (void)i;
104 }
105
106 void led_off(uint8_t i)
107 {
108 debug("led %d off\n", i);
109 (void)i;
110 }
111
112 void setup(void)
113 {
114 int port = 8123, opti = 1;
115 //Register signal handler
116 if(signal(SIGINT, killHandler) == SIG_ERR){
117 die("Couldn't register signal handler...");
118 }
119 if(signal(SIGTERM, killHandler) == SIG_ERR){
120 die("Couldn't register signal handler...");
121 }
122 //Command line arguments
123 while(opti < gargc){
124 if(strcmp((*gargv)+opti, "-h") == 0){
125 usage(stdout, gargv[0]);
126 exit(EXIT_SUCCESS);
127 } else if(strcmp(gargv[opti], "-p") == 0 && opti+1<gargc){
128 port = atoi(gargv[++opti]);
129 if(port < 1)
130 die("Port numbers are > 1");
131 } else {
132 usage(stderr, gargv[0]);
133 exit(EXIT_FAILURE);
134 }
135 opti++;
136 }
137
138 //Open file descriptors
139 struct sockaddr_in sa;
140
141 memset(&sa, 0, sizeof(sa));
142 sa.sin_family = AF_INET;
143 sa.sin_addr.s_addr = INADDR_ANY;
144 sa.sin_port = htons(port);
145
146 if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
147 pdie("socket");
148 if(bind(sock_fd, (struct sockaddr*)&sa, sizeof(sa)) == -1)
149 pdie("bind");
150 if(listen(sock_fd, 10) == -1)
151 pdie("listen");
152
153 printf("Listening on %d\n", port);
154 fflush(stdout);
155 if((fd = accept(sock_fd, (struct sockaddr*)NULL, NULL)) == -1)
156 pdie("accept");
157 printf("Accepted incoming connection\n");
158 }
159
160 void debug(char *fmt, ...)
161 {
162 va_list ap;
163 va_start(ap, fmt);
164 vfprintf(stderr, fmt, ap);
165 fprintf(stderr, "\n");
166 va_end(ap);
167 }
168
169 void pdie(char *s)
170 {
171 perror(s);
172 die("");
173 }
174
175 void die(char *fmt, ...)
176 {
177 va_list ap;
178 va_start(ap, fmt);
179 vfprintf(stderr, fmt, ap);
180 va_end(ap);
181 exit(EXIT_FAILURE);
182 }