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