diff --git a/bindings/python/CMakeLists.txt b/bindings/python/CMakeLists.txt index cf9433fc..957ddc07 100644 --- a/bindings/python/CMakeLists.txt +++ b/bindings/python/CMakeLists.txt @@ -32,6 +32,7 @@ pybind11_add_module(icsneopy icsneopy/communication/message/mdiomessage.cpp icsneopy/communication/message/gptpstatusmessage.cpp icsneopy/communication/message/allmacaddressesmessage.cpp + icsneopy/communication/message/apperrormessage.cpp icsneopy/communication/message/ethernetstatusmessage.cpp icsneopy/communication/message/spimessage.cpp icsneopy/communication/message/scriptstatusmessage.cpp diff --git a/bindings/python/icsneopy/communication/message/apperrormessage.cpp b/bindings/python/icsneopy/communication/message/apperrormessage.cpp new file mode 100644 index 00000000..6ab07d63 --- /dev/null +++ b/bindings/python/icsneopy/communication/message/apperrormessage.cpp @@ -0,0 +1,71 @@ +#include +#include +#include + +#include "icsneo/communication/message/apperrormessage.h" + +namespace icsneo { + +void init_errortypes(pybind11::module_& m) { + pybind11::native_enum(m, "AppErrorType", "enum.IntEnum") + .value("RxMessagesFull", AppErrorType::AppErrorRxMessagesFull) + .value("TxMessagesFull", AppErrorType::AppErrorTxMessagesFull) + .value("TxReportMessagesFull", AppErrorType::AppErrorTxReportMessagesFull) + .value("BadCommWithDspIC", AppErrorType::AppErrorBadCommWithDspIC) + .value("DriverOverflow", AppErrorType::AppErrorDriverOverflow) + .value("PCBuffOverflow", AppErrorType::AppErrorPCBuffOverflow) + .value("PCChksumError", AppErrorType::AppErrorPCChksumError) + .value("PCMissedByte", AppErrorType::AppErrorPCMissedByte) + .value("PCOverrunError", AppErrorType::AppErrorPCOverrunError) + .value("SettingFailure", AppErrorType::AppErrorSettingFailure) + .value("TooManySelectedNetworks", AppErrorType::AppErrorTooManySelectedNetworks) + .value("NetworkNotEnabled", AppErrorType::AppErrorNetworkNotEnabled) + .value("RtcNotCorrect", AppErrorType::AppErrorRtcNotCorrect) + .value("LoadedDefaultSettings", AppErrorType::AppErrorLoadedDefaultSettings) + .value("FeatureNotUnlocked", AppErrorType::AppErrorFeatureNotUnlocked) + .value("FeatureRtcCmdDropped", AppErrorType::AppErrorFeatureRtcCmdDropped) + .value("TxMessagesFlushed", AppErrorType::AppErrorTxMessagesFlushed) + .value("TxMessagesHalfFull", AppErrorType::AppErrorTxMessagesHalfFull) + .value("NetworkNotValid", AppErrorType::AppErrorNetworkNotValid) + .value("TxInterfaceNotImplemented", AppErrorType::AppErrorTxInterfaceNotImplemented) + .value("TxMessagesCommEnableIsOff", AppErrorType::AppErrorTxMessagesCommEnableIsOff) + .value("RxFilterMatchCountExceeded", AppErrorType::AppErrorRxFilterMatchCountExceeded) + .value("EthPreemptionNotEnabled", AppErrorType::AppErrorEthPreemptionNotEnabled) + .value("TxNotSupportedInMode", AppErrorType::AppErrorTxNotSupportedInMode) + .value("JumboFramesNotSupported", AppErrorType::AppErrorJumboFramesNotSupported) + .value("EthernetIpFragment", AppErrorType::AppErrorEthernetIpFragment) + .value("TxMessagesUnderrun", AppErrorType::AppErrorTxMessagesUnderrun) + .value("DeviceFanFailure", AppErrorType::AppErrorDeviceFanFailure) + .value("DeviceOvertemperature", AppErrorType::AppErrorDeviceOvertemperature) + .value("TxMessageIndexOutOfRange", AppErrorType::AppErrorTxMessageIndexOutOfRange) + .value("UndersizedFrameDropped", AppErrorType::AppErrorUndersizedFrameDropped) + .value("OversizedFrameDropped", AppErrorType::AppErrorOversizedFrameDropped) + .value("WatchdogEvent", AppErrorType::AppErrorWatchdogEvent) + .value("SystemClockFailure", AppErrorType::AppErrorSystemClockFailure) + .value("SystemClockRecovered", AppErrorType::AppErrorSystemClockRecovered) + .value("SystemPeripheralReset", AppErrorType::AppErrorSystemPeripheralReset) + .value("SystemCommunicationFailure", AppErrorType::AppErrorSystemCommunicationFailure) + .value("TxMessagesUnsupportedSourceOrPacketId", AppErrorType::AppErrorTxMessagesUnsupportedSourceOrPacketId) + .value("WbmsManagerConnectFailed", AppErrorType::AppErrorWbmsManagerConnectFailed) + .value("WbmsManagerConnectBadState", AppErrorType::AppErrorWbmsManagerConnectBadState) + .value("WbmsManagerConnectTimeout", AppErrorType::AppErrorWbmsManagerConnectTimeout) + .value("FailedToInitializeLoggerDisk", AppErrorType::AppErrorFailedToInitializeLoggerDisk) + .value("InvalidSetting", AppErrorType::AppErrorInvalidSetting) + .value("SystemFailureRequestedReset", AppErrorType::AppErrorSystemFailureRequestedReset) + .value("PortKeyMistmatch", AppErrorType::AppErrorPortKeyMistmatch) + .value("BusFailure", AppErrorType::AppErrorBusFailure) + .value("TapOverflow", AppErrorType::AppErrorTapOverflow) + .value("EthTxNoLink", AppErrorType::AppErrorEthTxNoLink) + .value("ErrorBufferOverflow", AppErrorType::AppErrorErrorBufferOverflow) + .value("NoError", AppErrorType::AppNoError) + .finalize(); +} + +void init_apperrormessage(pybind11::module_& m) { + init_errortypes(m); + pybind11::classh(m, "AppErrorMessage") + .def("get_app_error_type", &AppErrorMessage::getAppErrorType) + .def("get_app_error_string", &AppErrorMessage::getAppErrorString); +} + +} // namespace icsneo diff --git a/bindings/python/icsneopy/icsneocpp.cpp b/bindings/python/icsneopy/icsneocpp.cpp index 35338931..d92402ed 100644 --- a/bindings/python/icsneopy/icsneocpp.cpp +++ b/bindings/python/icsneopy/icsneocpp.cpp @@ -20,6 +20,7 @@ void init_linmessage(pybind11::module_&); void init_tc10statusmessage(pybind11::module_&); void init_gptpstatusmessage(pybind11::module_&); void init_allmacaddressesmessage(pybind11::module_&); +void init_apperrormessage(pybind11::module_&); void init_mdiomessage(pybind11::module_&); void init_spimessage(pybind11::module_&); void init_ethernetstatusmessage(pybind11::module_&); @@ -61,6 +62,7 @@ PYBIND11_MODULE(icsneopy, m) { init_tc10statusmessage(m); init_gptpstatusmessage(m); init_allmacaddressesmessage(m); + init_apperrormessage(m); init_mdiomessage(m); init_ethernetstatusmessage(m); init_macsecconfig(m); diff --git a/examples/python/apperror/apperror.py b/examples/python/apperror/apperror.py new file mode 100644 index 00000000..0516edc1 --- /dev/null +++ b/examples/python/apperror/apperror.py @@ -0,0 +1,51 @@ +import icsneopy +import time + +# +# App errors are responses from the device indicating internal runtime errors +# NOTE: To trigger the app error in this example, disable the DW CAN 01 network on the device +# (e.g. with ICS Device Manager) +# +def apperror(): + devices = icsneopy.find_all_devices() + + if len(devices) == 0: + print("no devices found") + return False + + device = devices[0] + print(f"selected {device}") + + def on_apperror(message): + if message.get_app_error_type() != icsneopy.AppErrorType.NetworkNotEnabled: + print("unexpected app error type") + return + print(message.get_app_error_string()) + + filter = icsneopy.MessageFilter(icsneopy.Message.Type.AppError) + callback = icsneopy.MessageCallback(on_apperror, filter) + device.add_message_callback(callback) + + if not device.open(): + print("unable to open device") + return False + + if not device.go_online(): + print("unable to go online") + return False + + frame = icsneopy.CANMessage() + frame.network = icsneopy.Network(icsneopy.Network.NetID.DWCAN_01) + frame.arbid = 0x22 + frame.data = (0xAA, 0xBB, 0xCC) + + if not device.transmit(frame): + print("failed to transmit frame") + return False + + time.sleep(2) # wait for error to come back + + return True + +if __name__ == "__main__": + apperror()