Skip to content

Commit 717b5a1

Browse files
committed
BEDGE-3545 Update settings, Support float and signed integer ranges for simulation
1 parent eecc8a4 commit 717b5a1

File tree

3 files changed

+75
-40
lines changed

3 files changed

+75
-40
lines changed

modbus_simulator/ui/datamodel.py

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from random import randint
1+
from random import randint, uniform
22
from copy import deepcopy
33
from kivy.adapters.dictadapter import DictAdapter
44
from kivy.event import EventDispatcher
@@ -50,7 +50,7 @@ def deselect_from_composite(self, *args):
5050
pass
5151

5252
def on_formatter_select(self, instance, value):
53-
self.data_model.on_formatter_update(self.index, value)
53+
self.data_model.on_formatter_update(self.index, self.text, value)
5454
self.text = value
5555

5656

@@ -145,9 +145,9 @@ def deselect_from_composite(self, *args):
145145
def on_text_validate(self, *args):
146146

147147
try:
148-
int(self.text)
148+
float(self.text)
149149

150-
if not(self.minval <= int(self.text) <= self.maxval):
150+
if not(self.minval <= float(self.text) <= self.maxval):
151151
raise ValueError
152152
self.edit = False
153153
self.data_model.on_data_update(self.index, self.text)
@@ -184,7 +184,9 @@ def on_update(self, _parent, blockname, data):
184184
if event == 'sync_data':
185185
_parent.sync_data_callback(blockname, data.get('data', {}))
186186
else:
187-
_parent.sync_formatter_callback(blockname, data.get('data', {}))
187+
old_formatter = data.pop("old_formatter", None)
188+
_parent.sync_formatter_callback(blockname, data.get('data', {}),
189+
old_formatter)
188190

189191

