meerk40t 0.9.3001__py2.py3-none-any.whl → 0.9.7020__py2.py3-none-any.whl
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.
- meerk40t/__init__.py +1 -1
- meerk40t/balormk/balor_params.py +167 -167
- meerk40t/balormk/clone_loader.py +457 -457
- meerk40t/balormk/controller.py +1566 -1512
- meerk40t/balormk/cylindermod.py +64 -0
- meerk40t/balormk/device.py +966 -1959
- meerk40t/balormk/driver.py +778 -591
- meerk40t/balormk/galvo_commands.py +1194 -0
- meerk40t/balormk/gui/balorconfig.py +237 -111
- meerk40t/balormk/gui/balorcontroller.py +191 -184
- meerk40t/balormk/gui/baloroperationproperties.py +116 -115
- meerk40t/balormk/gui/corscene.py +845 -0
- meerk40t/balormk/gui/gui.py +179 -147
- meerk40t/balormk/livelightjob.py +466 -382
- meerk40t/balormk/mock_connection.py +131 -109
- meerk40t/balormk/plugin.py +133 -135
- meerk40t/balormk/usb_connection.py +306 -301
- meerk40t/camera/__init__.py +1 -1
- meerk40t/camera/camera.py +514 -397
- meerk40t/camera/gui/camerapanel.py +1241 -1095
- meerk40t/camera/gui/gui.py +58 -58
- meerk40t/camera/plugin.py +441 -399
- meerk40t/ch341/__init__.py +27 -27
- meerk40t/ch341/ch341device.py +628 -628
- meerk40t/ch341/libusb.py +595 -589
- meerk40t/ch341/mock.py +171 -171
- meerk40t/ch341/windriver.py +157 -157
- meerk40t/constants.py +13 -0
- meerk40t/core/__init__.py +1 -1
- meerk40t/core/bindalias.py +550 -539
- meerk40t/core/core.py +47 -47
- meerk40t/core/cutcode/cubiccut.py +73 -73
- meerk40t/core/cutcode/cutcode.py +315 -312
- meerk40t/core/cutcode/cutgroup.py +141 -137
- meerk40t/core/cutcode/cutobject.py +192 -185
- meerk40t/core/cutcode/dwellcut.py +37 -37
- meerk40t/core/cutcode/gotocut.py +29 -29
- meerk40t/core/cutcode/homecut.py +29 -29
- meerk40t/core/cutcode/inputcut.py +34 -34
- meerk40t/core/cutcode/linecut.py +33 -33
- meerk40t/core/cutcode/outputcut.py +34 -34
- meerk40t/core/cutcode/plotcut.py +335 -335
- meerk40t/core/cutcode/quadcut.py +61 -61
- meerk40t/core/cutcode/rastercut.py +168 -148
- meerk40t/core/cutcode/waitcut.py +34 -34
- meerk40t/core/cutplan.py +1843 -1316
- meerk40t/core/drivers.py +330 -329
- meerk40t/core/elements/align.py +801 -669
- meerk40t/core/elements/branches.py +1858 -1507
- meerk40t/core/elements/clipboard.py +229 -219
- meerk40t/core/elements/element_treeops.py +4595 -2837
- meerk40t/core/elements/element_types.py +125 -105
- meerk40t/core/elements/elements.py +4315 -3617
- meerk40t/core/elements/files.py +117 -64
- meerk40t/core/elements/geometry.py +473 -224
- meerk40t/core/elements/grid.py +467 -316
- meerk40t/core/elements/materials.py +158 -94
- meerk40t/core/elements/notes.py +50 -38
- meerk40t/core/elements/offset_clpr.py +934 -912
- meerk40t/core/elements/offset_mk.py +963 -955
- meerk40t/core/elements/penbox.py +339 -267
- meerk40t/core/elements/placements.py +300 -83
- meerk40t/core/elements/render.py +785 -687
- meerk40t/core/elements/shapes.py +2618 -2092
- meerk40t/core/elements/testcases.py +105 -0
- meerk40t/core/elements/trace.py +651 -563
- meerk40t/core/elements/tree_commands.py +415 -409
- meerk40t/core/elements/undo_redo.py +116 -58
- meerk40t/core/elements/wordlist.py +319 -200
- meerk40t/core/exceptions.py +9 -9
- meerk40t/core/laserjob.py +220 -220
- meerk40t/core/logging.py +63 -63
- meerk40t/core/node/blobnode.py +83 -86
- meerk40t/core/node/bootstrap.py +105 -103
- meerk40t/core/node/branch_elems.py +40 -31
- meerk40t/core/node/branch_ops.py +45 -38
- meerk40t/core/node/branch_regmark.py +48 -41
- meerk40t/core/node/cutnode.py +29 -32
- meerk40t/core/node/effect_hatch.py +375 -257
- meerk40t/core/node/effect_warp.py +398 -0
- meerk40t/core/node/effect_wobble.py +441 -309
- meerk40t/core/node/elem_ellipse.py +404 -309
- meerk40t/core/node/elem_image.py +1082 -801
- meerk40t/core/node/elem_line.py +358 -292
- meerk40t/core/node/elem_path.py +259 -201
- meerk40t/core/node/elem_point.py +129 -102
- meerk40t/core/node/elem_polyline.py +310 -246
- meerk40t/core/node/elem_rect.py +376 -286
- meerk40t/core/node/elem_text.py +445 -418
- meerk40t/core/node/filenode.py +59 -40
- meerk40t/core/node/groupnode.py +138 -74
- meerk40t/core/node/image_processed.py +777 -766
- meerk40t/core/node/image_raster.py +156 -113
- meerk40t/core/node/layernode.py +31 -31
- meerk40t/core/node/mixins.py +135 -107
- meerk40t/core/node/node.py +1427 -1304
- meerk40t/core/node/nutils.py +117 -114
- meerk40t/core/node/op_cut.py +463 -335
- meerk40t/core/node/op_dots.py +296 -251
- meerk40t/core/node/op_engrave.py +414 -311
- meerk40t/core/node/op_image.py +755 -369
- meerk40t/core/node/op_raster.py +787 -522
- meerk40t/core/node/place_current.py +37 -40
- meerk40t/core/node/place_point.py +329 -126
- meerk40t/core/node/refnode.py +58 -47
- meerk40t/core/node/rootnode.py +225 -219
- meerk40t/core/node/util_console.py +48 -48
- meerk40t/core/node/util_goto.py +84 -65
- meerk40t/core/node/util_home.py +61 -61
- meerk40t/core/node/util_input.py +102 -102
- meerk40t/core/node/util_output.py +102 -102
- meerk40t/core/node/util_wait.py +65 -65
- meerk40t/core/parameters.py +709 -707
- meerk40t/core/planner.py +875 -785
- meerk40t/core/plotplanner.py +656 -652
- meerk40t/core/space.py +120 -113
- meerk40t/core/spoolers.py +706 -705
- meerk40t/core/svg_io.py +1836 -1549
- meerk40t/core/treeop.py +534 -445
- meerk40t/core/undos.py +278 -124
- meerk40t/core/units.py +784 -680
- meerk40t/core/view.py +393 -322
- meerk40t/core/webhelp.py +62 -62
- meerk40t/core/wordlist.py +513 -504
- meerk40t/cylinder/cylinder.py +247 -0
- meerk40t/cylinder/gui/cylindersettings.py +41 -0
- meerk40t/cylinder/gui/gui.py +24 -0
- meerk40t/device/__init__.py +1 -1
- meerk40t/device/basedevice.py +322 -123
- meerk40t/device/devicechoices.py +50 -0
- meerk40t/device/dummydevice.py +163 -128
- meerk40t/device/gui/defaultactions.py +618 -602
- meerk40t/device/gui/effectspanel.py +114 -0
- meerk40t/device/gui/formatterpanel.py +253 -290
- meerk40t/device/gui/warningpanel.py +337 -260
- meerk40t/device/mixins.py +13 -13
- meerk40t/dxf/__init__.py +1 -1
- meerk40t/dxf/dxf_io.py +766 -554
- meerk40t/dxf/plugin.py +47 -35
- meerk40t/external_plugins.py +79 -79
- meerk40t/external_plugins_build.py +28 -28
- meerk40t/extra/cag.py +112 -116
- meerk40t/extra/coolant.py +403 -0
- meerk40t/extra/encode_detect.py +204 -0
- meerk40t/extra/ezd.py +1165 -1165
- meerk40t/extra/hershey.py +834 -340
- meerk40t/extra/imageactions.py +322 -316
- meerk40t/extra/inkscape.py +628 -622
- meerk40t/extra/lbrn.py +424 -424
- meerk40t/extra/outerworld.py +283 -0
- meerk40t/extra/param_functions.py +1542 -1556
- meerk40t/extra/potrace.py +257 -253
- meerk40t/extra/serial_exchange.py +118 -0
- meerk40t/extra/updater.py +602 -453
- meerk40t/extra/vectrace.py +147 -146
- meerk40t/extra/winsleep.py +83 -83
- meerk40t/extra/xcs_reader.py +597 -0
- meerk40t/fill/fills.py +781 -335
- meerk40t/fill/patternfill.py +1061 -1061
- meerk40t/fill/patterns.py +614 -567
- meerk40t/grbl/control.py +87 -87
- meerk40t/grbl/controller.py +990 -903
- meerk40t/grbl/device.py +1084 -768
- meerk40t/grbl/driver.py +989 -771
- meerk40t/grbl/emulator.py +532 -497
- meerk40t/grbl/gcodejob.py +783 -767
- meerk40t/grbl/gui/grblconfiguration.py +373 -298
- meerk40t/grbl/gui/grblcontroller.py +485 -271
- meerk40t/grbl/gui/grblhardwareconfig.py +269 -153
- meerk40t/grbl/gui/grbloperationconfig.py +105 -0
- meerk40t/grbl/gui/gui.py +147 -116
- meerk40t/grbl/interpreter.py +44 -44
- meerk40t/grbl/loader.py +22 -22
- meerk40t/grbl/mock_connection.py +56 -56
- meerk40t/grbl/plugin.py +294 -264
- meerk40t/grbl/serial_connection.py +93 -88
- meerk40t/grbl/tcp_connection.py +81 -79
- meerk40t/grbl/ws_connection.py +112 -0
- meerk40t/gui/__init__.py +1 -1
- meerk40t/gui/about.py +2042 -296
- meerk40t/gui/alignment.py +1644 -1608
- meerk40t/gui/autoexec.py +199 -0
- meerk40t/gui/basicops.py +791 -670
- meerk40t/gui/bufferview.py +77 -71
- meerk40t/gui/busy.py +232 -133
- meerk40t/gui/choicepropertypanel.py +1662 -1469
- meerk40t/gui/consolepanel.py +706 -542
- meerk40t/gui/devicepanel.py +687 -581
- meerk40t/gui/dialogoptions.py +110 -107
- meerk40t/gui/executejob.py +316 -306
- meerk40t/gui/fonts.py +90 -90
- meerk40t/gui/functionwrapper.py +252 -0
- meerk40t/gui/gui_mixins.py +729 -0
- meerk40t/gui/guicolors.py +205 -182
- meerk40t/gui/help_assets/help_assets.py +218 -201
- meerk40t/gui/helper.py +154 -0
- meerk40t/gui/hersheymanager.py +1440 -846
- meerk40t/gui/icons.py +3422 -2747
- meerk40t/gui/imagesplitter.py +555 -508
- meerk40t/gui/keymap.py +354 -344
- meerk40t/gui/laserpanel.py +897 -806
- meerk40t/gui/laserrender.py +1470 -1232
- meerk40t/gui/lasertoolpanel.py +805 -793
- meerk40t/gui/magnetoptions.py +436 -0
- meerk40t/gui/materialmanager.py +2944 -0
- meerk40t/gui/materialtest.py +1722 -1694
- meerk40t/gui/mkdebug.py +646 -359
- meerk40t/gui/mwindow.py +163 -140
- meerk40t/gui/navigationpanels.py +2605 -2467
- meerk40t/gui/notes.py +143 -142
- meerk40t/gui/opassignment.py +414 -410
- meerk40t/gui/operation_info.py +310 -299
- meerk40t/gui/plugin.py +500 -328
- meerk40t/gui/position.py +714 -669
- meerk40t/gui/preferences.py +901 -650
- meerk40t/gui/propertypanels/attributes.py +1461 -1131
- meerk40t/gui/propertypanels/blobproperty.py +117 -114
- meerk40t/gui/propertypanels/consoleproperty.py +83 -80
- meerk40t/gui/propertypanels/gotoproperty.py +77 -0
- meerk40t/gui/propertypanels/groupproperties.py +223 -217
- meerk40t/gui/propertypanels/hatchproperty.py +489 -469
- meerk40t/gui/propertypanels/imageproperty.py +2244 -1384
- meerk40t/gui/propertypanels/inputproperty.py +59 -58
- meerk40t/gui/propertypanels/opbranchproperties.py +82 -80
- meerk40t/gui/propertypanels/operationpropertymain.py +1890 -1638
- meerk40t/gui/propertypanels/outputproperty.py +59 -58
- meerk40t/gui/propertypanels/pathproperty.py +389 -380
- meerk40t/gui/propertypanels/placementproperty.py +1214 -383
- meerk40t/gui/propertypanels/pointproperty.py +140 -136
- meerk40t/gui/propertypanels/propertywindow.py +313 -181
- meerk40t/gui/propertypanels/rasterwizardpanels.py +996 -912
- meerk40t/gui/propertypanels/regbranchproperties.py +76 -0
- meerk40t/gui/propertypanels/textproperty.py +770 -755
- meerk40t/gui/propertypanels/waitproperty.py +56 -55
- meerk40t/gui/propertypanels/warpproperty.py +121 -0
- meerk40t/gui/propertypanels/wobbleproperty.py +255 -204
- meerk40t/gui/ribbon.py +2471 -2210
- meerk40t/gui/scene/scene.py +1100 -1051
- meerk40t/gui/scene/sceneconst.py +22 -22
- meerk40t/gui/scene/scenepanel.py +439 -349
- meerk40t/gui/scene/scenespacewidget.py +365 -365
- meerk40t/gui/scene/widget.py +518 -505
- meerk40t/gui/scenewidgets/affinemover.py +215 -215
- meerk40t/gui/scenewidgets/attractionwidget.py +315 -309
- meerk40t/gui/scenewidgets/bedwidget.py +120 -97
- meerk40t/gui/scenewidgets/elementswidget.py +137 -107
- meerk40t/gui/scenewidgets/gridwidget.py +785 -745
- meerk40t/gui/scenewidgets/guidewidget.py +765 -765
- meerk40t/gui/scenewidgets/laserpathwidget.py +66 -66
- meerk40t/gui/scenewidgets/machineoriginwidget.py +86 -86
- meerk40t/gui/scenewidgets/nodeselector.py +28 -28
- meerk40t/gui/scenewidgets/rectselectwidget.py +592 -346
- meerk40t/gui/scenewidgets/relocatewidget.py +33 -33
- meerk40t/gui/scenewidgets/reticlewidget.py +83 -83
- meerk40t/gui/scenewidgets/selectionwidget.py +2958 -2756
- meerk40t/gui/simpleui.py +362 -333
- meerk40t/gui/simulation.py +2451 -2094
- meerk40t/gui/snapoptions.py +208 -203
- meerk40t/gui/spoolerpanel.py +1227 -1180
- meerk40t/gui/statusbarwidgets/defaultoperations.py +480 -353
- meerk40t/gui/statusbarwidgets/infowidget.py +520 -483
- meerk40t/gui/statusbarwidgets/opassignwidget.py +356 -355
- meerk40t/gui/statusbarwidgets/selectionwidget.py +172 -171
- meerk40t/gui/statusbarwidgets/shapepropwidget.py +754 -236
- meerk40t/gui/statusbarwidgets/statusbar.py +272 -260
- meerk40t/gui/statusbarwidgets/statusbarwidget.py +268 -270
- meerk40t/gui/statusbarwidgets/strokewidget.py +267 -251
- meerk40t/gui/themes.py +200 -78
- meerk40t/gui/tips.py +590 -0
- meerk40t/gui/toolwidgets/circlebrush.py +35 -35
- meerk40t/gui/toolwidgets/toolcircle.py +248 -242
- meerk40t/gui/toolwidgets/toolcontainer.py +82 -77
- meerk40t/gui/toolwidgets/tooldraw.py +97 -90
- meerk40t/gui/toolwidgets/toolellipse.py +219 -212
- meerk40t/gui/toolwidgets/toolimagecut.py +25 -132
- meerk40t/gui/toolwidgets/toolline.py +39 -144
- meerk40t/gui/toolwidgets/toollinetext.py +79 -236
- meerk40t/gui/toolwidgets/toollinetext_inline.py +296 -0
- meerk40t/gui/toolwidgets/toolmeasure.py +163 -216
- meerk40t/gui/toolwidgets/toolnodeedit.py +2088 -2074
- meerk40t/gui/toolwidgets/toolnodemove.py +92 -94
- meerk40t/gui/toolwidgets/toolparameter.py +754 -668
- meerk40t/gui/toolwidgets/toolplacement.py +108 -108
- meerk40t/gui/toolwidgets/toolpoint.py +68 -59
- meerk40t/gui/toolwidgets/toolpointlistbuilder.py +294 -0
- meerk40t/gui/toolwidgets/toolpointmove.py +183 -0
- meerk40t/gui/toolwidgets/toolpolygon.py +288 -403
- meerk40t/gui/toolwidgets/toolpolyline.py +38 -196
- meerk40t/gui/toolwidgets/toolrect.py +211 -207
- meerk40t/gui/toolwidgets/toolrelocate.py +72 -72
- meerk40t/gui/toolwidgets/toolribbon.py +598 -113
- meerk40t/gui/toolwidgets/tooltabedit.py +546 -0
- meerk40t/gui/toolwidgets/tooltext.py +98 -89
- meerk40t/gui/toolwidgets/toolvector.py +213 -204
- meerk40t/gui/toolwidgets/toolwidget.py +39 -39
- meerk40t/gui/usbconnect.py +98 -91
- meerk40t/gui/utilitywidgets/buttonwidget.py +18 -18
- meerk40t/gui/utilitywidgets/checkboxwidget.py +90 -90
- meerk40t/gui/utilitywidgets/controlwidget.py +14 -14
- meerk40t/gui/utilitywidgets/cyclocycloidwidget.py +343 -340
- meerk40t/gui/utilitywidgets/debugwidgets.py +148 -0
- meerk40t/gui/utilitywidgets/handlewidget.py +27 -27
- meerk40t/gui/utilitywidgets/harmonograph.py +450 -447
- meerk40t/gui/utilitywidgets/openclosewidget.py +40 -40
- meerk40t/gui/utilitywidgets/rotationwidget.py +54 -54
- meerk40t/gui/utilitywidgets/scalewidget.py +75 -75
- meerk40t/gui/utilitywidgets/seekbarwidget.py +183 -183
- meerk40t/gui/utilitywidgets/togglewidget.py +142 -142
- meerk40t/gui/utilitywidgets/toolbarwidget.py +8 -8
- meerk40t/gui/wordlisteditor.py +985 -931
- meerk40t/gui/wxmeerk40t.py +1447 -1169
- meerk40t/gui/wxmmain.py +5644 -4112
- meerk40t/gui/wxmribbon.py +1591 -1076
- meerk40t/gui/wxmscene.py +1631 -1453
- meerk40t/gui/wxmtree.py +2416 -2089
- meerk40t/gui/wxutils.py +1769 -1099
- meerk40t/gui/zmatrix.py +102 -102
- meerk40t/image/__init__.py +1 -1
- meerk40t/image/dither.py +429 -0
- meerk40t/image/imagetools.py +2793 -2269
- meerk40t/internal_plugins.py +150 -130
- meerk40t/kernel/__init__.py +63 -12
- meerk40t/kernel/channel.py +259 -212
- meerk40t/kernel/context.py +538 -538
- meerk40t/kernel/exceptions.py +41 -41
- meerk40t/kernel/functions.py +463 -414
- meerk40t/kernel/jobs.py +100 -100
- meerk40t/kernel/kernel.py +3828 -3571
- meerk40t/kernel/lifecycles.py +71 -71
- meerk40t/kernel/module.py +49 -49
- meerk40t/kernel/service.py +147 -147
- meerk40t/kernel/settings.py +383 -343
- meerk40t/lihuiyu/controller.py +883 -876
- meerk40t/lihuiyu/device.py +1181 -1069
- meerk40t/lihuiyu/driver.py +1466 -1372
- meerk40t/lihuiyu/gui/gui.py +127 -106
- meerk40t/lihuiyu/gui/lhyaccelgui.py +377 -363
- meerk40t/lihuiyu/gui/lhycontrollergui.py +741 -651
- meerk40t/lihuiyu/gui/lhydrivergui.py +470 -446
- meerk40t/lihuiyu/gui/lhyoperationproperties.py +238 -237
- meerk40t/lihuiyu/gui/tcpcontroller.py +226 -190
- meerk40t/lihuiyu/interpreter.py +53 -53
- meerk40t/lihuiyu/laserspeed.py +450 -450
- meerk40t/lihuiyu/loader.py +90 -90
- meerk40t/lihuiyu/parser.py +404 -404
- meerk40t/lihuiyu/plugin.py +101 -102
- meerk40t/lihuiyu/tcp_connection.py +111 -109
- meerk40t/main.py +231 -165
- meerk40t/moshi/builder.py +788 -781
- meerk40t/moshi/controller.py +505 -499
- meerk40t/moshi/device.py +495 -442
- meerk40t/moshi/driver.py +862 -696
- meerk40t/moshi/gui/gui.py +78 -76
- meerk40t/moshi/gui/moshicontrollergui.py +538 -522
- meerk40t/moshi/gui/moshidrivergui.py +87 -75
- meerk40t/moshi/plugin.py +43 -43
- meerk40t/network/console_server.py +140 -57
- meerk40t/network/kernelserver.py +10 -9
- meerk40t/network/tcp_server.py +142 -140
- meerk40t/network/udp_server.py +103 -77
- meerk40t/network/web_server.py +404 -0
- meerk40t/newly/controller.py +1158 -1144
- meerk40t/newly/device.py +874 -732
- meerk40t/newly/driver.py +540 -412
- meerk40t/newly/gui/gui.py +219 -188
- meerk40t/newly/gui/newlyconfig.py +116 -101
- meerk40t/newly/gui/newlycontroller.py +193 -186
- meerk40t/newly/gui/operationproperties.py +51 -51
- meerk40t/newly/mock_connection.py +82 -82
- meerk40t/newly/newly_params.py +56 -56
- meerk40t/newly/plugin.py +1214 -1246
- meerk40t/newly/usb_connection.py +322 -322
- meerk40t/rotary/gui/gui.py +52 -46
- meerk40t/rotary/gui/rotarysettings.py +240 -232
- meerk40t/rotary/rotary.py +202 -98
- meerk40t/ruida/control.py +291 -91
- meerk40t/ruida/controller.py +138 -1088
- meerk40t/ruida/device.py +676 -231
- meerk40t/ruida/driver.py +534 -472
- meerk40t/ruida/emulator.py +1494 -1491
- meerk40t/ruida/exceptions.py +4 -4
- meerk40t/ruida/gui/gui.py +71 -76
- meerk40t/ruida/gui/ruidaconfig.py +239 -72
- meerk40t/ruida/gui/ruidacontroller.py +187 -184
- meerk40t/ruida/gui/ruidaoperationproperties.py +48 -47
- meerk40t/ruida/loader.py +54 -52
- meerk40t/ruida/mock_connection.py +57 -109
- meerk40t/ruida/plugin.py +124 -87
- meerk40t/ruida/rdjob.py +2084 -945
- meerk40t/ruida/serial_connection.py +116 -0
- meerk40t/ruida/tcp_connection.py +146 -0
- meerk40t/ruida/udp_connection.py +73 -0
- meerk40t/svgelements.py +9671 -9669
- meerk40t/tools/driver_to_path.py +584 -579
- meerk40t/tools/geomstr.py +5583 -4680
- meerk40t/tools/jhfparser.py +357 -292
- meerk40t/tools/kerftest.py +904 -890
- meerk40t/tools/livinghinges.py +1168 -1033
- meerk40t/tools/pathtools.py +987 -949
- meerk40t/tools/pmatrix.py +234 -0
- meerk40t/tools/pointfinder.py +942 -942
- meerk40t/tools/polybool.py +941 -940
- meerk40t/tools/rasterplotter.py +1660 -547
- meerk40t/tools/shxparser.py +1047 -901
- meerk40t/tools/ttfparser.py +726 -446
- meerk40t/tools/zinglplotter.py +595 -593
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/LICENSE +21 -21
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/METADATA +150 -139
- meerk40t-0.9.7020.dist-info/RECORD +446 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/WHEEL +1 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/top_level.txt +0 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/zip-safe +1 -1
- meerk40t/balormk/elementlightjob.py +0 -159
- meerk40t-0.9.3001.dist-info/RECORD +0 -437
- test/bootstrap.py +0 -63
- test/test_cli.py +0 -12
- test/test_core_cutcode.py +0 -418
- test/test_core_elements.py +0 -144
- test/test_core_plotplanner.py +0 -397
- test/test_core_viewports.py +0 -312
- test/test_drivers_grbl.py +0 -108
- test/test_drivers_lihuiyu.py +0 -443
- test/test_drivers_newly.py +0 -113
- test/test_element_degenerate_points.py +0 -43
- test/test_elements_classify.py +0 -97
- test/test_elements_penbox.py +0 -22
- test/test_file_svg.py +0 -176
- test/test_fill.py +0 -155
- test/test_geomstr.py +0 -1523
- test/test_geomstr_nodes.py +0 -18
- test/test_imagetools_actualize.py +0 -306
- test/test_imagetools_wizard.py +0 -258
- test/test_kernel.py +0 -200
- test/test_laser_speeds.py +0 -3303
- test/test_length.py +0 -57
- test/test_lifecycle.py +0 -66
- test/test_operations.py +0 -251
- test/test_operations_hatch.py +0 -57
- test/test_ruida.py +0 -19
- test/test_spooler.py +0 -22
- test/test_tools_rasterplotter.py +0 -29
- test/test_wobble.py +0 -133
- test/test_zingl.py +0 -124
- {test → meerk40t/cylinder}/__init__.py +0 -0
- /meerk40t/{core/element_commands.py → cylinder/gui/__init__.py} +0 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/entry_points.txt +0 -0
meerk40t/newly/usb_connection.py
CHANGED
@@ -1,322 +1,322 @@
|
|
1
|
-
"""
|
2
|
-
Newly USB Connection
|
3
|
-
|
4
|
-
Performs the required interactions with the Newly backend through pyusb and libusb.
|
5
|
-
"""
|
6
|
-
import struct
|
7
|
-
import time
|
8
|
-
|
9
|
-
import usb.core
|
10
|
-
import usb.util
|
11
|
-
from usb.backend.libusb1 import LIBUSB_ERROR_ACCESS, LIBUSB_ERROR_NOT_FOUND
|
12
|
-
|
13
|
-
USB_LOCK_VENDOR = 0x0471
|
14
|
-
USB_LOCK_PRODUCT = 0x0999
|
15
|
-
|
16
|
-
WRITE_INTERRUPT = 0x01 # Is sent the size of the bulk data
|
17
|
-
READ_INTERRUPT = 0x81 # Reads 0x01 for OK
|
18
|
-
|
19
|
-
WRITE_BULK = 0x02 # Is sent entire big packet.
|
20
|
-
READ_BULK = 0x82
|
21
|
-
|
22
|
-
|
23
|
-
class USBConnection:
|
24
|
-
def __init__(self, channel):
|
25
|
-
self.channel = channel
|
26
|
-
self.devices = {}
|
27
|
-
self.interface = {}
|
28
|
-
self.backend_error_code = None
|
29
|
-
self.timeout = 2000
|
30
|
-
|
31
|
-
def find_device(self, index=0):
|
32
|
-
_ = self.channel._
|
33
|
-
self.channel(_("Using LibUSB to connect."))
|
34
|
-
self.channel(_("Finding devices."))
|
35
|
-
try:
|
36
|
-
devices = list(
|
37
|
-
usb.core.find(
|
38
|
-
idVendor=USB_LOCK_VENDOR, idProduct=USB_LOCK_PRODUCT, find_all=True
|
39
|
-
)
|
40
|
-
)
|
41
|
-
except usb.core.USBError as e:
|
42
|
-
self.backend_error_code = e.backend_error_code
|
43
|
-
|
44
|
-
self.channel(str(e))
|
45
|
-
raise ConnectionRefusedError
|
46
|
-
if len(devices) == 0:
|
47
|
-
self.channel(_("Devices Not Found."))
|
48
|
-
raise ConnectionRefusedError
|
49
|
-
for d in devices:
|
50
|
-
self.channel(_("Newly device detected:"))
|
51
|
-
string = str(d)
|
52
|
-
string = string.replace("\n", "\n\t")
|
53
|
-
self.channel(string)
|
54
|
-
try:
|
55
|
-
device = devices[index]
|
56
|
-
except IndexError:
|
57
|
-
if self.backend_error_code == LIBUSB_ERROR_ACCESS:
|
58
|
-
self.channel(_("Your OS does not give you permissions to access USB."))
|
59
|
-
raise PermissionError
|
60
|
-
elif self.backend_error_code == LIBUSB_ERROR_NOT_FOUND:
|
61
|
-
self.channel(
|
62
|
-
_(
|
63
|
-
"Newly devices were found. But something else was connected to them."
|
64
|
-
)
|
65
|
-
)
|
66
|
-
raise ConnectionRefusedError
|
67
|
-
return device
|
68
|
-
|
69
|
-
def detach_kernel(self, device, interface):
|
70
|
-
_ = self.channel._
|
71
|
-
try:
|
72
|
-
if device.is_kernel_driver_active(interface.bInterfaceNumber):
|
73
|
-
try:
|
74
|
-
self.channel(_("Attempting to detach kernel."))
|
75
|
-
device.detach_kernel_driver(interface.bInterfaceNumber)
|
76
|
-
self.channel(_("Kernel detach: Success."))
|
77
|
-
except usb.core.USBError as e:
|
78
|
-
self.backend_error_code = e.backend_error_code
|
79
|
-
|
80
|
-
self.channel(str(e))
|
81
|
-
self.channel(_("Kernel detach: Failed."))
|
82
|
-
raise ConnectionRefusedError
|
83
|
-
except NotImplementedError:
|
84
|
-
self.channel(
|
85
|
-
_("Kernel detach: Not Implemented.")
|
86
|
-
) # Driver does not permit kernel detaching.
|
87
|
-
# Non-fatal error.
|
88
|
-
|
89
|
-
def get_active_config(self, device):
|
90
|
-
_ = self.channel._
|
91
|
-
self.channel(_("Getting Active Config"))
|
92
|
-
try:
|
93
|
-
interface = device.get_active_configuration()[(0, 0)]
|
94
|
-
self.channel(_("Active Config: Success."))
|
95
|
-
return interface
|
96
|
-
except usb.core.USBError as e:
|
97
|
-
self.backend_error_code = e.backend_error_code
|
98
|
-
|
99
|
-
self.channel(str(e))
|
100
|
-
self.channel(_("Active Config: Failed."))
|
101
|
-
raise ConnectionRefusedError
|
102
|
-
|
103
|
-
def set_config(self, device):
|
104
|
-
_ = self.channel._
|
105
|
-
self.channel(_("Config Set"))
|
106
|
-
try:
|
107
|
-
device.set_configuration()
|
108
|
-
self.channel(_("Config Set: Success"))
|
109
|
-
except usb.core.USBError as e:
|
110
|
-
self.backend_error_code = e.backend_error_code
|
111
|
-
|
112
|
-
self.channel(str(e))
|
113
|
-
self.channel(
|
114
|
-
_(
|
115
|
-
"Config Set: Fail\n(Hint: may recover if you change where the USB is plugged in.)"
|
116
|
-
)
|
117
|
-
)
|
118
|
-
# raise ConnectionRefusedError
|
119
|
-
|
120
|
-
def claim_interface(self, device, interface):
|
121
|
-
_ = self.channel._
|
122
|
-
try:
|
123
|
-
self.channel(_("Attempting to claim interface."))
|
124
|
-
usb.util.claim_interface(device, interface)
|
125
|
-
self.channel(_("Interface claim: Success"))
|
126
|
-
except usb.core.USBError as e:
|
127
|
-
self.backend_error_code = e.backend_error_code
|
128
|
-
|
129
|
-
self.channel(str(e))
|
130
|
-
self.channel(_("Interface claim: Failed. (Interface is in use.)"))
|
131
|
-
raise ConnectionRefusedError
|
132
|
-
# Already in use. This is critical.
|
133
|
-
|
134
|
-
def disconnect_detach(self, device, interface):
|
135
|
-
_ = self.channel._
|
136
|
-
try:
|
137
|
-
self.channel(_("Attempting kernel attach"))
|
138
|
-
device.attach_kernel_driver(interface.bInterfaceNumber)
|
139
|
-
self.channel(_("Kernel attach: Success."))
|
140
|
-
except usb.core.USBError as e:
|
141
|
-
self.backend_error_code = e.backend_error_code
|
142
|
-
|
143
|
-
self.channel(str(e))
|
144
|
-
self.channel(_("Kernel attach: Fail."))
|
145
|
-
# Continue and hope it is non-critical.
|
146
|
-
except NotImplementedError:
|
147
|
-
self.channel(_("Kernel attach: Fail."))
|
148
|
-
|
149
|
-
def unclaim_interface(self, device, interface):
|
150
|
-
_ = self.channel._
|
151
|
-
try:
|
152
|
-
self.channel(_("Attempting to release interface."))
|
153
|
-
usb.util.release_interface(device, interface)
|
154
|
-
self.channel(_("Interface released."))
|
155
|
-
except usb.core.USBError as e:
|
156
|
-
self.backend_error_code = e.backend_error_code
|
157
|
-
|
158
|
-
self.channel(str(e))
|
159
|
-
self.channel(_("Interface did not exist."))
|
160
|
-
|
161
|
-
def disconnect_dispose(self, device):
|
162
|
-
_ = self.channel._
|
163
|
-
try:
|
164
|
-
self.channel(_("Attempting to dispose resources."))
|
165
|
-
usb.util.dispose_resources(device)
|
166
|
-
self.channel(_("Dispose Resources: Success"))
|
167
|
-
except usb.core.USBError as e:
|
168
|
-
self.backend_error_code = e.backend_error_code
|
169
|
-
|
170
|
-
self.channel(str(e))
|
171
|
-
self.channel(_("Dispose Resources: Fail"))
|
172
|
-
|
173
|
-
def disconnect_reset(self, device):
|
174
|
-
_ = self.channel._
|
175
|
-
try:
|
176
|
-
self.channel(_("Attempting USB reset."))
|
177
|
-
device.reset()
|
178
|
-
self.channel(_("USB connection reset."))
|
179
|
-
except usb.core.USBError as e:
|
180
|
-
self.backend_error_code = e.backend_error_code
|
181
|
-
|
182
|
-
self.channel(str(e))
|
183
|
-
self.channel(_("USB connection did not exist."))
|
184
|
-
|
185
|
-
def bus(self, index):
|
186
|
-
return self.devices[index].bus
|
187
|
-
|
188
|
-
def address(self, index):
|
189
|
-
return self.devices[index].address
|
190
|
-
|
191
|
-
def is_open(self, index=0):
|
192
|
-
try:
|
193
|
-
dev = self.devices[index]
|
194
|
-
if dev:
|
195
|
-
return True
|
196
|
-
except KeyError:
|
197
|
-
pass
|
198
|
-
return False
|
199
|
-
|
200
|
-
def open(self, index=0):
|
201
|
-
"""Opens device, returns index."""
|
202
|
-
_ = self.channel._
|
203
|
-
self.channel(_("Attempting connection to USB."))
|
204
|
-
try:
|
205
|
-
device = self.find_device(index)
|
206
|
-
self.devices[index] = device
|
207
|
-
self.set_config(device)
|
208
|
-
try:
|
209
|
-
interface = self.get_active_config(device)
|
210
|
-
self.interface[index] = interface
|
211
|
-
self.detach_kernel(device, interface)
|
212
|
-
try:
|
213
|
-
self.claim_interface(device, interface)
|
214
|
-
except ConnectionRefusedError:
|
215
|
-
# Attempting interface cycle.
|
216
|
-
self.unclaim_interface(device, interface)
|
217
|
-
self.claim_interface(device, interface)
|
218
|
-
except usb.core.USBError:
|
219
|
-
self.channel(_("Device failed during detach and claim"))
|
220
|
-
self.channel(_("USB Connected."))
|
221
|
-
return index
|
222
|
-
except usb.core.NoBackendError as e:
|
223
|
-
self.channel(str(e))
|
224
|
-
self.channel(_("PyUsb detected no backend LibUSB driver."))
|
225
|
-
return -2
|
226
|
-
except ConnectionRefusedError:
|
227
|
-
self.channel(_("Connection to USB failed.\n"))
|
228
|
-
return -1
|
229
|
-
|
230
|
-
def close(self, index=0):
|
231
|
-
"""Closes device."""
|
232
|
-
_ = self.channel._
|
233
|
-
device = self.devices.get(index)
|
234
|
-
self.channel(_("Attempting disconnection from USB."))
|
235
|
-
if device is not None:
|
236
|
-
interface = self.interface.get(index)
|
237
|
-
try:
|
238
|
-
if interface is not None:
|
239
|
-
self.disconnect_detach(device, interface)
|
240
|
-
self.unclaim_interface(device, interface)
|
241
|
-
self.disconnect_dispose(device)
|
242
|
-
self.disconnect_reset(device)
|
243
|
-
self.channel(_("USB Disconnection Successful.\n"))
|
244
|
-
del self.devices[index]
|
245
|
-
except ConnectionError:
|
246
|
-
pass
|
247
|
-
|
248
|
-
def abort(self):
|
249
|
-
pass
|
250
|
-
|
251
|
-
def write(self, index=0, data=None):
|
252
|
-
if data is None:
|
253
|
-
return
|
254
|
-
self.channel(f"USB SEND: {data}")
|
255
|
-
data_remaining = len(data)
|
256
|
-
while data_remaining > 0:
|
257
|
-
packet_length = min(0x1000, data_remaining)
|
258
|
-
packet = data[:packet_length]
|
259
|
-
try:
|
260
|
-
dev = self.devices[index]
|
261
|
-
|
262
|
-
#####################################
|
263
|
-
# Step 1: Write the size of the packet.
|
264
|
-
#####################################
|
265
|
-
# endpoint, data, timeout
|
266
|
-
|
267
|
-
length_data = struct.pack(
|
268
|
-
">h", packet_length
|
269
|
-
) # Big-endian size write out.
|
270
|
-
self.channel(f"Sending Length: {length_data}")
|
271
|
-
dev.write(
|
272
|
-
endpoint=WRITE_INTERRUPT, data=length_data, timeout=self.timeout
|
273
|
-
)
|
274
|
-
self.channel(
|
275
|
-
#####################################
|
276
|
-
# Step 2: read the confirmation value.
|
277
|
-
#####################################
|
278
|
-
# endpoint, data, timeout
|
279
|
-
self.channel(
|
280
|
-
read = dev.read(
|
281
|
-
endpoint=READ_INTERRUPT, size_or_buffer=1, timeout=self.timeout
|
282
|
-
)
|
283
|
-
self.channel(f"Confirmation: {read}")
|
284
|
-
if read[0] != 1:
|
285
|
-
time.sleep(2)
|
286
|
-
continue
|
287
|
-
|
288
|
-
#####################################
|
289
|
-
# Step #3, write the bulk data of the packet.
|
290
|
-
#####################################
|
291
|
-
# endpoint, data, timeout
|
292
|
-
self.channel(
|
293
|
-
dev.write(endpoint=WRITE_BULK, data=packet, timeout=self.timeout)
|
294
|
-
self.channel(
|
295
|
-
|
296
|
-
data = data[packet_length:]
|
297
|
-
data_remaining -= packet_length
|
298
|
-
except usb.core.USBError as e:
|
299
|
-
"""
|
300
|
-
The sending data protocol hit a core usb error. This will print the error and close and reopen the
|
301
|
-
channel.
|
302
|
-
"""
|
303
|
-
self.backend_error_code = e.backend_error_code
|
304
|
-
self.channel(str(e))
|
305
|
-
try:
|
306
|
-
self.close(index)
|
307
|
-
self.open(index)
|
308
|
-
except ConnectionError:
|
309
|
-
continue
|
310
|
-
except KeyError:
|
311
|
-
"""
|
312
|
-
Keyerrors occur because the device wasn't open to begin with and self.devices[index] failed.
|
313
|
-
"""
|
314
|
-
self.channel("Not connected.")
|
315
|
-
try:
|
316
|
-
self.close(index)
|
317
|
-
except ConnectionError:
|
318
|
-
continue
|
319
|
-
try:
|
320
|
-
self.open(index)
|
321
|
-
except ConnectionError:
|
322
|
-
continue
|
1
|
+
"""
|
2
|
+
Newly USB Connection
|
3
|
+
|
4
|
+
Performs the required interactions with the Newly backend through pyusb and libusb.
|
5
|
+
"""
|
6
|
+
import struct
|
7
|
+
import time
|
8
|
+
|
9
|
+
import usb.core
|
10
|
+
import usb.util
|
11
|
+
from usb.backend.libusb1 import LIBUSB_ERROR_ACCESS, LIBUSB_ERROR_NOT_FOUND
|
12
|
+
|
13
|
+
USB_LOCK_VENDOR = 0x0471
|
14
|
+
USB_LOCK_PRODUCT = 0x0999
|
15
|
+
|
16
|
+
WRITE_INTERRUPT = 0x01 # Is sent the size of the bulk data
|
17
|
+
READ_INTERRUPT = 0x81 # Reads 0x01 for OK
|
18
|
+
|
19
|
+
WRITE_BULK = 0x02 # Is sent entire big packet.
|
20
|
+
READ_BULK = 0x82
|
21
|
+
|
22
|
+
|
23
|
+
class USBConnection:
|
24
|
+
def __init__(self, channel):
|
25
|
+
self.channel = channel
|
26
|
+
self.devices = {}
|
27
|
+
self.interface = {}
|
28
|
+
self.backend_error_code = None
|
29
|
+
self.timeout = 2000
|
30
|
+
|
31
|
+
def find_device(self, index=0):
|
32
|
+
_ = self.channel._
|
33
|
+
self.channel(_("Using LibUSB to connect."))
|
34
|
+
self.channel(_("Finding devices."))
|
35
|
+
try:
|
36
|
+
devices = list(
|
37
|
+
usb.core.find(
|
38
|
+
idVendor=USB_LOCK_VENDOR, idProduct=USB_LOCK_PRODUCT, find_all=True
|
39
|
+
)
|
40
|
+
)
|
41
|
+
except usb.core.USBError as e:
|
42
|
+
self.backend_error_code = e.backend_error_code
|
43
|
+
|
44
|
+
self.channel(str(e))
|
45
|
+
raise ConnectionRefusedError
|
46
|
+
if len(devices) == 0:
|
47
|
+
self.channel(_("Devices Not Found."))
|
48
|
+
raise ConnectionRefusedError
|
49
|
+
for d in devices:
|
50
|
+
self.channel(_("Newly device detected:"))
|
51
|
+
string = str(d)
|
52
|
+
string = string.replace("\n", "\n\t")
|
53
|
+
self.channel(string)
|
54
|
+
try:
|
55
|
+
device = devices[index]
|
56
|
+
except IndexError:
|
57
|
+
if self.backend_error_code == LIBUSB_ERROR_ACCESS:
|
58
|
+
self.channel(_("Your OS does not give you permissions to access USB."))
|
59
|
+
raise PermissionError
|
60
|
+
elif self.backend_error_code == LIBUSB_ERROR_NOT_FOUND:
|
61
|
+
self.channel(
|
62
|
+
_(
|
63
|
+
"Newly devices were found. But something else was connected to them."
|
64
|
+
)
|
65
|
+
)
|
66
|
+
raise ConnectionRefusedError
|
67
|
+
return device
|
68
|
+
|
69
|
+
def detach_kernel(self, device, interface):
|
70
|
+
_ = self.channel._
|
71
|
+
try:
|
72
|
+
if device.is_kernel_driver_active(interface.bInterfaceNumber):
|
73
|
+
try:
|
74
|
+
self.channel(_("Attempting to detach kernel."))
|
75
|
+
device.detach_kernel_driver(interface.bInterfaceNumber)
|
76
|
+
self.channel(_("Kernel detach: Success."))
|
77
|
+
except usb.core.USBError as e:
|
78
|
+
self.backend_error_code = e.backend_error_code
|
79
|
+
|
80
|
+
self.channel(str(e))
|
81
|
+
self.channel(_("Kernel detach: Failed."))
|
82
|
+
raise ConnectionRefusedError
|
83
|
+
except NotImplementedError:
|
84
|
+
self.channel(
|
85
|
+
_("Kernel detach: Not Implemented.")
|
86
|
+
) # Driver does not permit kernel detaching.
|
87
|
+
# Non-fatal error.
|
88
|
+
|
89
|
+
def get_active_config(self, device):
|
90
|
+
_ = self.channel._
|
91
|
+
self.channel(_("Getting Active Config"))
|
92
|
+
try:
|
93
|
+
interface = device.get_active_configuration()[(0, 0)]
|
94
|
+
self.channel(_("Active Config: Success."))
|
95
|
+
return interface
|
96
|
+
except usb.core.USBError as e:
|
97
|
+
self.backend_error_code = e.backend_error_code
|
98
|
+
|
99
|
+
self.channel(str(e))
|
100
|
+
self.channel(_("Active Config: Failed."))
|
101
|
+
raise ConnectionRefusedError
|
102
|
+
|
103
|
+
def set_config(self, device):
|
104
|
+
_ = self.channel._
|
105
|
+
self.channel(_("Config Set"))
|
106
|
+
try:
|
107
|
+
device.set_configuration()
|
108
|
+
self.channel(_("Config Set: Success"))
|
109
|
+
except usb.core.USBError as e:
|
110
|
+
self.backend_error_code = e.backend_error_code
|
111
|
+
|
112
|
+
self.channel(str(e))
|
113
|
+
self.channel(
|
114
|
+
_(
|
115
|
+
"Config Set: Fail\n(Hint: may recover if you change where the USB is plugged in.)"
|
116
|
+
)
|
117
|
+
)
|
118
|
+
# raise ConnectionRefusedError
|
119
|
+
|
120
|
+
def claim_interface(self, device, interface):
|
121
|
+
_ = self.channel._
|
122
|
+
try:
|
123
|
+
self.channel(_("Attempting to claim interface."))
|
124
|
+
usb.util.claim_interface(device, interface)
|
125
|
+
self.channel(_("Interface claim: Success"))
|
126
|
+
except usb.core.USBError as e:
|
127
|
+
self.backend_error_code = e.backend_error_code
|
128
|
+
|
129
|
+
self.channel(str(e))
|
130
|
+
self.channel(_("Interface claim: Failed. (Interface is in use.)"))
|
131
|
+
raise ConnectionRefusedError
|
132
|
+
# Already in use. This is critical.
|
133
|
+
|
134
|
+
def disconnect_detach(self, device, interface):
|
135
|
+
_ = self.channel._
|
136
|
+
try:
|
137
|
+
self.channel(_("Attempting kernel attach"))
|
138
|
+
device.attach_kernel_driver(interface.bInterfaceNumber)
|
139
|
+
self.channel(_("Kernel attach: Success."))
|
140
|
+
except usb.core.USBError as e:
|
141
|
+
self.backend_error_code = e.backend_error_code
|
142
|
+
|
143
|
+
self.channel(str(e))
|
144
|
+
self.channel(_("Kernel attach: Fail."))
|
145
|
+
# Continue and hope it is non-critical.
|
146
|
+
except NotImplementedError:
|
147
|
+
self.channel(_("Kernel attach: Fail."))
|
148
|
+
|
149
|
+
def unclaim_interface(self, device, interface):
|
150
|
+
_ = self.channel._
|
151
|
+
try:
|
152
|
+
self.channel(_("Attempting to release interface."))
|
153
|
+
usb.util.release_interface(device, interface)
|
154
|
+
self.channel(_("Interface released."))
|
155
|
+
except usb.core.USBError as e:
|
156
|
+
self.backend_error_code = e.backend_error_code
|
157
|
+
|
158
|
+
self.channel(str(e))
|
159
|
+
self.channel(_("Interface did not exist."))
|
160
|
+
|
161
|
+
def disconnect_dispose(self, device):
|
162
|
+
_ = self.channel._
|
163
|
+
try:
|
164
|
+
self.channel(_("Attempting to dispose resources."))
|
165
|
+
usb.util.dispose_resources(device)
|
166
|
+
self.channel(_("Dispose Resources: Success"))
|
167
|
+
except usb.core.USBError as e:
|
168
|
+
self.backend_error_code = e.backend_error_code
|
169
|
+
|
170
|
+
self.channel(str(e))
|
171
|
+
self.channel(_("Dispose Resources: Fail"))
|
172
|
+
|
173
|
+
def disconnect_reset(self, device):
|
174
|
+
_ = self.channel._
|
175
|
+
try:
|
176
|
+
self.channel(_("Attempting USB reset."))
|
177
|
+
device.reset()
|
178
|
+
self.channel(_("USB connection reset."))
|
179
|
+
except usb.core.USBError as e:
|
180
|
+
self.backend_error_code = e.backend_error_code
|
181
|
+
|
182
|
+
self.channel(str(e))
|
183
|
+
self.channel(_("USB connection did not exist."))
|
184
|
+
|
185
|
+
def bus(self, index):
|
186
|
+
return self.devices[index].bus
|
187
|
+
|
188
|
+
def address(self, index):
|
189
|
+
return self.devices[index].address
|
190
|
+
|
191
|
+
def is_open(self, index=0):
|
192
|
+
try:
|
193
|
+
dev = self.devices[index]
|
194
|
+
if dev:
|
195
|
+
return True
|
196
|
+
except KeyError:
|
197
|
+
pass
|
198
|
+
return False
|
199
|
+
|
200
|
+
def open(self, index=0):
|
201
|
+
"""Opens device, returns index."""
|
202
|
+
_ = self.channel._
|
203
|
+
self.channel(_("Attempting connection to USB."))
|
204
|
+
try:
|
205
|
+
device = self.find_device(index)
|
206
|
+
self.devices[index] = device
|
207
|
+
self.set_config(device)
|
208
|
+
try:
|
209
|
+
interface = self.get_active_config(device)
|
210
|
+
self.interface[index] = interface
|
211
|
+
self.detach_kernel(device, interface)
|
212
|
+
try:
|
213
|
+
self.claim_interface(device, interface)
|
214
|
+
except ConnectionRefusedError:
|
215
|
+
# Attempting interface cycle.
|
216
|
+
self.unclaim_interface(device, interface)
|
217
|
+
self.claim_interface(device, interface)
|
218
|
+
except usb.core.USBError:
|
219
|
+
self.channel(_("Device failed during detach and claim"))
|
220
|
+
self.channel(_("USB Connected."))
|
221
|
+
return index
|
222
|
+
except usb.core.NoBackendError as e:
|
223
|
+
self.channel(str(e))
|
224
|
+
self.channel(_("PyUsb detected no backend LibUSB driver."))
|
225
|
+
return -2
|
226
|
+
except ConnectionRefusedError:
|
227
|
+
self.channel(_("Connection to USB failed.\n"))
|
228
|
+
return -1
|
229
|
+
|
230
|
+
def close(self, index=0):
|
231
|
+
"""Closes device."""
|
232
|
+
_ = self.channel._
|
233
|
+
device = self.devices.get(index)
|
234
|
+
self.channel(_("Attempting disconnection from USB."))
|
235
|
+
if device is not None:
|
236
|
+
interface = self.interface.get(index)
|
237
|
+
try:
|
238
|
+
if interface is not None:
|
239
|
+
self.disconnect_detach(device, interface)
|
240
|
+
self.unclaim_interface(device, interface)
|
241
|
+
self.disconnect_dispose(device)
|
242
|
+
self.disconnect_reset(device)
|
243
|
+
self.channel(_("USB Disconnection Successful.\n"))
|
244
|
+
del self.devices[index]
|
245
|
+
except ConnectionError:
|
246
|
+
pass
|
247
|
+
|
248
|
+
def abort(self):
|
249
|
+
pass
|
250
|
+
|
251
|
+
def write(self, index=0, data=None):
|
252
|
+
if data is None:
|
253
|
+
return
|
254
|
+
self.channel(f"USB SEND: {data}")
|
255
|
+
data_remaining = len(data)
|
256
|
+
while data_remaining > 0:
|
257
|
+
packet_length = min(0x1000, data_remaining)
|
258
|
+
packet = data[:packet_length]
|
259
|
+
try:
|
260
|
+
dev = self.devices[index]
|
261
|
+
|
262
|
+
#####################################
|
263
|
+
# Step 1: Write the size of the packet.
|
264
|
+
#####################################
|
265
|
+
# endpoint, data, timeout
|
266
|
+
|
267
|
+
length_data = struct.pack(
|
268
|
+
">h", packet_length
|
269
|
+
) # Big-endian size write out.
|
270
|
+
self.channel(f"Sending Length: {length_data}")
|
271
|
+
dev.write(
|
272
|
+
endpoint=WRITE_INTERRUPT, data=length_data, timeout=self.timeout
|
273
|
+
)
|
274
|
+
self.channel("Length Sent.")
|
275
|
+
#####################################
|
276
|
+
# Step 2: read the confirmation value.
|
277
|
+
#####################################
|
278
|
+
# endpoint, data, timeout
|
279
|
+
self.channel("Read Confirmation.")
|
280
|
+
read = dev.read(
|
281
|
+
endpoint=READ_INTERRUPT, size_or_buffer=1, timeout=self.timeout
|
282
|
+
)
|
283
|
+
self.channel(f"Confirmation: {read}")
|
284
|
+
if read[0] != 1:
|
285
|
+
time.sleep(2)
|
286
|
+
continue
|
287
|
+
|
288
|
+
#####################################
|
289
|
+
# Step #3, write the bulk data of the packet.
|
290
|
+
#####################################
|
291
|
+
# endpoint, data, timeout
|
292
|
+
self.channel("Writing Data")
|
293
|
+
dev.write(endpoint=WRITE_BULK, data=packet, timeout=self.timeout)
|
294
|
+
self.channel("Data Written.")
|
295
|
+
|
296
|
+
data = data[packet_length:]
|
297
|
+
data_remaining -= packet_length
|
298
|
+
except usb.core.USBError as e:
|
299
|
+
"""
|
300
|
+
The sending data protocol hit a core usb error. This will print the error and close and reopen the
|
301
|
+
channel.
|
302
|
+
"""
|
303
|
+
self.backend_error_code = e.backend_error_code
|
304
|
+
self.channel(str(e))
|
305
|
+
try:
|
306
|
+
self.close(index)
|
307
|
+
self.open(index)
|
308
|
+
except ConnectionError:
|
309
|
+
continue
|
310
|
+
except KeyError:
|
311
|
+
"""
|
312
|
+
Keyerrors occur because the device wasn't open to begin with and self.devices[index] failed.
|
313
|
+
"""
|
314
|
+
self.channel("Not connected.")
|
315
|
+
try:
|
316
|
+
self.close(index)
|
317
|
+
except ConnectionError:
|
318
|
+
continue
|
319
|
+
try:
|
320
|
+
self.open(index)
|
321
|
+
except ConnectionError:
|
322
|
+
continue
|