Skip to content

Commit f62ca92

Browse files
Support for SDeviceSettings. Disabled by default.
-Use USE_GENERIC_DEVICE_SETTINGS to enable. This option will be enabled by default on 3.x builds. Signed-off-by: David Rebbe <drebbe@intrepidcs.com>
1 parent e931b62 commit f62ca92

19 files changed

Lines changed: 947 additions & 10 deletions

include/defines.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66
#define MODULE_DESCRIPTION "Copyright Intrepid Control Systems, Inc."
77
#define VSPY3_BUILD_VERSION 802
88

9+
// Enable use of generic device settings object in 803 or newer.
10+
#if !defined(USE_GENERIC_DEVICE_SETTINGS) && (VSPY3_BUILD_VERSION >= 803)
11+
#define USE_GENERIC_DEVICE_SETTINGS
12+
#endif
13+
914
#ifdef _cplusplus
1015
extern "C" {
1116
#endif

include/methods.h

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "object_cm_iso157652_tx_message.h"
1010
#include "object_cm_iso157652_rx_message.h"
1111
#include "object_ics_device_status.h"
12+
#include "object_device_settings.h"
1213

1314
#ifdef _cplusplus
1415
extern "C" {
@@ -384,7 +385,41 @@ PyObject* meth_get_device_status(PyObject* self, PyObject* args);
384385
"\t>>> ics.set_reflash_callback(callback)\n" \
385386
"\t>>> \n"
386387

387-
// _DOC_GET_DEVICE_SETTINGS), meth_get_device_settings, METH_VARARGS, "Accepts a " MODULE_NAME "." NEO_DEVICE_OBJECT_NAME " and a " VCAN3_SETTINGS_OBJECT_NAME "/" FIRE_SETTINGS_OBJECT_NAME ", exception on error."),
388+
#if defined(USE_GENERIC_DEVICE_SETTINGS)
389+
#define _DOC_GET_DEVICE_SETTINGS \
390+
MODULE_NAME".get_device_settings(device, vnet_slot)\n" \
391+
"\n" \
392+
"Gets the settings in the device. vnet_slot defaults to "MODULE_NAME".PlasmaIonVnetChannelMain\n" \
393+
"\n" \
394+
"Args:\n" \
395+
"\tdevice (:class:`"MODULE_NAME"."NEO_DEVICE_OBJECT_NAME"`): :class:`"MODULE_NAME"."NEO_DEVICE_OBJECT_NAME"`\n\n" \
396+
"\n" \
397+
"Raises:\n" \
398+
"\t:class:`"MODULE_NAME".RuntimeError`\n" \
399+
"\n" \
400+
"Returns:\n" \
401+
"\t:class:`"MODULE_NAME"."DEVICE_SETTINGS_OBJECT_NAME"`\n" \
402+
"\n" \
403+
"\t>>> d = ics.open_device()\n" \
404+
"\t>>> d.Name\n" \
405+
"\t'neoVI ION'\n" \
406+
"\t>>> d.SerialNumber\n" \
407+
"\t404444\n" \
408+
"\t>>> s = ics.get_device_settings(d)\n" \
409+
"\t>>> s.DeviceSettingType\n" \
410+
"\t2\n" \
411+
"\t>>> s.cyan\n" \
412+
"\t<ics.CyanSettings object at 0x01E61B40>\n" \
413+
"\t>>> s.cyan.canfd1.FDMode\n" \
414+
"\t4\n" \
415+
"\t>>> s2.cyan\n" \
416+
"\t<ics.CyanSettings object at 0x02B113C8>\n" \
417+
"\t>>> s2 = ics.get_device_settings(d, ics.PlasmaIonVnetChannelA)\n" \
418+
"\t>>> s2.DeviceSettingType\n" \
419+
"\t2\n" \
420+
"\t>>> s2.cyan.canfd1.FDMode\n" \
421+
"\t4\n"
422+
#else
388423
#define _DOC_GET_DEVICE_SETTINGS \
389424
MODULE_NAME".get_device_settings(device, device_type)\n" \
390425
"\n" \
@@ -404,10 +439,40 @@ PyObject* meth_get_device_status(PyObject* self, PyObject* args);
404439
"\t>>> type(settings)\n" \
405440
"\t<class 'ics.FireSettings'>\n" \
406441
"\t>>> \n"
442+
#endif
407443

408-
//_DOC_SET_DEVICE_SETTINGS), "Accepts a " MODULE_NAME "." NEO_DEVICE_OBJECT_NAME ", " VCAN3_SETTINGS_OBJECT_NAME "/" FIRE_SETTINGS_OBJECT_NAME ", and save to eeprom bool, exception on error."),
444+
#if defined(USE_GENERIC_DEVICE_SETTINGS)
445+
#define _DOC_SET_DEVICE_SETTINGS \
446+
MODULE_NAME".set_device_settings(device, settings, save_to_eeprom, vnet_slot)\n" \
447+
"\n" \
448+
"Sets the settings in the device. vnet_slot defaults to "MODULE_NAME".PlasmaIonVnetChannelMain\n" \
449+
"\n" \
450+
"Args:\n" \
451+
"\tdevice (:class:`"MODULE_NAME"."NEO_DEVICE_OBJECT_NAME"`): :class:`"MODULE_NAME"."NEO_DEVICE_OBJECT_NAME"`\n\n" \
452+
"\tsettings (:class:`"MODULE_NAME"."DEVICE_SETTINGS_OBJECT_NAME"`): :class:`"MODULE_NAME"."DEVICE_SETTINGS_OBJECT_NAME"`\n\n" \
453+
"\n" \
454+
"Raises:\n" \
455+
"\t:class:`"MODULE_NAME".RuntimeError`\n" \
456+
"\n" \
457+
"Returns:\n" \
458+
"\tNone.\n" \
459+
"\n" \
460+
"\t>>> d = ics.open_device()\n" \
461+
"\t>>> d.Name\n" \
462+
"\t'neoVI ION'\n" \
463+
"\t>>> d.SerialNumber\n" \
464+
"\t404444\n" \
465+
"\t>>> s = ics.get_device_settings(d, ics.PlasmaIonVnetChannelA) # Get Slave settings, channel selection not needed if not a Plasma/Ion\n" \
466+
"\t>>> s.DeviceSettingType\n" \
467+
"\t2\n" \
468+
"\t>>> s.cyan.can_switch_mode\n" \
469+
"\t1\n" \
470+
"\t>>> s.cyan.can_switch_mode = 2\n" \
471+
"\t>>> ics.set_device_settings(d, s, True, ics.PlasmaIonVnetChannelA)\n" \
472+
"\t>>> \n"
473+
#else // #if defined(USE_GENERIC_DEVICE_SETTINGS)
409474
#define _DOC_SET_DEVICE_SETTINGS \
410-
MODULE_NAME".set_device_settings(device, settings)\n" \
475+
MODULE_NAME".set_device_settings(device, settings, device_type, save_to_eeprom)\n" \
411476
"\n" \
412477
"Sets the settings in the device.\n" \
413478
"\n" \
@@ -432,6 +497,7 @@ PyObject* meth_get_device_status(PyObject* self, PyObject* args);
432497
"\t>>> settings.can1.Mode = 3\n" \
433498
"\t>>> ics.set_device_settings(device, settings)\n" \
434499
"\t>>> \n"
500+
#endif
435501

436502
//"Accepts a " MODULE_NAME "." NEO_DEVICE_OBJECT_NAME ", exception on error."
437503
#define _DOC_LOAD_DEFAULT_SETTINGS \

include/object_cyan_settings.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,4 +277,8 @@ extern PyTypeObject cyan_settings_object_type;
277277

278278
bool setup_cyan_settings_object(PyObject* module);
279279

280+
void cyan_settings_object_update_from_struct(PyObject* settings);
281+
void cyan_settings_object_update_from_objects(PyObject* settings);
282+
283+
280284
#endif // _OBJECT_CYAN_SETTINGS_H_

include/object_device_settings.h

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
#ifndef _OBJECT_DEVICE_SETTINGS_H_
2+
#define _OBJECT_DEVICE_SETTINGS_H_
3+
4+
#include <Python.h>
5+
#include <structmember.h>
6+
#if (defined(_WIN32) || defined(__WIN32__))
7+
#ifndef USING_STUDIO_8
8+
#define USING_STUDIO_8 1
9+
#endif
10+
#include <icsnVC40.h>
11+
#else
12+
#include <icsnVC40.h>
13+
#endif
14+
15+
#include "defines.h"
16+
#include "object_fire_settings.h"
17+
//#include "object_fire_vnet_settings.h"
18+
#include "object_cyan_settings.h"
19+
#include "object_vcan3_settings.h"
20+
#include "object_rad_galaxy_settings.h"
21+
//#include "object_rad_star2_settings.h"
22+
//#include "object_vcan4_settings.h"
23+
#include "object_vcan412_settings.h"
24+
//#include "object_neoecu_avb_settings.h"
25+
//#include "object_rad_supermoon_settings.h"
26+
//#include "object_rad_moon2_settings.h"
27+
#include "object_vividcan_settings.h"
28+
29+
30+
31+
#define DEVICE_SETTINGS_OBJECT_NAME "DeviceSettings"
32+
33+
#if PY_MAJOR_VERSION < 3
34+
#define PyUnicode_CompareWithASCIIString(uni, string) strcmp(PyString_AsString(uni), string)
35+
#endif
36+
37+
38+
typedef struct {
39+
PyObject_HEAD
40+
PyObject* fire;
41+
PyObject* firevnet;
42+
PyObject* cyan;
43+
PyObject* vcan3;
44+
PyObject* radgalaxy;
45+
PyObject* radstar2;
46+
PyObject* vcan4;
47+
PyObject* vcan4_12;
48+
PyObject* vividcan;
49+
50+
SDeviceSettings s;
51+
} device_settings_object;
52+
53+
#if 0
54+
typedef struct _SDeviceSettings
55+
{
56+
EDeviceSettingsType DeviceSettingType;
57+
union {
58+
SFireSettings fire;
59+
SFireVnetSettings firevnet;
60+
SCyanSettings cyan;
61+
SVCAN3Settings vcan3;
62+
SRADGalaxySettings radgalaxy;
63+
SRADStar2Settings radstar2;
64+
SVCAN4Settings vcan4;
65+
VCAN412Settings vcan4_12;
66+
SVividCANSettings vividcan;
67+
//
68+
// add new settings type for each new settings structure in the union
69+
//
70+
} Settings;
71+
} SDeviceSettings;
72+
73+
#endif
74+
static PyMemberDef device_settings_object_members[] = {
75+
76+
{ "DeviceSettingType", T_ULONG, offsetof(device_settings_object, s.DeviceSettingType), 0, "" },
77+
{ "fire", T_OBJECT_EX, offsetof(device_settings_object, fire), 0, MODULE_NAME "." FIRE_SETTINGS_OBJECT_NAME" Object" },
78+
//{ "firevnet", T_OBJECT_EX, offsetof(device_settings_object, firevnet), 0, MODULE_NAME "." FIREVNET_SETTINGS_OBJECT_NAME" Object" },
79+
{ "cyan", T_OBJECT_EX, offsetof(device_settings_object, cyan), 0, MODULE_NAME "." CYAN_SETTINGS_OBJECT_NAME" Object" },
80+
{ "vcan3", T_OBJECT_EX, offsetof(device_settings_object, vcan3), 0, MODULE_NAME "." VCAN3_SETTINGS_OBJECT_NAME" Object" },
81+
{ "radgalaxy", T_OBJECT_EX, offsetof(device_settings_object, radgalaxy), 0, MODULE_NAME "." RADGALAXY_SETTINGS_OBJECT_NAME" Object" },
82+
//{ "radstar2", T_OBJECT_EX, offsetof(device_settings_object, radstar2), 0, MODULE_NAME "." RADSTAR2_SETTINGS_OBJECT_NAME" Object" },
83+
//{ "vcan4", T_OBJECT_EX, offsetof(device_settings_object, vcan4), 0, MODULE_NAME "." VCAN4_SETTINGS_OBJECT_NAME" Object" },
84+
{ "vcan4_12", T_OBJECT_EX, offsetof(device_settings_object, vcan4_12), 0, MODULE_NAME "." VCAN412_SETTINGS_OBJECT_NAME" Object" },
85+
{ "vividcan", T_OBJECT_EX, offsetof(device_settings_object, vividcan), 0, MODULE_NAME "." VIVIDCAN_SETTINGS_OBJECT_NAME" Object" },
86+
87+
{ NULL, 0, 0, 0, 0 },
88+
};
89+
90+
static int device_settings_object_init(device_settings_object* self, PyObject* args, PyObject* kwds)
91+
{
92+
// Initialize all struct values to 0
93+
memset(&(self->s), 0, sizeof(self->s));
94+
95+
self->fire = PyObject_CallObject((PyObject*)&fire_settings_object_type, NULL);
96+
//self->firevnet = PyObject_CallObject((PyObject*)&firevnet_settings_object_type, NULL);
97+
self->cyan = PyObject_CallObject((PyObject*)&cyan_settings_object_type, NULL);
98+
self->vcan3 = PyObject_CallObject((PyObject*)&vcan3_settings_object_type, NULL);
99+
self->radgalaxy = PyObject_CallObject((PyObject*)&rad_galaxy_settings_object_type, NULL);
100+
//self->radstar2 = PyObject_CallObject((PyObject*)&rad_star2_settings_object_type, NULL);
101+
//self->vcan4 = PyObject_CallObject((PyObject*)&vcan4_settings_object_type, NULL);
102+
self->vcan4_12 = PyObject_CallObject((PyObject*)&vcan412_settings_object_type, NULL);
103+
self->vividcan = PyObject_CallObject((PyObject*)&vividcan_settings_object_type, NULL);
104+
105+
return 0;
106+
}
107+
108+
109+
110+
extern PyTypeObject device_settings_object_type;
111+
112+
113+
// Copied from tupleobject.h
114+
#define PyDeviceSettings_Check(op) \
115+
PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_BASETYPE)
116+
#define PyDeviceSettings_CheckExact(op) (Py_TYPE(op) == &device_settings_object_type)
117+
118+
bool setup_device_settings_object(PyObject* module);
119+
120+
void device_settings_object_update_from_struct(PyObject* settings);
121+
void device_settings_object_update_from_objects(PyObject* settings);
122+
123+
#endif // _OBJECT_DEVICE_SETTINGS_H_

include/object_fire_settings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,7 @@ extern PyTypeObject fire_settings_object_type;
149149

150150
bool setup_fire_settings_object(PyObject* module);
151151

152+
void fire_settings_object_update_from_struct(PyObject* settings);
153+
void fire_settings_object_update_from_objects(PyObject* settings);
154+
152155
#endif // _OBJECT_FIRE_SETTINGS_H_

include/object_rad_galaxy_settings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,4 +196,7 @@ extern PyTypeObject rad_galaxy_settings_object_type;
196196

197197
bool setup_rad_galaxy_settings_object(PyObject* module);
198198

199+
void rad_galaxy_settings_object_update_from_struct(PyObject* settings);
200+
void rad_galaxy_settings_object_update_from_objects(PyObject* settings);
201+
199202
#endif // _OBJECT_RADGALAXY_SETTINGS_H_

include/object_vcan3_settings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,7 @@ extern PyTypeObject vcan3_settings_object_type;
6060

6161
bool setup_vcan3_settings_object(PyObject* module);
6262

63+
void vcan3_settings_object_update_from_struct(PyObject* settings);
64+
void vcan3_settings_object_update_from_objects(PyObject* settings);
65+
6366
#endif // _OBJECT_VCAN3_SETTINGS_H_

include/object_vcan412_settings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,4 +189,7 @@ extern PyTypeObject vcan412_settings_object_type;
189189

190190
bool setup_vcan412_settings_object(PyObject* module);
191191

192+
void vcan412_settings_object_update_from_struct(PyObject* settings);
193+
void vcan412_settings_object_update_from_objects(PyObject* settings);
194+
192195
#endif // _OBJECT_VCAN412_SETTINGS_H_

include/object_vividcan_settings.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "object_can_settings.h"
1717
#include "object_canfd_settings.h"
1818
#include "object_textapi_settings.h"
19+
#include "object_swcan_settings.h"
1920

2021
#define VIVIDCAN_SETTINGS_OBJECT_NAME "VividCANSettings"
2122

@@ -179,4 +180,8 @@ extern PyTypeObject vividcan_settings_object_type;
179180

180181
bool setup_vividcan_settings_object(PyObject* module);
181182

183+
void vividcan_settings_object_update_from_struct(PyObject* settings);
184+
void vividcan_settings_object_update_from_objects(PyObject* settings);
185+
186+
182187
#endif // _OBJECT_VIVIDCAN_SETTINGS_H_

msvc/python_ics.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@
160160
<ClInclude Include="..\include\object_cm_iso157652_rx_message.h" />
161161
<ClInclude Include="..\include\object_cm_iso157652_tx_message.h" />
162162
<ClInclude Include="..\include\object_cyan_settings.h" />
163+
<ClInclude Include="..\include\object_device_settings.h" />
163164
<ClInclude Include="..\include\object_ethernet_settings.h" />
164165
<ClInclude Include="..\include\object_fire2_device_status.h" />
165166
<ClInclude Include="..\include\object_fire_settings.h" />
@@ -195,6 +196,7 @@
195196
<ClCompile Include="..\src\object_cm_iso157652_rx_message.cpp" />
196197
<ClCompile Include="..\src\object_cm_iso157652_tx_message.cpp" />
197198
<ClCompile Include="..\src\object_cyan_settings.cpp" />
199+
<ClCompile Include="..\src\object_device_settings.cpp" />
198200
<ClCompile Include="..\src\object_ethernet_settings.cpp" />
199201
<ClCompile Include="..\src\object_fire2_device_status.cpp" />
200202
<ClCompile Include="..\src\object_fire_settings.cpp" />

0 commit comments

Comments
 (0)