From e7522bf1c30c035bb43beefa2acaae43d12639ec Mon Sep 17 00:00:00 2001
From: kjunge <kai.junge@epfl.ch>
Date: Sat, 22 Jan 2022 01:47:34 +0100
Subject: [PATCH] Organised comms_wrapper.py

---
 .gitignore             |   2 +-
 comms_wrapper.py       | 116 +++++++++++++++++++++--------------------
 pyComms/pyComms.ino    |   3 +-
 pyComms/pyCommsLib.cpp |   1 +
 4 files changed, 63 insertions(+), 59 deletions(-)

diff --git a/.gitignore b/.gitignore
index c18dd8d..ba0430d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-__pycache__/
+__pycache__/
\ No newline at end of file
diff --git a/comms_wrapper.py b/comms_wrapper.py
index 363dc20..49ceb6f 100644
--- a/comms_wrapper.py
+++ b/comms_wrapper.py
@@ -4,7 +4,6 @@ from threading import Thread
 import time
 from pynput import keyboard
 
-
 ########
 ### Arduino communication
 ########
@@ -23,6 +22,7 @@ class Arduino:
         self.handshakeStatus = False
 
 
+    # Private methods
     def _serial_readline(self):
         while 1:
             try:
@@ -42,7 +42,7 @@ class Arduino:
             self.arduino.write(bytes(msg, 'utf-8'))
 
 
-    def add_new_message_name(self, msgName):
+    def _add_new_message_name(self, msgName):
         if msgName in self.receivedMessages:
             print("!! Message name ", msgName, " already exists so it cannot be added. !!")
         else:
@@ -50,14 +50,6 @@ class Arduino:
             self.messageNames = list(self.receivedMessages.keys())
 
 
-    def delete_message_name(self, msgName):
-        if msgName in self.receivedMessages:
-            del self.receivedMessages[msgName]
-            self.messageNames = list(self.receivedMessages.keys())
-        else:
-            print("!! Message name ", msgName, " does not exist so it cannot be deleted. !!")
-
-
     def _just_connect(self):
         # Connect to the arduino device
         try: 
@@ -76,8 +68,45 @@ class Arduino:
         self.arduino.dtr = False
         
 
-    def disconnect_arduino(self):
-        self.arduino.close()
+    def _disect_and_save_message(self, msg):
+
+        receivedMessageTemp = self.receivedMessages
+
+        if msg[-2] != ":":
+            return False
+
+        msg = msg[1:-2]
+        splitMsg = msg.split(":")
+        for singleMsg in splitMsg:
+            if len(singleMsg.split(";")) == 2:
+                msgName = singleMsg.split(";")[0]
+                msgPayload = singleMsg.split(";")[1]
+
+                if msgName not in self.messageNames:
+                    return False
+                
+                receivedMessageTemp[msgName] = msgPayload
+
+            else:
+                return False
+
+        self.receivedMessages = receivedMessageTemp
+        return True
+
+
+    def _list_connected_serial_devices():
+        devices = list(serial.tools.list_ports.comports())
+        for device in devices: 
+            print(device)
+
+
+    # Public methods
+    def define_message_names(self, msgNames):
+        if type(msgNames) == list:
+            for msg in msgNames:
+                self._add_new_message_name(msg) 
+        else: 
+            print("Argument should be of type 'list'")
 
 
     def connect_and_handshake(self): 
@@ -124,11 +153,15 @@ class Arduino:
         return self.handshakeStatus
 
 
+    def disconnect_arduino(self):
+        self.arduino.close()
+
+
     def send_message(self, msg):
         self._serial_write( msg + "\n")
 
 
-    def receive_message(self):
+    def receive_message(self, showOutput = False, verbose = False):
         if not self.handshakeStatus:
             print("!! Handshake not completed !!")
             return False
@@ -144,40 +177,20 @@ class Arduino:
             except:
                 isMessageValid = False
             if isMessageValid:
-                isMessageValid = self.disect_and_save_message(msg)
+                isMessageValid = self._disect_and_save_message(msg)
             else:
                 pass
             
+            if showOutput: 
+                if verbose: 
+                    print("Raw message received: ", self._rawReceivedMessage, " |  Segmented message: ", self.receivedMessages)
+                else:
+                    print("Received: ", self.receivedMessages)
+
             time.sleep(0.000001)
             return True
 
 
-    def disect_and_save_message(self, msg):
-
-        receivedMessageTemp = self.receivedMessages
-
-        if msg[-2] != ":":
-            return False
-
-        msg = msg[1:-2]
-        splitMsg = msg.split(":")
-        for singleMsg in splitMsg:
-            if len(singleMsg.split(";")) == 2:
-                msgName = singleMsg.split(";")[0]
-                msgPayload = singleMsg.split(";")[1]
-
-                if msgName not in self.messageNames:
-                    return False
-                
-                receivedMessageTemp[msgName] = msgPayload
-
-            else:
-                return False
-
-        self.receivedMessages = receivedMessageTemp
-        return True
-
-
 ########
 ### Key commands
 ########
@@ -186,34 +199,23 @@ class Key():
     def __init__(self):                
         self.keyPressValue = None
         self.keyReleaseValue = None
-        self.start_keyboard_listener()
+        self._start_keyboard_listener()
 
-    def on_press(self, key):
+    def _on_press(self, key):
         try:
             self.keyPressValue = key.char
         except AttributeError:
             self.keyPressValue = key
             
 
-    def on_release(self, key):
+    def _on_release(self, key):
         try:
             self.keyReleaseValue = key.char
         except AttributeError:
             self.keyReleaseValue = key
 
 
-    def start_keyboard_listener(self):  
-        listener = keyboard.Listener(on_press=self.on_press, on_release=self.on_release)
+    def _start_keyboard_listener(self):  
+        listener = keyboard.Listener(on_press=self._on_press, on_release=self._on_release)
         listener.start()
-        print("keyboard listener started")
-
-
-
-########
-### Other useful functions
-########
-
-def list_connected_serial_devices():
-    devices = list(serial.tools.list_ports.comports())
-    for device in devices: 
-        print(device)
\ No newline at end of file
+        print("keyboard listener started")
\ No newline at end of file
diff --git a/pyComms/pyComms.ino b/pyComms/pyComms.ino
index ca36684..7cc0304 100644
--- a/pyComms/pyComms.ino
+++ b/pyComms/pyComms.ino
@@ -12,7 +12,7 @@ String msgName[] = {"item1", "item2", "item3"};
 // An array of strings which will be the payload
 // Each element corresponds to the message defined in msgName
 // Make sure the array length of msgName and Data match
-String Data[] = {"Null", "Null", "Null"};
+String dataCarrier[] = {"Null", "Null", "Null"};
 
 // The length of the msgName and Data array
 const int numOfMsg = 3;
@@ -31,6 +31,7 @@ void setup() {
 
 void loop() {
 
+
   ////////////////////
   // RECEIVING DATA
   ////////////////////
diff --git a/pyComms/pyCommsLib.cpp b/pyComms/pyCommsLib.cpp
index f7cd0bf..d5fd277 100644
--- a/pyComms/pyCommsLib.cpp
+++ b/pyComms/pyCommsLib.cpp
@@ -1,6 +1,7 @@
 #include "pyCommsLib.h"
 #include "Arduino.h"
 
+
 void send_msg(String* msgName, String* msg, int numOfMsg) {
   // If we have the same number of data compared to the message
   String payload = "<";
-- 
GitLab