-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNetworkHub.py
198 lines (181 loc) · 5.86 KB
/
NetworkHub.py
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import socket
import struct
from threading import Timer
import time
controllerSocket = None
networkHubSocket = None
motorServerSocket = None
servoServerSocket = None
motorSocket = None
servoSocket = None
INPUT_FORMAT = 'c i i'
MOTOR_FORMAT = 'i i'
SERVO_FORMAT = 'c h h'
'''MOTOR_OP_CODE = 0
SERVO_CONTROL_OP_COD = 2
SERVO_COMMAND_OP_CODE = 1'''
MOTOR_OP_CODE = 'm'
SERVO_CONTROL_OP_CODE = 'c'
SERVO_COMMAND_OP_CODE = 's'
def setupControllerConnection():
global controllerSocket
global networkHubSocket
global motorServerSocket
networkHubSocket = socket.socket()
hostname = '192.168.2.2'
print(hostname)
port = 1234
networkHubSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
while(1):
time.sleep(0.5)
print('Creating network hub connection')
try:
networkHubSocket.bind((hostname, port))
networkHubSocket.listen(100)
print('Created network hub connection')
break
except:
print('Couldnt create network hub connection')
print('Created network hub connection')
controllerSocket, addr = networkHubSocket.accept()
print("Controller connected")
def setupMotorProgramConnection():
global motorServerSocket
global motorSocket
motorServerSocket = socket.socket()
hostname = socket.gethostname()
port = 4001
while(1):
print('Waiting for motor program')
try:
motorServerSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
motorServerSocket.bind((hostname, port))
motorServerSocket.listen(100)
print("Created motor program connection")
break
except:
print('Couldnt make motor program connection')
motorSocket, addr = motorServerSocket.accept()
def setupServoProgramConnection():
global servoServerSocket
global servoSocket
servoServerSocket = socket.socket()
hostname = socket.gethostname()
port = 2001
while(1):
print('Waiting for servo program')
try:
servoServerSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
servoServerSocket.bind((hostname, port))
servoServerSocket.listen(100)
print("Created servo program connection")
break
except:
print('Couldnt make servo program connection')
servoSocket, addr = servoServerSocket.accept()
def sendMotorCommand(leftSpeed, rightSpeed):
global motorSocket
leftMotorSpeed = command[1]
rightMotorSpeed = command[2]
#print('Right motor speed: ' + str(rightSpeed) + 'Left motor speed' + str(leftSpeed))
motorCommand = struct.pack(MOTOR_FORMAT, leftSpeed, rightSpeed)
motorSocket.send(motorCommand)
def sendServoCommand(opCode, unpackedCommand):
servoCommand = unpackedCommand[1]
command = struct.pack(SERVO_FORMAT, opCode, servoCommand, 0)
servoSocket.send(command)
def sendServoControl(opCode, unpackedCommand):
servoChannel = unpackedCommand[1]
servoPosition = unpackedCommand[2]
command = struct.pack(SERVO_FORMAT, opCode, servoChannel, servoPosition)
servoSocket.send(command)
def sendStopCommand():
global controllerSocket
print("Stopping")
closeConnections()
def setupConnections():
setupMotorProgramConnection()
setupServoProgramConnection()
setupControllerConnection()
def stopMotors():
sendMotorCommand(0, 0)
def closeConnections():
global networkHubSocket
global controllerSocket
global motorServerSocket
global motorSocket
global servoServerSocket
global servoSocket
try:
networkHubSocket.shutdown(socket.SHUT_RDWR)
networkHubSocket.close
except:
print('Controller socket already closed')
try:
controllerSocket.shutdown(socket.SHUT_RDWR)
controllerSocket.close
except:
print('Controller socket already closed')
'''try:
motorSocket.shutdown(socket.SHUT_RDWR)
motorSocket.close
except:
print('Motor socket already closed')
try:
servoSocket.shutdown(socket.SHUT_RDWR)
servoSocket.close
except:
print('Servo socket already closed')
try:
motorServerSocket.shutdown(socket.SHUT_RDWR)
motorServerSocket.close
except:
print('Motor server socket already closed')
try:
servoServerSocket.shutdown(socket.SHUT_RDWR)
servoServerSocket.close
except:
print('Servo server socket already closed')'''
setupMotorProgramConnection()
setupServoProgramConnection()
setupControllerConnection()
while(1):
try:
timer = Timer(1, sendStopCommand)
timer.start()
print('Waiting for command...')
packedCommand = controllerSocket.recv(struct.calcsize(INPUT_FORMAT))
print('Received command')
timer.cancel()
command = struct.unpack(INPUT_FORMAT, packedCommand)
opCode = command[0]
#print('op code is ' + str(opCode))
if(opCode == MOTOR_OP_CODE):
print('Sending motor command')
leftMotorSpeed = command[1]
rightMotorSpeed = command[2]
sendMotorCommand(leftMotorSpeed, rightMotorSpeed)
continue
elif(opCode == SERVO_COMMAND_OP_CODE):
print('Sending servo command')
sendServoCommand(opCode, command)
continue
elif(opCode == SERVO_CONTROL_OP_CODE):
print('Sending servo control')
sendServoControl(opCode, command)
continue
except KeyboardInterrupt:
print("Program Ended")
stopMotors()
closeConnections()
break
except socket.error:
print("Lost Connection")
stopMotors()
closeConnections()
setupControllerConnection()
except:
print("Program Error")
stopMotors()
closeConnections()
setupControllerConnection()