SecsGemPro 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- secsgempro-1.0.0/PKG-INFO +14 -0
- secsgempro-1.0.0/README.md +1 -0
- secsgempro-1.0.0/pyproject.toml +22 -0
- secsgempro-1.0.0/secsgem/__init__.py +1 -0
- secsgempro-1.0.0/secsgem/common/__init__.py +35 -0
- secsgempro-1.0.0/secsgem/common/block_send_info.py +50 -0
- secsgempro-1.0.0/secsgem/common/byte_queue.py +124 -0
- secsgempro-1.0.0/secsgem/common/callbacks.py +117 -0
- secsgempro-1.0.0/secsgem/common/codec_jis_x_0201.py +32 -0
- secsgempro-1.0.0/secsgem/common/connection.py +106 -0
- secsgempro-1.0.0/secsgem/common/events.py +196 -0
- secsgempro-1.0.0/secsgem/common/header.py +114 -0
- secsgempro-1.0.0/secsgem/common/helpers.py +97 -0
- secsgempro-1.0.0/secsgem/common/message.py +188 -0
- secsgempro-1.0.0/secsgem/common/protocol.py +318 -0
- secsgempro-1.0.0/secsgem/common/protocol_dispatcher.py +124 -0
- secsgempro-1.0.0/secsgem/common/settings.py +121 -0
- secsgempro-1.0.0/secsgem/common/state_machine.py +228 -0
- secsgempro-1.0.0/secsgem/common/tcp_client_connection.py +164 -0
- secsgempro-1.0.0/secsgem/common/tcp_connection.py +196 -0
- secsgempro-1.0.0/secsgem/common/tcp_server_connection.py +146 -0
- secsgempro-1.0.0/secsgem/common/timeouts.py +101 -0
- secsgempro-1.0.0/secsgem/example.py +31 -0
- secsgempro-1.0.0/secsgem/gem/__init__.py +20 -0
- secsgempro-1.0.0/secsgem/gem/alarm.py +51 -0
- secsgempro-1.0.0/secsgem/gem/alarm_capability.py +185 -0
- secsgempro-1.0.0/secsgem/gem/capability.py +90 -0
- secsgempro-1.0.0/secsgem/gem/clock_capability.py +43 -0
- secsgempro-1.0.0/secsgem/gem/collection_event.py +55 -0
- secsgempro-1.0.0/secsgem/gem/collection_event_capability.py +327 -0
- secsgempro-1.0.0/secsgem/gem/collection_event_link.py +46 -0
- secsgempro-1.0.0/secsgem/gem/collection_event_report.py +35 -0
- secsgempro-1.0.0/secsgem/gem/communication_state_machine.py +194 -0
- secsgempro-1.0.0/secsgem/gem/control_state_machine.py +208 -0
- secsgempro-1.0.0/secsgem/gem/data_value.py +73 -0
- secsgempro-1.0.0/secsgem/gem/data_value_capability.py +77 -0
- secsgempro-1.0.0/secsgem/gem/equipment_constant.py +71 -0
- secsgempro-1.0.0/secsgem/gem/equipment_constants_capability.py +220 -0
- secsgempro-1.0.0/secsgem/gem/equipmenthandler.py +75 -0
- secsgempro-1.0.0/secsgem/gem/handler.py +275 -0
- secsgempro-1.0.0/secsgem/gem/hosthandler.py +249 -0
- secsgempro-1.0.0/secsgem/gem/remote_command.py +57 -0
- secsgempro-1.0.0/secsgem/gem/remote_control_capability.py +112 -0
- secsgempro-1.0.0/secsgem/gem/state_models_capability.py +158 -0
- secsgempro-1.0.0/secsgem/gem/status_data_collection_capability.py +168 -0
- secsgempro-1.0.0/secsgem/gem/status_variable.py +64 -0
- secsgempro-1.0.0/secsgem/hsms/__init__.py +26 -0
- secsgempro-1.0.0/secsgem/hsms/connection_state_machine.py +81 -0
- secsgempro-1.0.0/secsgem/hsms/deselect_req_header.py +26 -0
- secsgempro-1.0.0/secsgem/hsms/deselect_rsp_header.py +26 -0
- secsgempro-1.0.0/secsgem/hsms/header.py +184 -0
- secsgempro-1.0.0/secsgem/hsms/linktest_req_header.py +26 -0
- secsgempro-1.0.0/secsgem/hsms/linktest_rsp_header.py +26 -0
- secsgempro-1.0.0/secsgem/hsms/message.py +39 -0
- secsgempro-1.0.0/secsgem/hsms/protocol.py +494 -0
- secsgempro-1.0.0/secsgem/hsms/reject_req_header.py +29 -0
- secsgempro-1.0.0/secsgem/hsms/select_req_header.py +25 -0
- secsgempro-1.0.0/secsgem/hsms/select_rsp_header.py +25 -0
- secsgempro-1.0.0/secsgem/hsms/separate_req_header.py +25 -0
- secsgempro-1.0.0/secsgem/hsms/settings.py +138 -0
- secsgempro-1.0.0/secsgem/hsms/stream_function_header.py +35 -0
- secsgempro-1.0.0/secsgem/secs/__init__.py +7 -0
- secsgempro-1.0.0/secsgem/secs/data_items/__init__.py +273 -0
- secsgempro-1.0.0/secsgem/secs/data_items/abs.py +17 -0
- secsgempro-1.0.0/secsgem/secs/data_items/acka.py +29 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ackc10.py +36 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ackc5.py +31 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ackc6.py +31 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ackc7.py +48 -0
- secsgempro-1.0.0/secsgem/secs/data_items/alcd.py +57 -0
- secsgempro-1.0.0/secsgem/secs/data_items/aled.py +34 -0
- secsgempro-1.0.0/secsgem/secs/data_items/alid.py +39 -0
- secsgempro-1.0.0/secsgem/secs/data_items/altx.py +20 -0
- secsgempro-1.0.0/secsgem/secs/data_items/attrdata.py +49 -0
- secsgempro-1.0.0/secsgem/secs/data_items/attrid.py +31 -0
- secsgempro-1.0.0/secsgem/secs/data_items/attrreln.py +48 -0
- secsgempro-1.0.0/secsgem/secs/data_items/base.py +67 -0
- secsgempro-1.0.0/secsgem/secs/data_items/bcequ.py +23 -0
- secsgempro-1.0.0/secsgem/secs/data_items/binlt.py +27 -0
- secsgempro-1.0.0/secsgem/secs/data_items/caack.py +23 -0
- secsgempro-1.0.0/secsgem/secs/data_items/carrieraction.py +27 -0
- secsgempro-1.0.0/secsgem/secs/data_items/carrierid.py +27 -0
- secsgempro-1.0.0/secsgem/secs/data_items/cattrdata.py +36 -0
- secsgempro-1.0.0/secsgem/secs/data_items/cattrid.py +36 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ccode.py +35 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ceed.py +27 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ceid.py +43 -0
- secsgempro-1.0.0/secsgem/secs/data_items/cename.py +16 -0
- secsgempro-1.0.0/secsgem/secs/data_items/cepack.py +36 -0
- secsgempro-1.0.0/secsgem/secs/data_items/cepval.py +46 -0
- secsgempro-1.0.0/secsgem/secs/data_items/cmda.py +39 -0
- secsgempro-1.0.0/secsgem/secs/data_items/colct.py +27 -0
- secsgempro-1.0.0/secsgem/secs/data_items/commack.py +32 -0
- secsgempro-1.0.0/secsgem/secs/data_items/cpack.py +36 -0
- secsgempro-1.0.0/secsgem/secs/data_items/cpname.py +39 -0
- secsgempro-1.0.0/secsgem/secs/data_items/cpval.py +41 -0
- secsgempro-1.0.0/secsgem/secs/data_items/dataid.py +44 -0
- secsgempro-1.0.0/secsgem/secs/data_items/datalength.py +34 -0
- secsgempro-1.0.0/secsgem/secs/data_items/datlc.py +16 -0
- secsgempro-1.0.0/secsgem/secs/data_items/drack.py +41 -0
- secsgempro-1.0.0/secsgem/secs/data_items/dsid.py +36 -0
- secsgempro-1.0.0/secsgem/secs/data_items/dsper.py +16 -0
- secsgempro-1.0.0/secsgem/secs/data_items/dutms.py +17 -0
- secsgempro-1.0.0/secsgem/secs/data_items/dvname.py +36 -0
- secsgempro-1.0.0/secsgem/secs/data_items/dvval.py +46 -0
- secsgempro-1.0.0/secsgem/secs/data_items/dvvalname.py +16 -0
- secsgempro-1.0.0/secsgem/secs/data_items/eac.py +38 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ecdef.py +44 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ecid.py +39 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ecmax.py +44 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ecmin.py +44 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ecname.py +16 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ecv.py +47 -0
- secsgempro-1.0.0/secsgem/secs/data_items/edid.py +38 -0
- secsgempro-1.0.0/secsgem/secs/data_items/erack.py +32 -0
- secsgempro-1.0.0/secsgem/secs/data_items/errcode.py +180 -0
- secsgempro-1.0.0/secsgem/secs/data_items/errtext.py +23 -0
- secsgempro-1.0.0/secsgem/secs/data_items/exid.py +24 -0
- secsgempro-1.0.0/secsgem/secs/data_items/exmessage.py +17 -0
- secsgempro-1.0.0/secsgem/secs/data_items/exrecvra.py +19 -0
- secsgempro-1.0.0/secsgem/secs/data_items/extype.py +17 -0
- secsgempro-1.0.0/secsgem/secs/data_items/fcnid.py +19 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ffrot.py +19 -0
- secsgempro-1.0.0/secsgem/secs/data_items/fnloc.py +20 -0
- secsgempro-1.0.0/secsgem/secs/data_items/grant6.py +35 -0
- secsgempro-1.0.0/secsgem/secs/data_items/grnt1.py +47 -0
- secsgempro-1.0.0/secsgem/secs/data_items/hcack.py +48 -0
- secsgempro-1.0.0/secsgem/secs/data_items/idtyp.py +47 -0
- secsgempro-1.0.0/secsgem/secs/data_items/length.py +34 -0
- secsgempro-1.0.0/secsgem/secs/data_items/limitack.py +50 -0
- secsgempro-1.0.0/secsgem/secs/data_items/limitid.py +20 -0
- secsgempro-1.0.0/secsgem/secs/data_items/limitmax.py +44 -0
- secsgempro-1.0.0/secsgem/secs/data_items/limitmin.py +44 -0
- secsgempro-1.0.0/secsgem/secs/data_items/lowerdb.py +45 -0
- secsgempro-1.0.0/secsgem/secs/data_items/lrack.py +44 -0
- secsgempro-1.0.0/secsgem/secs/data_items/lvack.py +41 -0
- secsgempro-1.0.0/secsgem/secs/data_items/maper.py +35 -0
- secsgempro-1.0.0/secsgem/secs/data_items/mapft.py +36 -0
- secsgempro-1.0.0/secsgem/secs/data_items/mdack.py +40 -0
- secsgempro-1.0.0/secsgem/secs/data_items/mdln.py +20 -0
- secsgempro-1.0.0/secsgem/secs/data_items/mexp.py +18 -0
- secsgempro-1.0.0/secsgem/secs/data_items/mhead.py +22 -0
- secsgempro-1.0.0/secsgem/secs/data_items/mid.py +36 -0
- secsgempro-1.0.0/secsgem/secs/data_items/mlcl.py +27 -0
- secsgempro-1.0.0/secsgem/secs/data_items/nulbc.py +24 -0
- secsgempro-1.0.0/secsgem/secs/data_items/objack.py +33 -0
- secsgempro-1.0.0/secsgem/secs/data_items/objid.py +31 -0
- secsgempro-1.0.0/secsgem/secs/data_items/objspec.py +18 -0
- secsgempro-1.0.0/secsgem/secs/data_items/objtype.py +29 -0
- secsgempro-1.0.0/secsgem/secs/data_items/oflack.py +29 -0
- secsgempro-1.0.0/secsgem/secs/data_items/onlack.py +35 -0
- secsgempro-1.0.0/secsgem/secs/data_items/orloc.py +43 -0
- secsgempro-1.0.0/secsgem/secs/data_items/pparm.py +45 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ppbody.py +39 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ppgnt.py +44 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ppid.py +30 -0
- secsgempro-1.0.0/secsgem/secs/data_items/praxi.py +51 -0
- secsgempro-1.0.0/secsgem/secs/data_items/prdct.py +27 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ptn.py +27 -0
- secsgempro-1.0.0/secsgem/secs/data_items/rcmd.py +26 -0
- secsgempro-1.0.0/secsgem/secs/data_items/refp.py +27 -0
- secsgempro-1.0.0/secsgem/secs/data_items/repgsz.py +36 -0
- secsgempro-1.0.0/secsgem/secs/data_items/rowct.py +27 -0
- secsgempro-1.0.0/secsgem/secs/data_items/rpsel.py +17 -0
- secsgempro-1.0.0/secsgem/secs/data_items/rptid.py +41 -0
- secsgempro-1.0.0/secsgem/secs/data_items/rsda.py +35 -0
- secsgempro-1.0.0/secsgem/secs/data_items/rsdc.py +32 -0
- secsgempro-1.0.0/secsgem/secs/data_items/rsinf.py +29 -0
- secsgempro-1.0.0/secsgem/secs/data_items/rspack.py +32 -0
- secsgempro-1.0.0/secsgem/secs/data_items/sdack.py +29 -0
- secsgempro-1.0.0/secsgem/secs/data_items/sdbin.py +32 -0
- secsgempro-1.0.0/secsgem/secs/data_items/shead.py +18 -0
- secsgempro-1.0.0/secsgem/secs/data_items/smpln.py +34 -0
- secsgempro-1.0.0/secsgem/secs/data_items/softrev.py +15 -0
- secsgempro-1.0.0/secsgem/secs/data_items/stime.py +16 -0
- secsgempro-1.0.0/secsgem/secs/data_items/strack.py +36 -0
- secsgempro-1.0.0/secsgem/secs/data_items/strid.py +19 -0
- secsgempro-1.0.0/secsgem/secs/data_items/strp.py +29 -0
- secsgempro-1.0.0/secsgem/secs/data_items/sv.py +47 -0
- secsgempro-1.0.0/secsgem/secs/data_items/svid.py +39 -0
- secsgempro-1.0.0/secsgem/secs/data_items/svname.py +16 -0
- secsgempro-1.0.0/secsgem/secs/data_items/text.py +39 -0
- secsgempro-1.0.0/secsgem/secs/data_items/tiaack.py +44 -0
- secsgempro-1.0.0/secsgem/secs/data_items/tiack.py +30 -0
- secsgempro-1.0.0/secsgem/secs/data_items/tid.py +19 -0
- secsgempro-1.0.0/secsgem/secs/data_items/time.py +18 -0
- secsgempro-1.0.0/secsgem/secs/data_items/timestamp.py +20 -0
- secsgempro-1.0.0/secsgem/secs/data_items/totsmp.py +36 -0
- secsgempro-1.0.0/secsgem/secs/data_items/trid.py +37 -0
- secsgempro-1.0.0/secsgem/secs/data_items/units.py +19 -0
- secsgempro-1.0.0/secsgem/secs/data_items/upperdb.py +45 -0
- secsgempro-1.0.0/secsgem/secs/data_items/v.py +49 -0
- secsgempro-1.0.0/secsgem/secs/data_items/vid.py +44 -0
- secsgempro-1.0.0/secsgem/secs/data_items/vlaack.py +35 -0
- secsgempro-1.0.0/secsgem/secs/data_items/xdies.py +31 -0
- secsgempro-1.0.0/secsgem/secs/data_items/xypos.py +29 -0
- secsgempro-1.0.0/secsgem/secs/data_items/ydies.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/__init__.py +293 -0
- secsgempro-1.0.0/secsgem/secs/functions/_all.py +288 -0
- secsgempro-1.0.0/secsgem/secs/functions/base.py +200 -0
- secsgempro-1.0.0/secsgem/secs/functions/s00f00.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f00.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f01.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f02.py +62 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f03.py +46 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f04.py +46 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f11.py +47 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f12.py +66 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f13.py +62 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f14.py +79 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f15.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f16.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f17.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f18.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f21.py +45 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f22.py +60 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f23.py +45 -0
- secsgempro-1.0.0/secsgem/secs/functions/s01f24.py +66 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f00.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f13.py +47 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f14.py +45 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f15.py +62 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f16.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f17.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f18.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f21.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f22.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f23.py +72 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f24.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f25.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f26.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f29.py +47 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f30.py +92 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f31.py +17 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f32.py +17 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f33.py +80 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f34.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f35.py +72 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f36.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f37.py +54 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f38.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f41.py +72 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f42.py +75 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f43.py +69 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f44.py +86 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f45.py +101 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f46.py +89 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f47.py +45 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f48.py +106 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f49.py +82 -0
- secsgempro-1.0.0/secsgem/secs/functions/s02f50.py +75 -0
- secsgempro-1.0.0/secsgem/secs/functions/s03f17.py +34 -0
- secsgempro-1.0.0/secsgem/secs/functions/s03f18.py +30 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f00.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f01.py +57 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f02.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f03.py +49 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f04.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f05.py +45 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f06.py +64 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f07.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f08.py +64 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f09.py +72 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f10.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f11.py +61 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f12.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f13.py +49 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f14.py +73 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f15.py +81 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f16.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f17.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s05f18.py +75 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f00.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f01.py +67 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f02.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f05.py +49 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f06.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f07.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f08.py +100 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f11.py +82 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f12.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f15.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f16.py +82 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f19.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f20.py +45 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f21.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f22.py +60 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f23.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s06f24.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f00.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f01.py +49 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f02.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f03.py +49 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f04.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f05.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f06.py +49 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f17.py +45 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f18.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f19.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f20.py +45 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f23.py +32 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f24.py +21 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f25.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s07f26.py +36 -0
- secsgempro-1.0.0/secsgem/secs/functions/s09f00.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s09f01.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s09f03.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s09f05.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s09f07.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s09f09.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s09f11.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s09f13.py +49 -0
- secsgempro-1.0.0/secsgem/secs/functions/s10f00.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s10f01.py +49 -0
- secsgempro-1.0.0/secsgem/secs/functions/s10f02.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s10f03.py +49 -0
- secsgempro-1.0.0/secsgem/secs/functions/s10f04.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f00.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f01.py +138 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f02.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f03.py +86 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f04.py +138 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f05.py +61 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f06.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f07.py +79 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f08.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f09.py +61 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f10.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f11.py +79 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f12.py +39 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f13.py +49 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f14.py +79 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f15.py +49 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f16.py +61 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f17.py +56 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f18.py +79 -0
- secsgempro-1.0.0/secsgem/secs/functions/s12f19.py +49 -0
- secsgempro-1.0.0/secsgem/secs/functions/s14f00.py +31 -0
- secsgempro-1.0.0/secsgem/secs/functions/s14f01.py +95 -0
- secsgempro-1.0.0/secsgem/secs/functions/s14f02.py +133 -0
- secsgempro-1.0.0/secsgem/secs/functions/s14f03.py +86 -0
- secsgempro-1.0.0/secsgem/secs/functions/s14f04.py +133 -0
- secsgempro-1.0.0/secsgem/secs/functions/streams_functions.py +81 -0
- secsgempro-1.0.0/secsgem/secs/handler.py +302 -0
- secsgempro-1.0.0/secsgem/secs/variables/__init__.py +41 -0
- secsgempro-1.0.0/secsgem/secs/variables/array.py +196 -0
- secsgempro-1.0.0/secsgem/secs/variables/base.py +100 -0
- secsgempro-1.0.0/secsgem/secs/variables/base_number.py +214 -0
- secsgempro-1.0.0/secsgem/secs/variables/base_text.py +204 -0
- secsgempro-1.0.0/secsgem/secs/variables/binary.py +207 -0
- secsgempro-1.0.0/secsgem/secs/variables/boolean.py +209 -0
- secsgempro-1.0.0/secsgem/secs/variables/dynamic.py +253 -0
- secsgempro-1.0.0/secsgem/secs/variables/f4.py +22 -0
- secsgempro-1.0.0/secsgem/secs/variables/f8.py +22 -0
- secsgempro-1.0.0/secsgem/secs/variables/functions.py +57 -0
- secsgempro-1.0.0/secsgem/secs/variables/i1.py +22 -0
- secsgempro-1.0.0/secsgem/secs/variables/i2.py +22 -0
- secsgempro-1.0.0/secsgem/secs/variables/i4.py +22 -0
- secsgempro-1.0.0/secsgem/secs/variables/i8.py +22 -0
- secsgempro-1.0.0/secsgem/secs/variables/jis8.py +23 -0
- secsgempro-1.0.0/secsgem/secs/variables/list_type.py +249 -0
- secsgempro-1.0.0/secsgem/secs/variables/string.py +21 -0
- secsgempro-1.0.0/secsgem/secs/variables/u1.py +22 -0
- secsgempro-1.0.0/secsgem/secs/variables/u2.py +22 -0
- secsgempro-1.0.0/secsgem/secs/variables/u4.py +22 -0
- secsgempro-1.0.0/secsgem/secs/variables/u8.py +22 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: SecsGemPro
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: secs/gem
|
|
5
|
+
Author: LiuWei
|
|
6
|
+
Author-email: 183074632@qq.com
|
|
7
|
+
Requires-Python: >=3.11,<3.13
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
11
|
+
Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
|
|
14
|
+
### secsgem
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
### secsgem
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
[tool.poetry]
|
|
2
|
+
name = "SecsGemPro"
|
|
3
|
+
version = "1.0.0"
|
|
4
|
+
description = "secs/gem"
|
|
5
|
+
authors = ["LiuWei <183074632@qq.com>"]
|
|
6
|
+
readme = "README.md"
|
|
7
|
+
packages = [{include = "secsgem"},]
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
[tool.poetry.dependencies]
|
|
11
|
+
python = ">=3.11,<3.13"
|
|
12
|
+
python-dateutil = ">=2.9.0.post0,<3.0.0"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
[[tool.poetry.source]]
|
|
16
|
+
name = "mirrors"
|
|
17
|
+
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
|
|
18
|
+
priority = "primary"
|
|
19
|
+
|
|
20
|
+
[build-system]
|
|
21
|
+
requires = ["poetry-core"]
|
|
22
|
+
build-backend = "poetry.core.masonry.api"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""module imports."""
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Contains helper functions."""
|
|
2
|
+
|
|
3
|
+
from .block_send_info import BlockSendInfo
|
|
4
|
+
from .byte_queue import ByteQueue
|
|
5
|
+
from .callbacks import CallbackHandler
|
|
6
|
+
from .connection import Connection
|
|
7
|
+
from .events import EventProducer
|
|
8
|
+
from .header import Header
|
|
9
|
+
from .helpers import format_hex, function_name, indent_block, is_errorcode_ewouldblock, is_windows
|
|
10
|
+
from .message import Block, Message
|
|
11
|
+
from .protocol import Protocol
|
|
12
|
+
from .protocol_dispatcher import ProtocolDispatcher
|
|
13
|
+
from .settings import DeviceType, Settings
|
|
14
|
+
from .state_machine import State, StateMachine, Transition, UnknownTransitionError, WrongSourceStateError
|
|
15
|
+
from .tcp_client_connection import TcpClientConnection
|
|
16
|
+
from .tcp_server_connection import TcpServerConnection
|
|
17
|
+
from .timeouts import Timeouts
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"BlockSendInfo",
|
|
21
|
+
"ByteQueue",
|
|
22
|
+
"CallbackHandler",
|
|
23
|
+
"Connection",
|
|
24
|
+
"EventProducer",
|
|
25
|
+
"Header",
|
|
26
|
+
"format_hex", "function_name", "indent_block", "is_windows", "is_errorcode_ewouldblock",
|
|
27
|
+
"Message", "Block",
|
|
28
|
+
"Protocol",
|
|
29
|
+
"ProtocolDispatcher",
|
|
30
|
+
"Settings", "DeviceType",
|
|
31
|
+
"State", "StateMachine", "Transition", "UnknownTransitionError", "WrongSourceStateError",
|
|
32
|
+
"TcpClientConnection",
|
|
33
|
+
"TcpServerConnection",
|
|
34
|
+
"Timeouts",
|
|
35
|
+
]
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""Helper to track block send result across threads."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import enum
|
|
5
|
+
import threading
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class BlockSendResult(enum.Enum):
|
|
9
|
+
"""Enum for send result including not send state."""
|
|
10
|
+
|
|
11
|
+
NOT_SENT = 0
|
|
12
|
+
SENT_OK = 1
|
|
13
|
+
SENT_ERROR = 2
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class BlockSendInfo:
|
|
17
|
+
"""Container for sending block and waiting for result."""
|
|
18
|
+
|
|
19
|
+
def __init__(self, data: bytes):
|
|
20
|
+
"""Initialize block send info object.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
data: data to send.
|
|
24
|
+
|
|
25
|
+
"""
|
|
26
|
+
self._data = data
|
|
27
|
+
|
|
28
|
+
self._result = BlockSendResult.NOT_SENT
|
|
29
|
+
self._result_trigger = threading.Event()
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def data(self) -> bytes:
|
|
33
|
+
"""Get the data for sending."""
|
|
34
|
+
return self._data
|
|
35
|
+
|
|
36
|
+
def resolve(self, result: bool):
|
|
37
|
+
"""Resolve the send data with a result.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
result: result to resolve with
|
|
41
|
+
|
|
42
|
+
"""
|
|
43
|
+
self._result = BlockSendResult.SENT_OK if result else BlockSendResult.SENT_ERROR
|
|
44
|
+
self._result_trigger.set()
|
|
45
|
+
|
|
46
|
+
def wait(self) -> bool:
|
|
47
|
+
"""Wait for the message is sent and a result is available."""
|
|
48
|
+
self._result_trigger.wait()
|
|
49
|
+
|
|
50
|
+
return self._result == BlockSendResult.SENT_OK
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"""Queue for bytes."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import threading
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ByteQueue:
|
|
8
|
+
"""FIFO class for queuing and retrieving bytes."""
|
|
9
|
+
|
|
10
|
+
def __init__(self) -> None:
|
|
11
|
+
"""Initialize the queue."""
|
|
12
|
+
self._buffer = bytearray()
|
|
13
|
+
self._buffer_lock = threading.Condition()
|
|
14
|
+
|
|
15
|
+
def append(self, data: bytes):
|
|
16
|
+
"""Add bytes to the end of the queue.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
data: bytes to add
|
|
20
|
+
|
|
21
|
+
"""
|
|
22
|
+
with self._buffer_lock:
|
|
23
|
+
self._buffer.extend(data)
|
|
24
|
+
self._buffer_lock.notify_all()
|
|
25
|
+
|
|
26
|
+
def pop(self, size: int = 1) -> bytes:
|
|
27
|
+
"""Remove and return bytes from the beginning of queue.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
size: number of bytes to remove
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
removed bytes
|
|
34
|
+
|
|
35
|
+
"""
|
|
36
|
+
with self._buffer_lock:
|
|
37
|
+
data = self._buffer[:size]
|
|
38
|
+
del self._buffer[:size]
|
|
39
|
+
return data
|
|
40
|
+
|
|
41
|
+
def pop_byte(self) -> int:
|
|
42
|
+
"""Remove and return single byte from the beginning of queue.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
removed byte
|
|
46
|
+
|
|
47
|
+
"""
|
|
48
|
+
with self._buffer_lock:
|
|
49
|
+
data = self._buffer[0]
|
|
50
|
+
del self._buffer[0]
|
|
51
|
+
return data
|
|
52
|
+
|
|
53
|
+
def peek(self, size: int = 1) -> bytes:
|
|
54
|
+
"""Get bytes from beginning of the queue without removing them.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
size: number of bytes to peek
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
peek bytes
|
|
61
|
+
|
|
62
|
+
"""
|
|
63
|
+
return self._buffer[:size]
|
|
64
|
+
|
|
65
|
+
def peek_byte(self, position: int = 0) -> int:
|
|
66
|
+
"""Get single byte in the buffer without removing.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
position: byte position to peek at
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
peek bytes
|
|
73
|
+
|
|
74
|
+
"""
|
|
75
|
+
return self._buffer[position]
|
|
76
|
+
|
|
77
|
+
def clear(self):
|
|
78
|
+
"""Clear the bytes in the queue."""
|
|
79
|
+
with self._buffer_lock:
|
|
80
|
+
self._buffer.clear()
|
|
81
|
+
|
|
82
|
+
def __len__(self) -> int:
|
|
83
|
+
"""Get the length of the queue.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
queue length
|
|
87
|
+
|
|
88
|
+
"""
|
|
89
|
+
return len(self._buffer)
|
|
90
|
+
|
|
91
|
+
def wait_for(self, size: int = 1, peek: bool = False) -> bytes:
|
|
92
|
+
"""Wait until the requested number of bytes is available in the receive queue.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
size: number of bytes
|
|
96
|
+
peek: only look, don't remove the item from the queue.
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
Found bytes
|
|
100
|
+
|
|
101
|
+
"""
|
|
102
|
+
def min_size() -> bool:
|
|
103
|
+
return len(self._buffer) >= size
|
|
104
|
+
|
|
105
|
+
if len(self._buffer) < size:
|
|
106
|
+
with self._buffer_lock:
|
|
107
|
+
self._buffer_lock.wait_for(min_size)
|
|
108
|
+
|
|
109
|
+
if peek:
|
|
110
|
+
return self.peek(size)
|
|
111
|
+
|
|
112
|
+
return self.pop(size)
|
|
113
|
+
|
|
114
|
+
def wait_for_byte(self, peek: bool = False) -> int:
|
|
115
|
+
"""Wait until one byte is available in the receive queue.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
peek: only look, don't remove the item from the queue.
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
Found byte
|
|
122
|
+
|
|
123
|
+
"""
|
|
124
|
+
return self.wait_for(peek=peek)[0]
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"""Contains callback handling routines."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import typing
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class _CallbackCallWrapper:
|
|
8
|
+
def __init__(self, handler: CallbackHandler, name: str):
|
|
9
|
+
self._name = name
|
|
10
|
+
self._handler = handler
|
|
11
|
+
|
|
12
|
+
def __call__(self, *args: tuple, **kwargs: dict) -> typing.Any:
|
|
13
|
+
return self.handler._call(self.name, *args, **kwargs) # noqa: SLF001
|
|
14
|
+
|
|
15
|
+
@property
|
|
16
|
+
def name(self) -> str:
|
|
17
|
+
"""Get the callback name."""
|
|
18
|
+
return self._name
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def handler(self) -> CallbackHandler:
|
|
22
|
+
"""Get the handler for the callback."""
|
|
23
|
+
return self._handler
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class CallbackHandler:
|
|
27
|
+
"""Handler for callbacks for HSMS/SECS/GEM events.
|
|
28
|
+
|
|
29
|
+
This handler manages callbacks for events that can happen on a handler for a connection.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def __init__(self) -> None:
|
|
33
|
+
"""Initialize the handler."""
|
|
34
|
+
self._callbacks: dict[str, typing.Callable] = {}
|
|
35
|
+
self.target: object = None
|
|
36
|
+
self._object_intitialized = True
|
|
37
|
+
|
|
38
|
+
def __setattr__(self, name: str, value: typing.Callable):
|
|
39
|
+
"""Set an item as object member.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
name: name of the callback
|
|
43
|
+
value: callback function
|
|
44
|
+
|
|
45
|
+
"""
|
|
46
|
+
if "_object_intitialized" not in self.__dict__ or name in self.__dict__:
|
|
47
|
+
dict.__setattr__(self, name, value)
|
|
48
|
+
return
|
|
49
|
+
|
|
50
|
+
if value is None:
|
|
51
|
+
if name in self._callbacks:
|
|
52
|
+
del self._callbacks[name]
|
|
53
|
+
else:
|
|
54
|
+
self._callbacks[name] = value
|
|
55
|
+
|
|
56
|
+
def __getattr__(self, name: str) -> typing.Callable:
|
|
57
|
+
"""Get a callable function for an event.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
name: name of the event
|
|
61
|
+
|
|
62
|
+
"""
|
|
63
|
+
return _CallbackCallWrapper(self, name)
|
|
64
|
+
|
|
65
|
+
class _CallbacksIter:
|
|
66
|
+
def __init__(self, keys):
|
|
67
|
+
self._keys = list(keys)
|
|
68
|
+
self._counter = 0
|
|
69
|
+
|
|
70
|
+
def __iter__(self):
|
|
71
|
+
return self
|
|
72
|
+
|
|
73
|
+
def __next__(self):
|
|
74
|
+
if self._counter < len(self._keys):
|
|
75
|
+
i = self._counter
|
|
76
|
+
self._counter += 1
|
|
77
|
+
return self._keys[i]
|
|
78
|
+
|
|
79
|
+
raise StopIteration
|
|
80
|
+
|
|
81
|
+
def __iter__(self) -> _CallbacksIter:
|
|
82
|
+
"""Get an iterator for the callbacks.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
callback iterator
|
|
86
|
+
|
|
87
|
+
"""
|
|
88
|
+
return self._CallbacksIter(self._callbacks.keys())
|
|
89
|
+
|
|
90
|
+
def __contains__(self, callback: str) -> bool:
|
|
91
|
+
"""Check if a callback is present.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
callback: name of the event
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
True if callback present
|
|
98
|
+
|
|
99
|
+
"""
|
|
100
|
+
if callback in self._callbacks:
|
|
101
|
+
return True
|
|
102
|
+
|
|
103
|
+
delegate_handler = getattr(self.target, "_on_" + callback, None)
|
|
104
|
+
if callable(delegate_handler):
|
|
105
|
+
return True
|
|
106
|
+
|
|
107
|
+
return False
|
|
108
|
+
|
|
109
|
+
def _call(self, callback: str, *args, **kwargs) -> typing.Any:
|
|
110
|
+
if callback in self._callbacks:
|
|
111
|
+
return self._callbacks[callback](*args, **kwargs)
|
|
112
|
+
|
|
113
|
+
delegate_handler = getattr(self.target, "_on_" + callback, None)
|
|
114
|
+
if callable(delegate_handler):
|
|
115
|
+
return delegate_handler(*args, **kwargs)
|
|
116
|
+
|
|
117
|
+
return None
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""JIS X 0201 Codec required for JIS8 encoding of JIS8."""
|
|
2
|
+
import codecs
|
|
3
|
+
|
|
4
|
+
jis8_decoding_map = codecs.make_identity_dict(range(256)) # type: ignore[attr-defined]
|
|
5
|
+
jis8_decoding_map.update({
|
|
6
|
+
0x005C: 0x00A5, # Yen Sign
|
|
7
|
+
0x007E: 0x203E, # Overline
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
for i in range(0x00A1, 0x00E0):
|
|
11
|
+
jis8_decoding_map[i] = i + 0xFEC0
|
|
12
|
+
|
|
13
|
+
jis8_encoding_map = codecs.make_encoding_map(jis8_decoding_map) # type: ignore[attr-defined]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _jis_x_0201_encode(data, errors="strict"):
|
|
17
|
+
return codecs.charmap_encode(data, errors, jis8_encoding_map)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _jis_x_0201_decode(data, errors="strict"):
|
|
21
|
+
return codecs.charmap_decode(data, errors, jis8_decoding_map)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _jis_x_0201_search(name):
|
|
25
|
+
if name == "jis_8":
|
|
26
|
+
return codecs.CodecInfo(encode=_jis_x_0201_encode, decode=_jis_x_0201_decode, name="jis_8")
|
|
27
|
+
|
|
28
|
+
return None
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# register the codec
|
|
32
|
+
codecs.register(_jis_x_0201_search)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""Connection base function."""
|
|
2
|
+
import abc
|
|
3
|
+
|
|
4
|
+
from .events import Event
|
|
5
|
+
from .settings import Settings
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Connection(abc.ABC):
|
|
9
|
+
"""Abstract base class for a connection."""
|
|
10
|
+
|
|
11
|
+
def __init__(self, settings: Settings) -> None:
|
|
12
|
+
"""Initialize connection object."""
|
|
13
|
+
super().__init__()
|
|
14
|
+
|
|
15
|
+
self._settings = settings
|
|
16
|
+
|
|
17
|
+
self._on_connected = Event()
|
|
18
|
+
self._on_data = Event()
|
|
19
|
+
self._on_disconnecting = Event()
|
|
20
|
+
self._on_disconnected = Event()
|
|
21
|
+
|
|
22
|
+
self._connected = False
|
|
23
|
+
self._disconnecting = False
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def on_connected(self) -> Event:
|
|
27
|
+
"""Get the connected event.
|
|
28
|
+
|
|
29
|
+
Callbacks to this event are called, when a connection was established.
|
|
30
|
+
|
|
31
|
+
"""
|
|
32
|
+
return self._on_connected
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def on_data(self) -> Event:
|
|
36
|
+
"""Get the data received event.
|
|
37
|
+
|
|
38
|
+
Callbacks to this event are called, when data was received.
|
|
39
|
+
|
|
40
|
+
"""
|
|
41
|
+
return self._on_data
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def on_disconnecting(self) -> Event:
|
|
45
|
+
"""Get the disconnecting event.
|
|
46
|
+
|
|
47
|
+
Callbacks to this event are called, before the connection is separated.
|
|
48
|
+
|
|
49
|
+
"""
|
|
50
|
+
return self._on_disconnecting
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def on_disconnected(self) -> Event:
|
|
54
|
+
"""Get the disconnect event.
|
|
55
|
+
|
|
56
|
+
Callbacks to this event are called, after the connection was separated.
|
|
57
|
+
|
|
58
|
+
"""
|
|
59
|
+
return self._on_disconnected
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def connected(self) -> bool:
|
|
63
|
+
"""Get the connected flag.
|
|
64
|
+
|
|
65
|
+
This flag is True, when a connection is established.
|
|
66
|
+
|
|
67
|
+
"""
|
|
68
|
+
return self._connected
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def disconnecting(self) -> bool:
|
|
72
|
+
"""Get the disconnecting flag.
|
|
73
|
+
|
|
74
|
+
This flag is True, when the connection is about to be separated.
|
|
75
|
+
|
|
76
|
+
"""
|
|
77
|
+
return self._disconnecting
|
|
78
|
+
|
|
79
|
+
@abc.abstractmethod
|
|
80
|
+
def enable(self):
|
|
81
|
+
"""Enable the connection.
|
|
82
|
+
|
|
83
|
+
Open port and start receiver thread.
|
|
84
|
+
"""
|
|
85
|
+
raise NotImplementedError("Connection.enable missing implementation")
|
|
86
|
+
|
|
87
|
+
@abc.abstractmethod
|
|
88
|
+
def disable(self):
|
|
89
|
+
"""Disable the connection.
|
|
90
|
+
|
|
91
|
+
Close port and stop receiver thread.
|
|
92
|
+
"""
|
|
93
|
+
raise NotImplementedError("Connection.disable missing implementation")
|
|
94
|
+
|
|
95
|
+
@abc.abstractmethod
|
|
96
|
+
def send_data(self, data: bytes) -> bool:
|
|
97
|
+
"""Send data to the remote host.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
data: encoded data.
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
True if succeeded, False if failed
|
|
104
|
+
|
|
105
|
+
"""
|
|
106
|
+
raise NotImplementedError("Connection.send_data missing implementation")
|