From 42ed48464afa35bf57de03313f70fb326581fd0b Mon Sep 17 00:00:00 2001 From: David Rebbe Date: Tue, 25 Nov 2025 21:48:27 -0500 Subject: [PATCH] add get_firmware_variant() --- include/methods.h | 22 +++++++++++++++--- src/ics/py_neo_device_ex.py | 4 ++++ src/methods.cpp | 45 +++++++++++++++++++++++++++++++++++-- 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/include/methods.h b/include/methods.h index b386f870..605c1279 100644 --- a/include/methods.h +++ b/include/methods.h @@ -101,10 +101,11 @@ extern "C" PyObject* meth_flash_accessory_firmware(PyObject* self, PyObject* args); PyObject* meth_get_accessory_firmware_version(PyObject* self, PyObject* args); PyObject* meth_set_safe_boot_mode(PyObject* self, PyObject* args); - PyObject* meth_get_device_name(PyObject* self, PyObject* args); // icsneoGetDeviceName - PyObject* meth_get_imei(PyObject* self, PyObject* args); // icsneoGetIMEI - PyObject* meth_get_component_versions(PyObject* self, PyObject* args); // icsneoGetComponentVersions + PyObject* meth_get_device_name(PyObject* self, PyObject* args); // icsneoGetDeviceName + PyObject* meth_get_imei(PyObject* self, PyObject* args); // icsneoGetIMEI + PyObject* meth_get_component_versions(PyObject* self, PyObject* args); // icsneoGetComponentVersions PyObject* meth_request_set_neovi_miscio(PyObject* self, PyObject* args); // icsneoRequestSetNeoVIMiscIO + PyObject* meth_get_firmware_variant(PyObject* self, PyObject* args); // icsneoGetFirmwareVariant #ifdef _cplusplus } @@ -2003,6 +2004,21 @@ extern "C" "\tNone\n" \ "\n" +#define _DOC_GET_FIRMWARE_VARIANT \ + MODULE_NAME ".get_firmware_variant(device) -> Int\n" \ + "\n" \ + "Gets firmware variant of the device.\n" \ + "\n" \ + "Args:\n" \ + "\tdevice (:class:`" MODULE_NAME ".PyNeoDeviceEx`): :class:`" MODULE_NAME ".PyNeoDeviceEx`\n\n" \ + "\n" \ + "Raises:\n" \ + "\t:class:`" MODULE_NAME ".RuntimeError`\n" \ + "\n" \ + "Returns:\n" \ + "\t(:class:`int`): :class:`int`: variant\n" \ + "\n" + extern PyMethodDef IcsMethods[]; #endif // _METHODS_H_ diff --git a/src/ics/py_neo_device_ex.py b/src/ics/py_neo_device_ex.py index 0f17dbb6..980e2d42 100644 --- a/src/ics/py_neo_device_ex.py +++ b/src/ics/py_neo_device_ex.py @@ -506,3 +506,7 @@ def get_component_versions(self, *args, **kwargs): def request_set_neovi_miscio(self, *args, **kwargs): "see ics.request_set_neovi_miscio for details on arguments." return ics.request_set_neovi_miscio(self, *args, **kwargs) + + def get_firmware_variant(self, *args, **kwargs): + "see ics.get_firmware_variant for details on arguments." + return ics.get_firmware_variant(self, *args, **kwargs) \ No newline at end of file diff --git a/src/methods.cpp b/src/methods.cpp index 977fd12c..c410b459 100644 --- a/src/methods.cpp +++ b/src/methods.cpp @@ -621,6 +621,12 @@ PyMethodDef IcsMethods[] = { meth_request_set_neovi_miscio, METH_VARARGS, _DOC_REQUEST_SET_NEOVI_MISCIO), + _EZ_ICS_STRUCT_METHOD("get_firmware_variant", + "icsneoGetFirmwareVariant", + "GetFirmwareVariant", + meth_get_firmware_variant, + METH_VARARGS, + _DOC_GET_FIRMWARE_VARIANT), { "override_library_name", (PyCFunction)meth_override_library_name, METH_VARARGS, _DOC_OVERRIDE_LIBRARY_NAME }, { "get_library_path", (PyCFunction)meth_get_library_path, METH_NOARGS, "" }, @@ -5029,8 +5035,8 @@ PyObject* meth_uart_read(PyObject* self, PyObject* args) size_t bytesActuallyRead = 0; // int _stdcall icsneoUartRead(void* hObject, const EUartPort_t uart, void* bData, const size_t bytesToRead, // size_t* bytesActuallyRead, uint8_t* flags) - ice::Function - icsneoUartRead(lib, "icsneoUartRead"); + ice::Function icsneoUartRead( + lib, "icsneoUartRead"); auto gil = PyAllowThreads(); if (!icsneoUartRead(handle, port, buffer, bytesToRead, &bytesActuallyRead, &flags)) { gil.restore(); @@ -5611,3 +5617,38 @@ PyObject* meth_request_set_neovi_miscio(PyObject* self, PyObject* args) // icsne return set_ics_exception(exception_runtime_error(), (char*)ex.what()); } } + +PyObject* meth_get_firmware_variant(PyObject* self, PyObject* args) // icsneoGetFirmwareVariant +{ + (void)self; + PyObject* obj = NULL; + if (!PyArg_ParseTuple(args, arg_parse("O:", __FUNCTION__), &obj)) { + return NULL; + } + if (!PyNeoDeviceEx_CheckExact(obj)) { + return set_ics_exception(exception_runtime_error(), "Argument must be of type " MODULE_NAME ".PyNeoDeviceEx"); + } + void* handle = NULL; + if (!PyNeoDeviceEx_GetHandle(obj, &handle)) { + return NULL; + } + try { + ice::Library* lib = dll_get_library(); + if (!lib) { + char buffer[512]; + return set_ics_exception(exception_runtime_error(), dll_get_error(buffer)); + } + // int __stdcall icsneoGetFirmwareVariant(void* hObject, uint32_t* variant) + ice::Function icsneoGetFirmwareVariant(lib, "icsneoGetFirmwareVariant"); + auto gil = PyAllowThreads(); + uint32_t variant = 0; + if (!icsneoGetFirmwareVariant(handle, &variant)) { + gil.restore(); + return set_ics_exception(exception_runtime_error(), "icsneoGetFirmwareVariant() Failed"); + } + gil.restore(); + return Py_BuildValue("I", variant); + } catch (ice::Exception& ex) { + return set_ics_exception(exception_runtime_error(), (char*)ex.what()); + } +}