1212
1313from can_cando .CANdoImport import (
1414 CAN_MSG_TIMESTAMP_RESOLUTION ,
15+ CANDO_BUS_LOAD_STATUS ,
1516 CANDO_CAN_BUFFER_LENGTH ,
17+ CANDO_DATE_STATUS ,
1618 CANDO_DEVICE_STATUS ,
1719 CANDO_ID_11_BIT ,
1820 CANDO_ID_29_BIT ,
3840 CANdoInitializationError ,
3941 CANdoMode ,
4042 CANdoOpenDevice ,
41- # CANdoRequestBusLoadStatus,
42- # CANdoRequestDateStatus,
4343 CANdoOperationError ,
4444 CANdoPIDType ,
4545 CANdoReceive ,
4646 CANdoRepeatTime ,
47+ CANdoRequestBusLoadStatus ,
48+ CANdoRequestDateStatus ,
4749 CANdoRequestStatus ,
4850 CANdoSetBaudRate ,
4951 CANdoSetFilters ,
@@ -175,7 +177,7 @@ def __init__(
175177 f"Driver = v{ DriverVersion .value / 10 } \n "
176178 )
177179
178- self .devices_PIDs : list [bytes ] = []
180+ self .devices_PIDs : List [bytes ] = []
179181 self ._detect_cando_iso ()
180182
181183 if channel is None :
@@ -496,18 +498,36 @@ def cando_request_status(self) -> None:
496498 detected on the CAN bus, or if there is an internal system error within the
497499 CANdo device.)
498500 """
501+ # TODO: Use "CANdoRequestStatus" function
499502
500- def cando_get_date_status (self ) -> None :
503+ def cando_get_date_status (self ) -> Optional [ Tuple [ int , int , int ]] :
501504 """Request the date of manufacture of the CANdo device.
502505
503506 After sending this command to CANdo, the date status is transmitted back to
504507 the PC in <1ms. To read the status, call the CANdoReceive(...) function &
505508 interrogate the NewFlag & status information within the TCANdoStatus
506509 parameter.
510+
511+ :return: Tuple containing the manufacturing date as (day, month, year).
507512 """
508- # TODO: Use "CANdoRequestDateStatus" function
513+ ret = None
514+ with self ._recv_lock : # Ensure that the receiving thread does not interfere
515+ if CANdoRequestDateStatus (self .CANdoUSBPtr ) == CANdoFuncRetCode .CANDO_SUCCESS :
516+ sleep (0.001 )
517+ self .CANdoStatus .NewFlag = CANDO_NO_STATUS # Clear status flag
518+ if (
519+ CANdoReceive (
520+ self .CANdoUSBPtr ,
521+ self .CANdoCANBufferPtr ,
522+ self .CANdoStatusPtr ,
523+ )
524+ == CANdoFuncRetCode .CANDO_SUCCESS
525+ ) and self .CANdoStatus .NewFlag == CANDO_DATE_STATUS : # type: ignore
526+ ret = (self .CANdoStatus .SoftwareVersion , self .CANdoStatus .Status , self .CANdoStatus .BusState )
527+
528+ return ret
509529
510- def cando_request_bus_load_status (self ) -> None :
530+ def cando_request_bus_load_status (self ) -> Optional [ Tuple [ float , int , int ]] :
511531 """Request the CAN bus loading as calculated by connected device.
512532
513533 The bus load is calculated every second, while the device is running.
@@ -516,8 +536,28 @@ def cando_request_bus_load_status(self) -> None:
516536 back to the PC in <1ms. To read the status, call the CANdoReceive(...)
517537 function & interrogate the NewFlag & status information within the
518538 TCANdoStatus parameter.
539+
540+ :return: Tuple containing bus load percentage, CAN RX error count, CAN TX error count.
519541 """
520- # TODO: Use the "CANdoRequestBusLoadStatus" function
542+ ret = None
543+ with self ._recv_lock : # Ensure that the receiving thread does not interfere
544+ if CANdoRequestBusLoadStatus (self .CANdoUSBPtr ) == CANdoFuncRetCode .CANDO_SUCCESS :
545+ sleep (0.001 )
546+ self .CANdoStatus .NewFlag = CANDO_NO_STATUS # Clear status flag
547+ if (
548+ CANdoReceive (
549+ self .CANdoUSBPtr ,
550+ self .CANdoCANBufferPtr ,
551+ self .CANdoStatusPtr ,
552+ )
553+ == CANdoFuncRetCode .CANDO_SUCCESS
554+ ) and self .CANdoStatus .NewFlag == CANDO_BUS_LOAD_STATUS : # type: ignore
555+ ret = (
556+ self .CANdoStatus .HardwareVersion + self .CANdoStatus .SoftwareVersion / 10 ,
557+ self .CANdoStatus .Status ,
558+ self .CANdoStatus .BusState ,
559+ )
560+ return ret
521561
522562 def get_status_description (self ) -> str :
523563 """Request the CAN bus & internal CANdo status.
0 commit comments