source: robotics/wheelchair/python/DoraRecieve.py @ 98791c8

Last change on this file since 98791c8 was 98791c8, checked in by Steve Castellotti <sc@…>, 8 years ago

Wheelchair_Control:

  • added deviceKeepalive callback timer
  • Property mode set to 100755
File size: 5.4 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Robotics - Wheelchair - Receiver
5#
6# Copyright Puzzlebox Productions, LLC (2013)
7#
8# This code is released under the GNU Pulic License (GPL) version 2
9# For more information please refer to http://www.gnu.org/copyleft/gpl.html
10
11import sys
12import time
13import signal
14import serial
15import select
16
17from PySide import QtCore, QtGui, QtNetwork
18
19import Wheelchair_Control as wheelchair_control
20
21#####################################################################
22# Globals
23#####################################################################
24
25DEBUG=1
26
27SOCKET = 20320
28
29DEFAULT_SPEED = 5
30
31currentTarget= 'i'
32previousTarget= 'i'
33
34#DIRECTION_CODES = {
35        #'0': '', \
36        #'1': 'left', \
37        #'2': 'right', \
38        #'3': 'reverse', \
39        #'4': 'forward', \
40        #'5': 'stop'
41#}
42
43# '\n' is equivalent to C++ endl
44DIRECTION_CODES = {
45        '0': '', \
46        '1': 'left', \
47        '2': 'right', \
48        '3': 'reverse', \
49        '4': 'forward', \
50        '5': 'stop',
51        '0\n': '', \
52        '1\n': 'left', \
53        '2\n': 'right', \
54        '3\n': 'reverse', \
55        '4\n': 'forward', \
56        '5\n': 'stop'
57}
58
59#KEY_CODES = {
60        #'':        '', \
61        #'left':    'j', \
62        #'right':   'l', \
63        #'reverse': 'k', \
64        #'forward': 'i', \
65        #'stop':    ' '
66#}
67
68KEY_CODES = {
69        'left': 'left', \
70        'right': 'right', \
71        'reverse': 'rev', \
72        'forward': 'fwd', \
73        'stop': 'stop'
74}
75
76#CONTROLS = { 'fwd': 'F',
77             #'rev': 'B',
78             #'right': 'R',
79             #'left': 'L',
80#}
81
82CONTROLS = {
83        'forward': 'F', \
84        'left': 'L', \
85        'right': 'R', \
86        'reverse': 'B'
87}
88
89
90#####################################################################
91# Classes
92#####################################################################
93
94class Receiver(QtGui.QDialog):
95       
96        def __init__(self, parent=None):
97               
98                super(Receiver, self).__init__(parent)
99
100                self.statusLabel = QtGui.QLabel("Listening for broadcasted messages")
101                quitButton = QtGui.QPushButton("&Quit")
102
103                self.udpSocket = QtNetwork.QUdpSocket(self)
104                self.udpSocket.bind(SOCKET)
105
106                self.udpSocket.readyRead.connect(self.processPendingDatagrams)
107                quitButton.clicked.connect(self.close)
108
109                buttonLayout = QtGui.QHBoxLayout()
110                buttonLayout.addStretch(1)
111                buttonLayout.addWidget(quitButton)
112                buttonLayout.addStretch(1)
113
114                mainLayout = QtGui.QVBoxLayout()
115                mainLayout.addWidget(self.statusLabel)
116                mainLayout.addLayout(buttonLayout)
117                self.setLayout(mainLayout)
118
119                self.setWindowTitle("Broadcast Receiver")
120               
121               
122                self.wheelchair = wheelchair_control.puzzlebox_brainstorms_wheelchair_control( \
123                        device_address=wheelchair_control.DEFAULT_SERIAL_DEVICE, \
124                        command=wheelchair_control.DEFAULT_COMMAND, \
125                        DEBUG=DEBUG)
126       
127       
128                self.wheelchair.start()
129               
130                if DEBUG:
131                        print "Wheelchair Started"
132
133
134        ##################################################################
135
136        def processPendingDatagrams(self):
137               
138                while self.udpSocket.hasPendingDatagrams():
139
140
141                        datagram, host, port = self.udpSocket.readDatagram(self.udpSocket.pendingDatagramSize())
142
143
144                        try:
145                                # Python v3.
146                                datagram = str(datagram, encoding='ascii')
147                        except:
148                                # Python v2.
149                                pass
150
151
152                        #if DEBUG:
153                                #print "Datagram: %s" % datagram
154                                #print datagram
155                                #print
156                                #print type(datagram)
157                                #print
158
159
160
161                        try:
162                               
163                        #if True:
164                                #self.wheelchair.sendCommand('1','i')
165                               
166                                datagram = str(datagram)
167                               
168                                #if DEBUG:
169                                        #print "Datagram str():",
170                                        #print datagram
171                                        #print
172                                        #print type(datagram)
173                                        #print
174                               
175                                #DIRECTION_CODES = {
176                                        #'0': '', \
177                                        #'1': 'left', \
178                                        #'2': 'right', \
179                                        #'3': 'reverse', \
180                                        #'4': 'forward', \
181                                        #'5': 'stop'
182                                #}
183                               
184                                #KEY_CODES = {
185                                        #'':        '', \
186                                        #'left':    'j', \
187                                        #'right':   'l', \
188                                        #'reverse': 'k', \
189                                        #'forward': 'i', \
190                                        #'stop':    ' '
191                                #}
192                               
193                               
194                                if (datagram in DIRECTION_CODES.keys()):
195                                       
196                                        direction = DIRECTION_CODES[datagram]
197                                       
198                                        #print direction
199                                       
200                                        if ((direction in KEY_CODES.keys()) and \
201                                            (KEY_CODES[direction] != '')):
202                                       
203                                                key_code = KEY_CODES[direction]
204                                               
205                                               
206                                                if DEBUG:
207                                                        print "[Dora] Direction: %s Sending: %s" % \
208                                                                (direction, key_code)
209                                               
210                                               
211                                                self.wheelchair.sendCommand('%i' % DEFAULT_SPEED, key_code)
212                       
213                                else:
214                                       
215                                        if DEBUG:
216                                                print "[Dora] Direction not recognized:",
217                                                print datagram
218                       
219                        except Exception, e:
220                                if DEBUG:
221                                        print "ERROR: Exception:",
222                                        print e
223                               
224
225
226                        self.statusLabel.setText("Received datagram: \"%s\"" % datagram)
227
228
229#####################################################################
230# Globals
231#####################################################################
232
233if __name__ == '__main__':
234
235        app = QtGui.QApplication(sys.argv)
236        receiver = Receiver()
237        #receiver.show()
238        sys.exit(receiver.exec_())
239
240        # Perform correct KeyboardInterrupt handling
241        # (allows you to hit control-c to quit)
242        signal.signal(signal.SIGINT, signal.SIG_DFL)
243
244        # Collect default settings and command line parameters
245        device = DEFAULT_SERIAL_DEVICE
246        command = DEFAULT_COMMAND
247
248        for each in sys.argv:
249
250                if each.startswith("--device="):
251                        device = each[ len("--device="): ]
252                elif each.startswith("--command="):
253                        command = each[ len("--command="): ]
254
255
256        #app1 = QtCore.QCoreApplication(sys.argv)
257
258        #wheelchair = puzzlebox_brainstorms_wheelchair_control( \
259                        #device_address=device, \
260                        #command=command, \
261                        #DEBUG=DEBUG)
262
263        receiver.show()
264       
265        if DEBUG:
266                print "Receiver Showing"
267        #wheelchair.start()
268        #print "Wheelchair Started"
269
270        sys.exit(app.exec_())
271        #sys.exit(app1.exec_())
Note: See TracBrowser for help on using the repository browser.