190192
class DataModel(GridLayout):
@@ -408,7 +410,7 @@ def on_data_update(self, index, data):
408410
:param data:
409411
:return:
410412
"""
411-
index = self.get_address(int(index))
413+
index = self.get_address(self.list_view.adapter.sorted_keys[index])
412414
try:
413415
self.list_view.adapter.data[index]
414416
except KeyError:
@@ -425,7 +427,7 @@ def on_data_update(self, index, data):
425427
self.blockname,
426428
data)
427429

428-
def on_formatter_update(self, index, data):
430+
def on_formatter_update(self, index, old, new):
429431
"""
430432
Callback function to use the formatter selected in the list view
431433
Args:
@@ -435,13 +437,15 @@ def on_formatter_update(self, index, data):
435437
Returns:
436438
437439
"""
438-
index = self.get_address(int(index))
440+
index = self.get_address(self.list_view.adapter.sorted_keys[index])
441+
# index = self.get_address(int(index))
439442
try:
440-
self.list_view.adapter.data[index]['formatter'] = data
443+
self.list_view.adapter.data[index]['formatter'] = new
441444
except KeyError:
442445
index = str(index)
443-
self.list_view.adapter.data[index]['formatter'] = data
446+
self.list_view.adapter.data[index]['formatter'] = new
444447
_data = {'event': 'sync_formatter',
448+
'old_formatter': old,
445449
'data': {index: self.list_view.adapter.data[index]}}
446450
self.dispatcher.dispatch('on_update', self._parent,
447451
self.blockname, _data)
@@ -458,7 +462,7 @@ def update_registers(self, new_values, update_info):
458462

459463
self.list_view.adapter.update_for_new_data()
460464
self.refresh(new_values, to_remove)
461-
pass
465+
return self.list_view.adapter.data
462466

463467
def refresh(self, data={}, to_remove=None):
464468
"""
@@ -506,7 +510,17 @@ def _simulate_block_values(self):
506510
data = self.list_view.adapter.data
507511
if data:
508512
for index, value in data.items():
509-
value = randint(self.minval, self.maxval)
513+
if self.blockname in ['input_registers',
514+
'holding_registers']:
515+
if 'float' in data[index]['formatter']:
516+
value = round(uniform(self.minval, self.maxval), 2)
517+
else:
518+
value = randint(self.minval, self.maxval)
519+
if 'uint' in data[index]['formatter']:
520+
value = abs(value)
521+
else:
522+
value = randint(self.minval, self.maxval)
523+
510524
data[index]['value'] = value
511525
self.refresh(data)
512526
data = {'event': 'sync_data',

modbus_simulator/ui/gui.py

Lines changed: 47 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1-
'''
1+
"""'
22
Modbus Simu App
33
===============
4-
'''
4+
"""
55
import kivy
6-
kivy.require('1.4.2')
6+
import re
7+
import os
8+
import platform
9+
import six
10+
import struct
11+
from copy import deepcopy
712
from kivy.app import App
813
from kivy.properties import ObjectProperty
914
from kivy.uix.boxlayout import BoxLayout
@@ -12,23 +17,23 @@
1217
from kivy.uix.settings import SettingsWithSidebar
1318
from kivy.uix.listview import ListView, ListItemButton
1419
from kivy.adapters.listadapter import ListAdapter
20+
from kivy.config import Config
21+
from kivy.lang import Builder
22+
1523
from modbus_simulator.utils.constants import BLOCK_TYPES
1624
from modbus_simulator.utils.common import configure_modbus_logger
1725
from modbus_simulator.ui.settings import SettingIntegerWithRange
1826
from modbus_simulator.utils.backgroundJob import BackgroundJob
19-
import re
20-
import os
21-
import platform
22-
import six
2327
from json import load, dump
24-
from kivy.config import Config
25-
from kivy.lang import Builder
28+
2629
import modbus_simulator.ui.datamodel #noqa
2730
from pkg_resources import resource_filename
2831
from serial.serialutil import SerialException
2932

3033
from distutils.version import LooseVersion
3134

35+
kivy.require('1.4.2')
36+
3237
if six.PY3:
3338
xrange = range
3439

@@ -574,16 +579,19 @@ def sync_data_callback(self, blockname, data):
574579
int(self.active_slave),
575580
current_tab,
576581
k,
577-
int(v['value']),
582+
float(v['value']),
578583
v['formatter']
579584
)
580585
else:
581586
self.modbus_device.set_values(int(self.active_slave),
582-
current_tab, k, int(v['value']))
587+
current_tab,
588+
k, int(v['value']))
583589
except KeyError:
584590
pass
591+
except struct.error:
592+
self.show_error("Invalid value supplied , Check the formatter!")
585593

586-
def sync_formatter_callback(self, blockname, data):
594+
def sync_formatter_callback(self, blockname, data, old_formatter):
587595
ct = self.data_models.current_tab
588596
current_tab = MAP[ct.text]
589597
if blockname != current_tab:
@@ -592,20 +600,24 @@ def sync_formatter_callback(self, blockname, data):
592600
_data = self.data_map[self.active_slave][current_tab]
593601
_updated = {}
594602
for k, v in data.items():
603+
old_wc = int(filter(str.isdigit, str(old_formatter)))/16
604+
new_wc = int(filter(str.isdigit, v.get('formatter')))/16
595605
new_val, count = self.modbus_device.decode(
596606
int(self.active_slave), current_tab, k, v['formatter']
597607
)
598608
data[k]['value'] = new_val
599609
_updated['offset'] = k
600610
_updated['count'] = count
601-
if count == 1:
611+
if old_wc > new_wc:
602612
missing = self.modbus_device.get_values(
603-
int(self.active_slave), current_tab, k, 4)
613+
int(self.active_slave), current_tab, k, old_wc-new_val)
604614
for i, val in enumerate(missing):
605615
o = int(k) + i
606616
data[o] = {'value': val, 'formatter': 'uint16'}
607617
_data['data'].update(data)
608-
ct.content.update_registers(_data['data'], _updated)
618+
_data['data'] = dict(ct.content.update_registers(_data['data'],
619+
_updated)
620+
)
609621

610622
except KeyError:
611623
pass
@@ -664,7 +676,7 @@ def update_backend(self, slave_id, blockname, new_data):
664676
slave_id,
665677
blockname,
666678
k,
667-
int(v['value']),
679+
float(v['value']),
668680
v['formatter']
669681
)
670682
else:
@@ -679,9 +691,9 @@ def change_simulation_settings(self, **kwargs):
679691

680692
def change_datamodel_settings(self, key, value):
681693
if "max" in key:
682-
data = {"maxval": int(value)}
694+
data = {"maxval": float(value)}
683695
else:
684-
data = {"minval": int(value)}
696+
data = {"minval": float(value)}
685697

686698
if "bin" in key:
687699
self.data_model_coil.reinit(**data)
@@ -727,15 +739,24 @@ def _sync_modbus_block_values(self):
727739
for block_name, value in _data_map.items():
728740
updated = {}
729741
for k, v in value['data'].items():
730-
actual_data = self.modbus_device.get_values(
731-
int(self.active_slave),
732-
block_name,
733-
int(k),
734-
735-
)
742+
if block_name in ['input_registers',
743+
'holding_registers']:
744+
actual_data, count = self.modbus_device.decode(
745+
int(self.active_slave), block_name, k,
746+
v['formatter']
747+
)
748+
else:
749+
actual_data = self.modbus_device.get_values(
750+
int(self.active_slave),
751+
block_name,
752+
int(k),
753+
754+
)
755+
actual_data = actual_data[0]
736756
try:
737-
if actual_data[0] != int(v):
738-
updated[k] = actual_data[0]
757+
if actual_data != float(v['value']):
758+
v['value'] = actual_data
759+
updated[k] = v
739760
except TypeError:
740761
pass
741762
if updated:

modbus_simulator/ui/settings.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,12 @@ def _validate(self, instance):
8282
self._dismiss()
8383
try:
8484
value = self.textinput.text.strip()
85-
value = text_type(int(value))
85+
value = text_type(float(value))
8686
except ValueError:
8787
self.textinput.text = self.value
8888
return
8989
if not self._override:
90-
if self.minval <= int(value) <= self.maxval:
90+
if self.minval <= float(value) <= self.maxval:
9191
self.value = value
9292
else:
9393
self.value = str(self.default[self.default_key])

0 commit comments

Comments
 (0)