From 242ba6da20c8407ff555c960d9ee7c867b082fc6 Mon Sep 17 00:00:00 2001
From: 488_MP-4 <488_MP-4@iastate.edu>
Date: Sun, 12 Nov 2023 23:02:03 +0100
Subject: [PATCH] More function signatures

---
 cflib_groundstation/LogfileHandler.py         | 114 ++++++++----------
 .../__pycache__/LogfileHandler.cpython-38.pyc | Bin 4849 -> 3148 bytes
 .../SetpointHandler.cpython-38.pyc            | Bin 7436 -> 7436 bytes
 .../crazyflie_connection.cpython-38.pyc       | Bin 8952 -> 9845 bytes
 .../groundstation_socket.cpython-38.pyc       | Bin 4797 -> 4828 bytes
 .../__pycache__/uCartCommander.cpython-38.pyc | Bin 7993 -> 7993 bytes
 cflib_groundstation/crazyflie_connection.py   |  97 ++++++++-------
 cflib_groundstation/groundstation_socket.py   |   1 +
 cflib_groundstation/main.py                   |   8 +-
 9 files changed, 114 insertions(+), 106 deletions(-)

diff --git a/cflib_groundstation/LogfileHandler.py b/cflib_groundstation/LogfileHandler.py
index 4dca8f924..59fea4953 100644
--- a/cflib_groundstation/LogfileHandler.py
+++ b/cflib_groundstation/LogfileHandler.py
@@ -41,69 +41,45 @@ class LogfileHandler:
         self.is_connected = False
         self.param_callback_count = 0
         self.logging_configs = []
+        self.data_log = ""
 
-    def add_log_config(self, name: str, period: int, variables: List[str]):
-        """ Add a logging config. Used from logging tab when refreshing
-        logging variables. Add callback to route logged data to logging
-        queue. """
-
-        print("Name: " + name + ", period: " + str(period) + ", variables: "
-              + str(variables))
-        logging_group = LogConfig(name=name, period_in_ms=period)
-
-        for variable in variables:
-            logging_group.add_variable(variable, 'float')
-
-        self.logging_configs.append(logging_group)
-        self.logging_configs[-1].data_received_cb.add_callback(
-            self.logging_callback)
-        self.scf.cf.log.add_config(self.logging_configs[-1])
-
-
-    def refresh_logging_configs(self):
-        return self.read_all_active_blocks()
-
-    def load_logging_configs(self):
-        return self.read_all_active_blocks()
-
-    def clear_logging_configs(self):
-        """ Stop logging and clear configuration. Used when refreshing
-        logging to stop anything that has configured to be logged from
-        logging. """
-
-        self.stop_logging()
-        self.logging_configs = []
-        # done refreshing toc is a callback function that is triggered when
-        # refresh toc is done executing.
-        self.scf.cf.log.refresh_toc(
-            self.done_refreshing_toc, self.scf.cf.log._toc_cache)
-        # Blocks until toc is done refreshing.
-        while self.param_callback_count < 1:
-            time.sleep(0.01)
-        self.param_callback_count = 0
-
-        # grabs new toc values
-        self.scf.wait_for_params()
     
-    def resume_logging_configs():
-        raise Exception
-
-    def pause_logging_configs():
-        raise Exception
-
-    def enable_logging(self):
-        """ Begins logging all configured logging blocks. This is used from
-        the controls tab when hitting begin logging. """
-        for i in range(0, len(self.logging_configs)):
-            self.logging_configs[i].start()
-
-    def disable_logging(self):
-        """ Stops logging all configured logging blocks. This is used from
-        the controls tab when hitting pause logging. """
-        for i in range(0, len(self.logging_configs)):
-            self.logging_configs[i].stop()
-
 
