Преглед изворни кода

Now possible to control pci via socket connection

ATTENTION!!! : every file operation like creation of directories etc is done locally
therefore: acquisition will not work due to another directory structure on board-system and gui system
Patrick Schreiber пре 8 година
родитељ
комит
a25ca531ac
8 измењених фајлова са 163 додато и 7 уклоњено
  1. 23 3
      base/backend/board.py
  2. 4 1
      config.py
  3. 3 0
      icons/clipboard.svg
  4. 59 0
      icons/clipboard_comm.svg
  5. 0 0
      icons/log.svg
  6. 3 3
      kcg.py
  7. 48 0
      kcg_remote_server.py
  8. 23 0
      widgets/remote.py

+ 23 - 3
base/backend/board.py

@@ -4,6 +4,7 @@ import logging
 import subprocess
 import ConfigParser
 import numpy as np
+import socket
 
 log = logging.getLogger(__name__)
 
@@ -277,9 +278,9 @@ class BoardConfiguration():
         write_delay(delay, 4)
         self.update('adc_1_delay', delay)
 
-    # @property
-    # def contiuous_read(self):
-    #     return self.continu
+    @property
+    def contiuous_read(self):
+        return self.continu
 
 
 def safe_call(cmd):
@@ -291,6 +292,25 @@ def safe_call(cmd):
     except OSError as e:
         raise BoardError('{}: {}'.format(' '.join(cmd), str(e)))
 
+backup_safe_call = safe_call
+
+host = None
+port = None
+def safe_remote_call(cmd):
+    soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    soc.connect((host, port))
+    soc.send(str(cmd))
+    soc.settimeout(None)
+    l = int(soc.recv(100))
+    print l
+    ret = ""
+    for i in range(1, l/4096 + 1):
+        ret += soc.recv(i*4096)
+    ret += soc.recv(l%4096)
+    soc.close()
+    print ret
+    return ret
+
 def write_pci(value, reg='0x9040', opts=[], hex_mask='FFFFFFFF'):
     if hex_mask != 'FFFFFFFF':
         if len(hex_mask) > 8:

+ 4 - 1
config.py

@@ -36,7 +36,8 @@ default_save_location = "pwd"
 
 # {ask} always ask for a foldername
 #default_subdirectory_name = "{user}_{dateGd}-{timel}_{sessionname}"
-default_subdirectory_name = "{sessionname}"
+# default_subdirectory_name = "{sessionname}"
+default_subdirectory_name = 't'
 # reask on cancel in dialog or use {user}_{dateGd}-{timel} as default when cancel is pressed?
 force_ask = False
 
@@ -63,6 +64,8 @@ singleReadIcon = "icons/project.svg"
 acquireSettingsIcon = "icons/wrench.svg"
 startIcon = "icons/media-play-black.svg"
 stopIcon = "icons/media-stop.svg"
+logIcon = "icons/clipboard.svg"
+logCommentIcon = "icons/clipboard_comm.svg"
 guiIcon = "icons/KCG_Logo_r.png"
 # -----------[ End Icons ]-------------------
 

+ 3 - 0
icons/clipboard.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
+  <path d="M3.5 0c-.28 0-.5.22-.5.5v.5h-.75c-.14 0-.25.11-.25.25v.75h3v-.75c0-.14-.11-.25-.25-.25h-.75v-.5c0-.28-.22-.5-.5-.5zm-3.25 1c-.14 0-.25.11-.25.25v6.5c0 .14.11.25.25.25h6.5c.14 0 .25-.11.25-.25v-6.5c0-.14-.11-.25-.25-.25h-.75v2h-5v-2h-.75z" />
+</svg>

+ 59 - 0
icons/clipboard_comm.svg

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="8"
+   height="8"
+   viewBox="0 0 8 8"
+   id="svg9737"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="clipboard_comm.svg">
+  <metadata
+     id="metadata9745">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs9743" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1280"
+     inkscape:window-height="965"
+     id="namedview9741"
+     showgrid="false"
+     inkscape:zoom="29.5"
+     inkscape:cx="4"
+     inkscape:cy="4"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg9737" />
+  <path
+     d="M3.5 0c-.28 0-.5.22-.5.5v.5h-.75c-.14 0-.25.11-.25.25v.75h3v-.75c0-.14-.11-.25-.25-.25h-.75v-.5c0-.28-.22-.5-.5-.5zm-3.25 1c-.14 0-.25.11-.25.25v6.5c0 .14.11.25.25.25h6.5c.14 0 .25-.11.25-.25v-6.5c0-.14-.11-.25-.25-.25h-.75v2h-5v-2h-.75z"
+     id="path9739" />
+  <path
+     inkscape:connector-curvature="0"
+     d="M 4.440678,3.457627 3.9491526,3.9491525 4.9322034,4.9322033 5.4237289,4.4406779 4.440678,3.457627 Z m -0.9830509,0.9830509 -1.9661017,1.9661017 0,0.9830509 0.9830509,0 L 4.440678,5.4237288 3.4576271,4.4406779 Z"
+     id="path9798"
+     style="fill:#ffffff;fill-opacity:1" />
+</svg>

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
icons/log.svg


