Commit f0c9daeeb5c3777e531a3078f4e250e19c8595c4

Authored by bdubois
1 parent 861b8b8a60
Exists in master

Mainly cosmetic changes and add decode/encode to read/write procedure on socket

Showing 1 changed file with 28 additions and 38 deletions Side-by-side Diff

eddsctrl_server/eddsctrlserver
1   -#!/usr/bin/python2.7
  1 +#!/usr/bin/python3
2 2 # -*- coding: utf-8 -*-
3 3  
4 4 """package eddsctrl_server
5 5  
6 6  
7 7  
8 8  
... ... @@ -15,36 +15,32 @@
15 15 for the message using the length prefix technique.
16 16 """
17 17  
18   -import logging
19   -CONSOLE_LOG_LEVEL = logging.DEBUG
20   -FILE_LOG_LEVEL = logging.DEBUG
  18 +# Ctrl-c closes the application
  19 +import signal
  20 +signal.signal(signal.SIGINT, signal.SIG_DFL)
21 21  
22 22 import os
23   -try:
24   - import configparser
25   -except ImportError:
26   - import ConfigParser as configparser
27   -try:
28   - from queue import Queue, Empty
29   -except ImportError:
30   - from Queue import Queue, Empty
  23 +import logging
  24 +import configparser
  25 +from queue import Queue, Empty
31 26 from struct import pack, unpack
32 27 from select import select
33 28 from socket import socket, AF_INET, SOCK_STREAM
34 29  
35 30 from dds.ad9912dev import Ad9912Dev as DdsDevice # for actual use
36 31 #from dds.dds_emul import TestUsbDds as DdsDevice # for test without DDS
37   -
38   -from eddsctrl_server.constants import APP_NAME, SERVER_PORT, SERVERHOST, \
  32 +from eddsctrl_server.constants import SERVER_PORT, SERVERHOST, \
39 33 DEFAULT_IFREQ, DEFAULT_OFREQ, DEFAULT_AMP, DEFAULT_PHY, \
40 34 CFG_SERVER_FILE, LOG_SERVER_FILE
41 35  
  36 +CONSOLE_LOG_LEVEL = logging.DEBUG
  37 +FILE_LOG_LEVEL = logging.DEBUG
42 38  
43 39 #==============================================================================
44 40 class EDdsCtrlServer(object):
45 41 """Class dedicated to interface socket client with DDS device.
46 42 Provide a basic interface to handle client queries:
47   - Message is built using the length prefix technique: length is sent as a
  43 + Message is built using the length prefix technique: length is sent as a
48 44 packed 4-byte little-endian integer.
49 45 Allow only 4 queries, changement of output frequency, input frequency,
50 46 phase or amplitude value.
... ... @@ -108,7 +104,7 @@
108 104 raise Exception("Unexpected error during DDS initialisation: %s" \
109 105 % str(ex))
110 106 logging.debug("DDS inititialization done")
111   -
  107 +
112 108 def _init_server(self):
113 109 """Create and configure a basic server object.
114 110 :returns: None
115 111  
116 112  
... ... @@ -163,14 +159,14 @@
163 159 # Established connection
164 160 else:
165 161 header_data = self._recv_n_bytes(sock, 4)
166   - if header_data == None:
  162 + if header_data is None:
167 163 logging.error("Message seems received but no data to read")
168 164 return
169 165 if len(header_data) == 4:
170 166 msg_len = unpack('<L', header_data)[0]
171   - data = self._recv_n_bytes(sock, msg_len)
  167 + data = self._recv_n_bytes(sock, msg_len).decode('utf-8')
172 168 # Check message validity
173   - if data == None:
  169 + if data is None:
174 170 logging.error("Message received but no data to read")
175 171 return
176 172 if len(data) != msg_len:
177 173  
... ... @@ -221,14 +217,14 @@
221 217 sock.getpeername())
222 218 # Stop listening for input on the connection
223 219 self.inputs.remove(sock)
224   - if sock in outputs:
  220 + if sock in self.outputs:
225 221 self.outputs.remove(sock)
226 222 sock.close()
227 223 # Remove message queue
228 224 del self.message_queues[sock]
229 225 except Exception as ex:
230 226 logging.error("Unexpected error: %s", ex)
231   -
  227 +
232 228 def _input_msg_handler(self, msg):
233 229 """Handle message from clients. Message format is defined in
234 230 :class:`eddsctrl.server.eddsctrlsserver.EDdsCtrlServer`.
235 231  
... ... @@ -262,18 +258,14 @@
262 258 elif index == "i?":
263 259 retval = self._dds.get_ifreq()
264 260 else: # Bad identifier, message not valid
265   - logging.error("Bad identifier," \
266   - "expected o[?], p[?], a[?] or i[?]: ", \
267   - index, " given")
  261 + logging.error("Bad identifier, expected o[?], p[?], a[?] or i[?]: "
  262 + + index + " given")
268 263 return
269 264 # Write modification to setting file
270 265 with open(self._settingsf, 'w') as fd:
271 266 config.write(fd)
272 267 # Note that value actually writed in DDS (retval) can be a bit different
273 268 # than value sended to DDS (value).
274   -
275   -
276   -
277 269 msg = "!" + index + "!" + str(retval) + "!"
278 270 return msg
279 271  
280 272  
281 273  
282 274  
283 275  
... ... @@ -288,22 +280,22 @@
288 280 """
289 281 header = pack('<L', len(msg))
290 282 try:
291   - sock.sendall(header + msg)
  283 + sock.sendall(header + msg.encode('utf-8'))
292 284 except IOError as ex:
293 285 logging.error("Error during sending: %s", ex)
294 286  
295 287 @staticmethod
296   - def _recv_n_bytes(sock, n):
  288 + def _recv_n_bytes(sock, nb):
297 289 """Convenience method for receiving exactly n bytes from socket
298 290 (assuming it's open and connected).
299 291 :param sock: socket object which receives the n bytes
300   - :param n: number of bytes to be received (int)
  292 + :param nb: number of bytes to be received (int)
301 293 :returns: data received (str)
302 294 """
303 295 data = ''
304   - while len(data) < n:
  296 + while len(data) < nb:
305 297 try:
306   - chunk = sock.recv(n - len(data))
  298 + chunk = sock.recv(nb - len(data))
307 299 if chunk == '':
308 300 break
309 301 data += chunk
... ... @@ -375,7 +367,9 @@
375 367  
376 368  
377 369 #==============================================================================
378   -def eddsctrlserver(settings_file):
  370 +def main(settings_file):
  371 + """Main
  372 + """
379 373 configure_logging()
380 374 if os.path.isfile(settings_file) is False:
381 375 logging.error("Settings file missing: create one with default values.")
... ... @@ -385,10 +379,5 @@
385 379  
386 380 #==============================================================================
387 381 if __name__ == '__main__':
388   - # Ctrl-c closes the application
389   - import signal
390   - signal.signal(signal.SIGINT, signal.SIG_DFL)
391   -
392   - eddsctrlserver(CFG_SERVER_FILE)
393   -
  382 + main(CFG_SERVER_FILE)