Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / colonet / utilities / manual_control / manualControlServer / manualControlServer.c @ 13

History | View | Annotate | Download (4.42 KB)

1
/* Colonet Server
2
   Eugene Marinelli and Gregory Tress
3
*/
4

    
5
#include <sys/types.h>
6
#include <sys/socket.h>
7
#include <stdio.h>
8
#include <netinet/in.h>
9
#include <arpa/inet.h>
10
#include <string.h>
11
#include <netdb.h>
12

    
13
#include "wireless.h"
14

    
15
#define SERIAL_PORT "/dev/ttyS0"  
16
//#define SERIAL_PORT "/dev/ttyUSB0"
17
#define SERVER_ID 213
18

    
19
#define FORWARD 0xF0
20
#define BACK 0xF1
21
#define RIGHT 0xF2
22
#define LEFT 0xF3
23
#define STOP 0xF4
24

    
25
#define message_length 3
26

    
27
void send_command(char cmd, char dest);
28

    
29
int mysocket;   //the socket that gets new connections
30
int io_socket;  //the socket we use to communicate when a connection is initiated.
31

    
32
int main (int argc, char **argv) {
33

    
34
  unsigned int clientlen;
35
  struct sockaddr_in clientaddr;
36
  struct hostent *hp;
37
  char *haddrp;
38
  char newdata[100];
39
  int newdatasize;
40
  if (argc != 2) {
41
    fprintf(stderr, "Usage: %s <port>\n", argv[0]);
42
    return 0;
43
  }
44
   
45
  //start server
46
  printf("Starting server on port %i\n", atoi(argv[1]));
47
  mysocket = open_listenfd(atoi(argv[1]));
48
  if (mysocket < 0) {
49
    fprintf(stderr, "Error listening on port.\n");
50
    return -1;
51
  } else {
52
    printf("Server running, waiting for connection\n");
53
  }
54
                           
55
  //accept connections
56
  while (1) {
57
    clientlen = sizeof(clientaddr);
58
    io_socket = accept(mysocket, (struct sockaddr *) &clientaddr, &clientlen);
59
     
60
    //get client info
61
    hp = gethostbyaddr((const char *) &clientaddr.sin_addr.s_addr, 
62
                       sizeof(clientaddr.sin_addr.s_addr), AF_INET);
63
    haddrp = inet_ntoa(clientaddr.sin_addr);
64
    printf("Client connected: %s %s\n", hp->h_name, haddrp);
65
           
66
    if (!fork()) { // this is the child process
67
      close(mysocket); // child doesn't need the listener
68
      newdata[0] = ' ';
69
      while (newdata[0] != 'q') {
70
        memset(newdata, '\0', strlen(newdata));
71
        newdatasize = recv(io_socket, newdata, 99, 0);
72
        //receive commands from clients and give them to robots
73
        printf("Received: [%s]\n", newdata);
74
        send_command(newdata[0], GLOBAL_DEST);
75
      }
76
      printf("\nClient has disconnected.\n");
77
      close(io_socket);
78
      return 0;
79
    }
80
    close(io_socket);
81
  }
82
                                                                  
83
  close(mysocket);
84
  return 0;
85
}
86

    
87
//listen on port, as specified by 15-213 book.
88
int open_listenfd(int port) {
89
  int listenfd, optval=1;
90
  struct sockaddr_in serveraddr;
91
     
92
  //create socket descriptor
93
  if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
94
    return -1;
95
                                                            
96
  //prevent "address already in use" error
97
  if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const void *) &optval, 
98
                 sizeof(int)) < 0)
99
    return -1;
100
  
101
  bzero((char *) &serveraddr, sizeof(serveraddr));
102
  serveraddr.sin_family = AF_INET;
103
  serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
104
  serveraddr.sin_port = htons((unsigned short)port);
105
  if (bind(listenfd, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0)
106
    return -1;
107
  
108
  //start listening
109
  if (listen(listenfd, 128) < 0)
110
    return -1;
111
  return listenfd;
112
}
113

    
114
void send_command(char cmd, char dest){
115
  FILE* serial;
116
  WL_Packet pkt;
117
  int i;
118
  char robot_cmd[message_length];
119

    
120
  if(cmd != 'w' && cmd != 'a' && cmd != 's' && cmd != 'd' && cmd != ' '){
121
    fprintf(stderr, "Invalid command\n");
122
    return;
123
  }
124

    
125
  robot_cmd[0] = 0;
126
  robot_cmd[1] = '\0';
127

    
128
  switch(cmd){
129
  case 'w':
130
    robot_cmd[0] = FORWARD;
131
    break;
132
  case 'a':
133
    robot_cmd[0] = LEFT;
134
    break;
135
  case 's':
136
    robot_cmd[0] = BACK;
137
    break;
138
  case 'd':
139
    robot_cmd[0] = RIGHT;
140
    break;
141
  case ' ':
142
    robot_cmd[0] = STOP;
143
    break;
144
  }
145

    
146
  wl_create_packet(robot_cmd, SERVER_ID, dest, &pkt);
147

    
148
  serial = fopen(SERIAL_PORT, "w");
149

    
150
  fprintf(stderr, "%i %i %i %i ", pkt.prefix[0], pkt.prefix[1], pkt.src, 
151
          pkt.dest);
152
  fprintf(serial, "%c%c%c%c", pkt.prefix[0], pkt.prefix[1], pkt.src,  
153
          pkt.dest);
154

    
155
  for(i = 0; i < message_length; i++){
156
    fprintf(stderr, "%i ", pkt.msg[i]);
157
    fprintf(serial, "%c", pkt.msg[i]);
158
  }
159

    
160
  fprintf(stderr, "%i", pkt.checksum);
161
  fprintf(serial, "%c", pkt.checksum);
162

    
163
  fclose(serial);
164
}
165

    
166
char wl_get_checksum(WL_Packet* packet){
167
  char checksum = 0;
168
  int i;
169

    
170
  checksum += packet->src;
171
  checksum += packet->dest;
172
  for(i = 0; i < message_length; i++) {
173
    checksum += packet->msg[i];
174
  }
175

    
176
  return checksum;
177
}
178

    
179
int wl_create_packet(char* msg, char src, char dest, WL_Packet* packet){
180
  packet->prefix[0] = 'R';
181
  packet->prefix[1] = 'C';
182

    
183
  packet->src = src;
184
  packet->dest = dest;
185

    
186
  memset(packet->msg, 0, message_length);
187
  strcpy(packet->msg, msg);
188

    
189
  packet->checksum = wl_get_checksum(packet);
190

    
191
  return 0;
192
}