+    def CopyTocToFile(self, toc :dict, isParams):
+        if isParams:
+            logType = "Param"
+        else:
+            logType = "Log"
+
+        filename = os.getcwd()    
+        filename += f"/logs/cflie1_{logType}_toc_{time.strftime('%Y_%m_%d_%H:%M:%S', time.localtime())}.txt"
+        # print(f"TOCtoFILE:{filename}")
+
+        types = {'uint8_t'  : 0x08,
+                 'uint16_t' : 0x09,
+                 'uint32_t' : 0x0A,
+                 'uint64_t' : 0x0B,
+                 'int8_t'   : 0x00,
+                 'int16_t'  : 0x01,
+                 'int32_t'  : 0x02,
+                 'int64_t'  : 0x03,
+                 'FP16'     : 0x05,
+                 'float'    : 0x06,
+                 'double'   : 0x07}
+
+        file = open(filename, "w")
+        file.write(f"{logType} ID   Type    Group   Identifier Name\n")
+        file.close()
+        file = open(filename, "a")
+        for group in list(toc.keys()):
+            for name in list(toc[group].keys()):
+                file.write(f"{toc[group][name].ident}    {types.get(toc[group][name].ctype)}    {group}    {name}\n")
+                #print(f" Identity: {toc[group][name].ident} Packet Type:{toc[group][name].pytype} CType:{toc[group][name].ctype} Group:{group} Name:{name}\n")
+
+                   
+
+        file.close()
+        return filename
 
     def read_all_active_blocks(self):
         active_blocks = []
@@ -119,7 +95,6 @@ class LogfileHandler:
                 i = 0
                 newLine = logBlockFile.readline().strip()
                 while newLine != "END BLOCK":
-                    print(newLine)
                     if newLine == "" or newLine == "END BLOCK":
                         print("New Line: " + newLine)
                         raise Exception("loggingBlocks.txt is not formatted correctly")
@@ -136,8 +111,23 @@ class LogfileHandler:
                 config = LogConfig(data[1], data[2])
                 for i in range(3, len(data)):
                     config.add_variable(data[i])
-                config.create()
                 active_blocks.append(config)
         return active_blocks
         
+    def create_log_data_file(self):
+        raise Exception
+
+    def add_config_headers(self):
+        raise Exception
+
+    def start_logging(self):
+        raise Exception
+    
+    def stop_logging(self):
+        raise Exception
+    
+    def write_data_point(self):
+        raise Exception
+
+
 