+ 3 - 3
kcg.py

@@ -9,11 +9,11 @@ kcgw.translator = translator
 kcgw.tr = QtCore.QCoreApplication.translate
 
 import base.kcg as kcg
-from erax import Erax
+# from erax import Erax
 
 
-exception_log_handler = Erax('http://psraspi.no-ip.biz:5000/insert/78e55a9524a191f7628f82a20bcaa167:kcg')
-exception_log_handler.install()
+# exception_log_handler = Erax('http://psraspi.no-ip.biz:5000/insert/78e55a9524a191f7628f82a20bcaa167:kcg')
+# exception_log_handler.install()
 
 
 gui=None

+ 48 - 0
kcg_remote_server.py

@@ -0,0 +1,48 @@
+import socket
+import time
+import subprocess
+import argparse as ap
+
+
+class RemoteListener(object):
+    def __init__(self, host, port):
+        super(RemoteListener, self).__init__()
+        self.status = True
+        self.host = host
+        self.port = port
+        self.soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+        self.soc.bind((self.host, self.port))
+        self.soc.listen(0)
+        self.soc.settimeout(None)
+
+    def evaluate(self, command):
+        return subprocess.check_output(eval(command))
+
+    def listen(self):
+
+        # conn, addr = soc.accept()
+        while self.status:
+            try:
+                conn, addr = self.soc.accept()
+                command = conn.recv(1024)
+                if not command: continue
+                print command
+                ret = self.evaluate(command)
+                print ret, str(len(ret))
+                conn.send(str(len(ret)).zfill(100))
+                conn.sendall(ret)
+                conn.close()
+            except socket.error:  # Go on even in case of exception
+                print 'error'
+        conn.close()
+
+if __name__ == '__main__':
+
+    parser = ap.ArgumentParser()
+    parser.add_argument('--host', '-H', type=str, required=True)
+    parser.add_argument('--port', '-p', type=int, required=True)
+    args = parser.parse_args()
+    rl = RemoteListener(args.host, args.port)
+    rl.listen()
+

+ 23 - 0
widgets/remote.py

@@ -22,12 +22,21 @@ class Remote(kcgw.KCGWidgets):
         self.layout = QtGui.QGridLayout()
         self.setLayout(self.layout)
         self.start_stop_button_listen = self.createButton("Allow Remote Control", connect=self.start_stop_listen)
+        self.start_stop_button_send = self.createButton("Control remote Gui", connect=self.start_stop_send)
         self.port = self.createSpinbox(1024, 65000, interval=1, start_value=1330)
         self.port_label = self.createLabel("Port")
         self.layout.addWidget(self.port_label, 0, 0)
         self.layout.addWidget(self.port, 0, 1)
         self.layout.addWidget(self.start_stop_button_listen, 1, 1)
 
+        self.host_label = self.createLabel("Host")
+        self.host_input = self.createInput()
+        self.layout.addWidget(self.host_label, 2, 0)
+        self.layout.addWidget(self.host_input, 2, 1)
+        self.layout.addWidget(self.port_label, 3, 0)
+        self.layout.addWidget(self.port, 3, 1)
+        self.layout.addWidget(self.start_stop_button_send, 4, 1)
+
         self.rl = RemoteListener(self.host, self.port.value(), parent=self)
         self.rl.command_received.connect(self.evaluate)
         self.response.connect(self.rl.response)
@@ -140,6 +149,20 @@ class Remote(kcgw.KCGWidgets):
             self.listen_process.start()
             self.start_stop_button_listen.setText("Disallow Remote Control")
 
+    def start_stop_send(self):
+        self.send_status = not self.send_status
+        if not self.send_status:
+            board.safe_call = board.backup_safe_call
+            self.start_stop_button_send.setText("Control remote Gui")
+        else:
+            board.host = self.host_input.text()
+            board.port = self.port.value()
+            board.safe_call = board.safe_remote_call
+            Elements.setEnabled('no_board', True)
+            bif.bk_check_for_board()
+            bif._bif_status_readout()
+            self.start_stop_button_send.setText("Control local Gui")
+
     def closeEvent(self, event):
         global __widget_id__
         __widget_id__ = None

Неке датотеке нису приказане због велике количине промена