diff --git a/cflib_groundstation/__pycache__/LogfileHandler.cpython-38.pyc b/cflib_groundstation/__pycache__/LogfileHandler.cpython-38.pyc
index 7fcdd75366634ed8a67ceb0bc0249148df63257c..6467201807fee9556118b139b0fd672116df9b80 100644
GIT binary patch
delta 1463
zcmZ8h&2QX96!+LO_N;fk*=+N*fXb#~5z8S_N*bz2ND(ce6{RXlKw>3ixt`gTiDPfZ
zPSdQsT8Z??p^}enq}?MoJ|rX#J#j+fz=a;>KiC6Oxp3x<(?DBW^PAs1zj^P?dvE-A
z>-VMV=Z<4*@T_cq#($jop_-u&3|MZ#NLB#2)<I0`=nQoXrZeM#*1?=G{1`F9%m=t*
zGK*1=TCB9Awe6oQ{VA%nk;DlPyWeSIE}t5M5t2q4`@S-L{*-`JU|fTdJOjvdVKX!|
zBFyxmk!oW!(S|s~%*c#K8pEkRHW&fK6K$e{#5^VMgN6!#m6*-Stil{tWizbCW?B7l
zc}P+M`!Ae~^r4xVW3w<ccdAbi(qL^(G^7<O^CzH@(hQAD6YT_D*S`8<XsLB(HMIX^
zTSHn{DWn-~XkXh9#zIEM<ulDfR+*qeY86NU7e}X5xjYyje0%OT!;r3}+mhVzgtsq^
zTXApTtcGzfS@pYNz}MUkaUo~!V7B$8+uC<q%x&G+Y<;@f+8N-L^nN;}khG~v<5ZP!
zS_TkEu>y3(RKll38v&Y%S^({`v<`zPz3QftDzdh5&fdFx&NkM8na{PXb0tLz9YqQi
zynSbFLy~S7d!Wza!@D7u=xFeE^XBztv$=cR=P-?$AB*^~59}u6Q5tjuE}FN!eQrzS
z4KT=?64`A>>Tx2?9#8!vCNRV*X_AU=8tikSjv{f~=aD2wB1pL;ei$cQ;xI^3iTC(%
zB1xd^O9M>6=M=oROX7k$zgUF*9U3G>zLSmxsaDZR+6_V;K`fFe{X}9Vkff&~mRNle
zbFlXe=2aBVwYY!08~eNQHmI(GC|L*45Jsksb&4(-I(qTF`h4+^S+P+KQKWDVZ4rtF
zZ$Rah#~WV6LM~QbvYkJ2UPBxC&(1}3IsemH&u6QzU-=`m7~a#93}(8gi-##@rOaA{
z##Qai>=X12%1lN;XAE;0biU7n>gqDfbaku7`b1+ENS~!RBQNgCf2}Sr&%tG(V>=_6
z+0azqK12sKxEdfWy11S<W}b}1n{Z-rQ9%=+T^3hhl2mYyg+T-vgwh3lX+U-*=?mx>
zS^DU{&--Z*N7D5AP)a5ZkPG!6kVJS<kIRb3n0wC?fd{QrR1fOrczzn(<L=!s_V<!b
zC5-c}+NF_1LC1>t(JkfA^y8=-^j<C2f(pp>!q9!m#tyhlHUU)C>|#(T%n~pP1EUJe
zHHCT&)pQ%!S?MUM7jFd(^1o{DAet}Cu6(kfPJmh9r{Y7PVpqZcZBsDSJHi1_BvH2)
iJYhOteXEeR8$#V#ng2HX3zGRs{oUHD2J$EM^?w0NZhBS#

literal 4849
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
DM(hO6

diff --git a/cflib_groundstation/__pycache__/SetpointHandler.cpython-38.pyc b/cflib_groundstation/__pycache__/SetpointHandler.cpython-38.pyc
index 0c7e0a74ab5cc30a12251e4bb5914b570dbe5755..4b6fa575d603a6f5965726a792f3559d6bdcb65f 100644
GIT binary patch
delta 19
YcmeCN>apSq<>lpK00JHBja*E!04JCOQ2+n{

delta 19
YcmeCN>apSq<>lpK0D>pF8@ZTd0V|>d`v3p{

diff --git a/cflib_groundstation/__pycache__/crazyflie_connection.cpython-38.pyc b/cflib_groundstation/__pycache__/crazyflie_connection.cpython-38.pyc
index c0374ef88a85fc8fd2568c1ec8d3a508f778406b..a880844f863cc0e4376eae434e19710590875b17 100644
GIT binary patch
delta 4295
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

delta 3379
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

diff --git a/cflib_groundstation/__pycache__/groundstation_socket.cpython-38.pyc b/cflib_groundstation/__pycache__/groundstation_socket.cpython-38.pyc
index c7682e1b85a3353b38ec590272b6af5937d17a5e..be803194c29d9124de995ab5d59fc3d0dbd15cd0 100644
GIT binary patch
delta 110
zcmdn1dPkKvl$V!_0SKns2Bt3A$h(oBF=g_8{zQ%_i4^f*22F{{DgqT8FU5f>{4^yu
z&lfOb6uBkj<L~a|<L~V4?C<OA=;spe=`z`#Pn0hLsA>uj7wZ5Cj!8mtlLdr0n3-4@
JC(8@X0{|m^8Sel9

delta 60
zcmcbkx>uDql$V!_0SKN8`lNPj<lV^6m@s)ie<DjTgQoao4S@<~KTV0vD+J6KCw~%@
PW7L`~D5N{tL1+#D^<xl?

diff --git a/cflib_groundstation/__pycache__/uCartCommander.cpython-38.pyc b/cflib_groundstation/__pycache__/uCartCommander.cpython-38.pyc
index 80519f2ef307568ffdfa9785fe9f2aa52894b146..85e268143825e20c74f5e47f55281d03cd536423 100644
GIT binary patch
delta 332
zcmdmKx6_V0l$V!_0SI)g12=Ln;9`v0yoM`;l~H#xqkuG{-ey^W1SS|~@+=`!0Ry1g
zB0~_N2qH{3-xr#}2vadhN@Vj2kx2+0;o`R3_8@f*Ai{C-eDOL7TM$zLM96~(B@p2R
zBqkS%MsJ=V5sYM-1*7d|OQ|S?c^hQR8Qmry<Pe_xTV|Dk7D%fOh%g2bW+1`>MA!j|
zTdZk0`H3Y(E+7GS5aBubs%#Xa?_>kH6dyg1fI5iK1`+xo!URY}aVO@Kc;x4#gj5!!
n7MX)Y_}xN%eBy&c979~=Lm~rQi!4Ekok4^vi13*FKrRvh%yvjy

delta 332
zcmdmKx6_V0l$V!_0SIc2I&I`$z{PlL^BS%YRz|(ai~`b(`kQ415}06|$+Lt^1q^{|
zi;O^oB8V{Cd|zk=BTU64DUr=9L?$70gp1p9JAl+Vf(WO{^Tq2V>_AKf5FrmDlt6?t
zkeFO38ohafL@<(R7L0bAEv2Fm=53HMXLO%@kVAO#Z<$pF+90jEAi@Mhn1cvQ5Md7_
zZn382<R_LCxq<{dK!n%itFlpyev=L4QhfA50_q?_2SgZv2vZ;t#hsW_;*p<|5>i=^
nT4Vtd;dcx5@re%(aSU;d4~YzLEwTbBb^#G?Ai{I<1Gz{5elAJR

diff --git a/cflib_groundstation/crazyflie_connection.py b/cflib_groundstation/crazyflie_connection.py
index 5c427193e..4e414f4ed 100644
--- a/cflib_groundstation/crazyflie_connection.py
+++ b/cflib_groundstation/crazyflie_connection.py
@@ -16,6 +16,7 @@ import os
 import cflib.crtp
 from cflib.crazyflie import Crazyflie
 from cflib.crazyflie.syncCrazyflie import SyncCrazyflie
+from cflib.crazyflie.syncLogger import SyncLogger
 from queue import Queue
 #import groundstation_socket as gs
 import uCartCommander
@@ -23,6 +24,7 @@ from groundstation_socket import MessageTypeID
 from SetpointHandler import SetpointHandler, FlightMode
 from cflib.crazyflie.log import LogConfig
 import numpy as np
+from LogfileHandler import LogfileHandler
 
 
 class CrazyflieConnection:
@@ -51,6 +53,7 @@ class CrazyflieConnection:
         self.logging_configs = []
 
         self.setpoint_handler = SetpointHandler()
+        self.logfile_handler = LogfileHandler()
 
         # self.timer = QTimer()
         # self.timer.timeout.connect(self.update_plot)
@@ -250,10 +253,11 @@ class CrazyflieConnection:
         id = command['data'][0]
         print(id)
         if id == 0: # logdata?
-            raise Exception # Not implemented
+            for config in self.logging_configs:
+                self.simple_log(self.scf, config)
         elif id == 1: # param toc
             params = self.get_param_toc()
-            filename = self.CopyTocToFile(params, True)
+            filename = self.logfile_handler.CopyTocToFile(params, True)
             data = bytearray()
             data += bytes(filename, 'utf-8')
             responsedata = {
@@ -265,7 +269,7 @@ class CrazyflieConnection:
             outputQueue.put(responsedata)
         elif id == 2: # logging toc
             logs = self.get_logging_toc()
-            filename = self.CopyTocToFile(logs, False)
+            filename = self.logfile_handler.CopyTocToFile(logs, False)
             data = bytearray()
             data += bytes(filename, 'utf-8')
             responsedata = {
@@ -281,43 +285,54 @@ class CrazyflieConnection:
             raise Exception # Not implemented
         else :
             raise Exception
-    def LogBlockCommand(): 
-        #TODO
-        raise Exception
+        
+    def LogBlockCommand(self, command): 
+        print("Log Block Command")
+        id = command['data'][0]
+        print(id)
+        if id == 0:
+            self.delete_log_blocks()
+        elif id == 1:
+            self.delete_log_blocks()
+            self.logging_configs = self.logfile_handler.read_all_active_blocks()
+        elif id == 2:
+            self.logging_configs = self.logfile_handler.read_all_active_blocks()
+        elif id == 3:
+            block_id = command['data'][1]
+            self.logging_configs.remove(self.logging_configs[block_id])
+        elif id == 4:
+            self.enable_logging()
+        elif id == 5:
+            self.disable_logging()
+            
+    def simple_log(self, scf, logconf):
+        print("Logging...")
+        with SyncLogger(scf, logconf) as logger:
+            for log_entry in logger:
+                timestamp = log_entry[0]
+                data = log_entry[1]
+                logconf_name = log_entry[2]
+
+                print('[%d][%s]: %s' % (timestamp, logconf_name, data))
+
+                break
+
+    def enable_logging(self):
+        """ Begins logging all configured logging blocks. This is used from
+        the controls tab when hitting begin logging. """
+        for i in range(0, len(self.logging_configs)):
+            self.logging_configs[i].start()
+
+    def disable_logging(self):
+        """ Stops logging all configured logging blocks. This is used from
+        the controls tab when hitting pause logging. """
+        for i in range(0, len(self.logging_configs)):
+            self.logging_configs[i].stop()
+    
+    def delete_log_blocks(self):
+        for block in self.logging_configs:
+            block.delete()
+            self.logging_configs.remove(block)
+
 
 
-    def CopyTocToFile(self, toc :dict, isParams):
-        if isParams:
-            logType = "Param"
-        else:
-            logType = "Log"
-
-        filename = os.getcwd()    
-        filename += f"/logs/cflie1_{logType}_toc_{time.strftime('%Y_%m_%d_%H:%M:%S', time.localtime())}.txt"
-        # print(f"TOCtoFILE:{filename}")
-
-        types = {'uint8_t'  : 0x08,
-                 'uint16_t' : 0x09,
-                 'uint32_t' : 0x0A,
-                 'uint64_t' : 0x0B,
-                 'int8_t'   : 0x00,
-                 'int16_t'  : 0x01,
-                 'int32_t'  : 0x02,
-                 'int64_t'  : 0x03,
-                 'FP16'     : 0x05,
-                 'float'    : 0x06,
-                 'double'   : 0x07}
-
-        file = open(filename, "w")
-        file.write(f"{logType} ID   Type    Group   Identifier Name\n")
-        file.close()
-        file = open(filename, "a")
-        for group in list(toc.keys()):
-            for name in list(toc[group].keys()):
-                file.write(f"{toc[group][name].ident}    {types.get(toc[group][name].ctype)}    {group}    {name}\n")
-                #print(f" Identity: {toc[group][name].ident} Packet Type:{toc[group][name].pytype} CType:{toc[group][name].ctype} Group:{group} Name:{name}\n")
-
-                   
-
-        file.close()
-        return filename
diff --git a/cflib_groundstation/groundstation_socket.py b/cflib_groundstation/groundstation_socket.py
index d003fb783..8e769525d 100644
--- a/cflib_groundstation/groundstation_socket.py
+++ b/cflib_groundstation/groundstation_socket.py
@@ -168,6 +168,7 @@ class MessageTypeID(Enum):
     #MAX_TYPE_ID = 21
     GETLOGFILE_ID = 21
     RESPLOGFILE_ID = 22
+    LOGBLOCKCOMMAND_ID = 23
 
 
 
diff --git a/cflib_groundstation/main.py b/cflib_groundstation/main.py
index 212ed6b46..7b12911f7 100644
--- a/cflib_groundstation/main.py
+++ b/cflib_groundstation/main.py
@@ -65,6 +65,8 @@ class main():
                     self.cfConnect.LogBlockCommand()
                 elif msg_type == MessageTypeID.GETLOGFILE_ID.value:
                     self.cfConnect.GetLogFile(command, self.outputQueue)
+                elif msg_type == MessageTypeID.LOGBLOCKCOMMAND_ID.value:
+                    self.cfConnect.LogBlockCommand(command)
             
             
 
@@ -76,8 +78,8 @@ class main():
 
 
 if __name__ == '__main__':
-    lf = LogfileHandler()
-    lf.read_all_active_blocks()
-    #main().start()
+    #lf = LogfileHandler()
+    #lf.read_all_active_blocks()
+    main().start()
     
     
\ No newline at end of file
-- 
GitLab