meerk40t 0.9.3001__py2.py3-none-any.whl → 0.9.7010__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 +1195 -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 +1844 -1507
- meerk40t/core/elements/clipboard.py +229 -219
- meerk40t/core/elements/element_treeops.py +4561 -2837
- meerk40t/core/elements/element_types.py +125 -105
- meerk40t/core/elements/elements.py +4329 -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 +933 -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/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 +462 -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 +198 -0
- meerk40t/extra/ezd.py +1165 -1165
- meerk40t/extra/hershey.py +835 -340
- meerk40t/extra/imageactions.py +322 -316
- meerk40t/extra/inkscape.py +630 -622
- meerk40t/extra/lbrn.py +424 -424
- meerk40t/extra/outerworld.py +284 -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 +1081 -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 +170 -133
- meerk40t/gui/choicepropertypanel.py +1673 -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 +1430 -846
- meerk40t/gui/icons.py +3422 -2747
- meerk40t/gui/imagesplitter.py +555 -508
- meerk40t/gui/keymap.py +354 -344
- meerk40t/gui/laserpanel.py +892 -806
- meerk40t/gui/laserrender.py +1470 -1232
- meerk40t/gui/lasertoolpanel.py +805 -793
- meerk40t/gui/magnetoptions.py +436 -0
- meerk40t/gui/materialmanager.py +2917 -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 +494 -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 +2468 -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 +589 -346
- meerk40t/gui/scenewidgets/relocatewidget.py +33 -33
- meerk40t/gui/scenewidgets/reticlewidget.py +83 -83
- meerk40t/gui/scenewidgets/selectionwidget.py +2952 -2756
- meerk40t/gui/simpleui.py +357 -333
- meerk40t/gui/simulation.py +2431 -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 +591 -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 +160 -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 +1444 -1169
- meerk40t/gui/wxmmain.py +5578 -4112
- meerk40t/gui/wxmribbon.py +1591 -1076
- meerk40t/gui/wxmscene.py +1635 -1453
- meerk40t/gui/wxmtree.py +2410 -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 +2778 -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 +3809 -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 +102 -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 +390 -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 +672 -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 +940 -940
- meerk40t/tools/rasterplotter.py +1660 -547
- meerk40t/tools/shxparser.py +989 -901
- meerk40t/tools/ttfparser.py +726 -446
- meerk40t/tools/zinglplotter.py +595 -593
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/LICENSE +21 -21
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/METADATA +150 -139
- meerk40t-0.9.7010.dist-info/RECORD +445 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/WHEEL +1 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/top_level.txt +0 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.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.7010.dist-info}/entry_points.txt +0 -0
@@ -1,301 +1,306 @@
|
|
1
|
-
"""
|
2
|
-
Galvo USB Connection
|
3
|
-
|
4
|
-
Performs the required interactions with the Galvo backend through pyusb and libusb.
|
5
|
-
"""
|
6
|
-
|
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 = 0x9588
|
14
|
-
USB_LOCK_PRODUCT = 0x9899
|
15
|
-
|
16
|
-
WRITE_ENDPOINT = 0x02 # usb.util.ENDPOINT_OUT|usb.util.ENDPOINT_TYPE_BULK
|
17
|
-
READ_ENDPOINT = 0x88
|
18
|
-
|
19
|
-
# DEBUG CODE FOR POINTING TO CH341A chip.
|
20
|
-
# USB_LOCK_VENDOR = 0x1A86 # Dev : (1a86) QinHeng Electronics
|
21
|
-
# USB_LOCK_PRODUCT = 0x5512 # (5512) CH341A
|
22
|
-
# WRITE_ENDPOINT = 0x02 # usb.util.ENDPOINT_OUT|usb.util.ENDPOINT_TYPE_BULK
|
23
|
-
# READ_ENDPOINT = 0x82
|
24
|
-
|
25
|
-
|
26
|
-
class USBConnection:
|
27
|
-
def __init__(self, channel):
|
28
|
-
self.channel = channel
|
29
|
-
self.devices = {}
|
30
|
-
self.interface = {}
|
31
|
-
self.backend_error_code = None
|
32
|
-
self.timeout = 100
|
33
|
-
|
34
|
-
def find_device(self, index=0):
|
35
|
-
_ = self.channel._
|
36
|
-
self.channel(_("Using LibUSB to connect."))
|
37
|
-
self.channel(_("Finding devices."))
|
38
|
-
try:
|
39
|
-
devices = list(
|
40
|
-
usb.core.find(
|
41
|
-
idVendor=USB_LOCK_VENDOR, idProduct=USB_LOCK_PRODUCT, find_all=True
|
42
|
-
)
|
43
|
-
)
|
44
|
-
except usb.core.USBError as e:
|
45
|
-
self.backend_error_code = e.backend_error_code
|
46
|
-
|
47
|
-
self.channel(str(e))
|
48
|
-
raise ConnectionRefusedError
|
49
|
-
if len(devices) == 0:
|
50
|
-
self.channel(_("Devices Not Found."))
|
51
|
-
raise ConnectionRefusedError
|
52
|
-
for d in devices:
|
53
|
-
self.channel(_("Galvo device detected:"))
|
54
|
-
string = str(d)
|
55
|
-
string = string.replace("\n", "\n\t")
|
56
|
-
self.channel(string)
|
57
|
-
try:
|
58
|
-
device = devices[index]
|
59
|
-
except IndexError:
|
60
|
-
if self.backend_error_code == LIBUSB_ERROR_ACCESS:
|
61
|
-
self.channel(_("Your OS does not give you permissions to access USB."))
|
62
|
-
raise PermissionError
|
63
|
-
elif self.backend_error_code == LIBUSB_ERROR_NOT_FOUND:
|
64
|
-
self.channel(
|
65
|
-
_(
|
66
|
-
"Galvo devices were found. But something else was connected to them."
|
67
|
-
)
|
68
|
-
)
|
69
|
-
else:
|
70
|
-
self.channel(
|
71
|
-
_(
|
72
|
-
"Galvo devices were found but they were rejected by device criteria in Controller."
|
73
|
-
)
|
74
|
-
)
|
75
|
-
raise ConnectionRefusedError
|
76
|
-
return device
|
77
|
-
|
78
|
-
def detach_kernel(self, device, interface):
|
79
|
-
_ = self.channel._
|
80
|
-
try:
|
81
|
-
if device.is_kernel_driver_active(interface.bInterfaceNumber):
|
82
|
-
# TODO: This can raise USBError on entity not found.
|
83
|
-
try:
|
84
|
-
self.channel(_("Attempting to detach kernel."))
|
85
|
-
device.detach_kernel_driver(interface.bInterfaceNumber)
|
86
|
-
self.channel(_("Kernel detach: Success."))
|
87
|
-
except usb.core.USBError as e:
|
88
|
-
self.backend_error_code = e.backend_error_code
|
89
|
-
|
90
|
-
self.channel(str(e))
|
91
|
-
self.channel(_("Kernel detach: Failed."))
|
92
|
-
raise ConnectionRefusedError
|
93
|
-
except NotImplementedError:
|
94
|
-
self.channel(
|
95
|
-
_("Kernel detach: Not Implemented.")
|
96
|
-
) # Driver does not permit kernel detaching.
|
97
|
-
# Non-fatal error.
|
98
|
-
|
99
|
-
def get_active_config(self, device):
|
100
|
-
_ = self.channel._
|
101
|
-
self.channel(_("Getting Active Config"))
|
102
|
-
try:
|
103
|
-
interface = device.get_active_configuration()[(0, 0)]
|
104
|
-
self.channel(_("Active Config: Success."))
|
105
|
-
return interface
|
106
|
-
except usb.core.USBError as e:
|
107
|
-
self.backend_error_code = e.backend_error_code
|
108
|
-
|
109
|
-
self.channel(str(e))
|
110
|
-
self.channel(_("Active Config: Failed."))
|
111
|
-
raise ConnectionRefusedError
|
112
|
-
|
113
|
-
def set_config(self, device):
|
114
|
-
_ = self.channel._
|
115
|
-
self.channel(_("Config Set"))
|
116
|
-
try:
|
117
|
-
device.set_configuration()
|
118
|
-
self.channel(_("Config Set: Success"))
|
119
|
-
except usb.core.USBError as e:
|
120
|
-
self.backend_error_code = e.backend_error_code
|
121
|
-
|
122
|
-
self.channel(str(e))
|
123
|
-
self.channel(
|
124
|
-
_(
|
125
|
-
"Config Set: Fail\n(Hint: may recover if you change where the USB is plugged in.)"
|
126
|
-
)
|
127
|
-
)
|
128
|
-
# raise ConnectionRefusedError
|
129
|
-
|
130
|
-
def claim_interface(self, device, interface):
|
131
|
-
_ = self.channel._
|
132
|
-
try:
|
133
|
-
self.channel(_("Attempting to claim interface."))
|
134
|
-
usb.util.claim_interface(device, interface)
|
135
|
-
self.channel(_("Interface claim: Success"))
|
136
|
-
except usb.core.USBError as e:
|
137
|
-
self.backend_error_code = e.backend_error_code
|
138
|
-
|
139
|
-
self.channel(str(e))
|
140
|
-
self.channel(_("Interface claim: Failed. (Interface is in use.)"))
|
141
|
-
raise ConnectionRefusedError
|
142
|
-
# Already in use. This is critical.
|
143
|
-
|
144
|
-
def disconnect_detach(self, device, interface):
|
145
|
-
_ = self.channel._
|
146
|
-
try:
|
147
|
-
self.channel(_("Attempting kernel attach"))
|
148
|
-
device.attach_kernel_driver(interface.bInterfaceNumber)
|
149
|
-
self.channel(_("Kernel attach: Success."))
|
150
|
-
except usb.core.USBError as e:
|
151
|
-
self.backend_error_code = e.backend_error_code
|
152
|
-
|
153
|
-
self.channel(str(e))
|
154
|
-
self.channel(_("Kernel attach: Fail."))
|
155
|
-
# Continue and hope it is non-critical.
|
156
|
-
except NotImplementedError:
|
157
|
-
self.channel(_("Kernel attach: Fail."))
|
158
|
-
|
159
|
-
def unclaim_interface(self, device, interface):
|
160
|
-
_ = self.channel._
|
161
|
-
try:
|
162
|
-
self.channel(_("Attempting to release interface."))
|
163
|
-
usb.util.release_interface(device, interface)
|
164
|
-
self.channel(_("Interface released."))
|
165
|
-
except usb.core.USBError as e:
|
166
|
-
self.backend_error_code = e.backend_error_code
|
167
|
-
|
168
|
-
self.channel(str(e))
|
169
|
-
self.channel(_("Interface did not exist."))
|
170
|
-
|
171
|
-
def disconnect_dispose(self, device):
|
172
|
-
_ = self.channel._
|
173
|
-
try:
|
174
|
-
self.channel(_("Attempting to dispose resources."))
|
175
|
-
usb.util.dispose_resources(device)
|
176
|
-
self.channel(_("Dispose Resources: Success"))
|
177
|
-
except usb.core.USBError as e:
|
178
|
-
self.backend_error_code = e.backend_error_code
|
179
|
-
|
180
|
-
self.channel(str(e))
|
181
|
-
self.channel(_("Dispose Resources: Fail"))
|
182
|
-
|
183
|
-
def disconnect_reset(self, device):
|
184
|
-
_ = self.channel._
|
185
|
-
try:
|
186
|
-
self.channel(_("Attempting USB reset."))
|
187
|
-
device.reset()
|
188
|
-
self.channel(_("USB connection reset."))
|
189
|
-
except usb.core.USBError as e:
|
190
|
-
self.backend_error_code = e.backend_error_code
|
191
|
-
|
192
|
-
self.channel(str(e))
|
193
|
-
self.channel(_("USB connection did not exist."))
|
194
|
-
|
195
|
-
def bus(self, index):
|
196
|
-
return self.devices[index].bus
|
197
|
-
|
198
|
-
def address(self, index):
|
199
|
-
return self.devices[index].address
|
200
|
-
|
201
|
-
def is_open(self, index=0):
|
202
|
-
try:
|
203
|
-
dev = self.devices[index]
|
204
|
-
if dev:
|
205
|
-
return True
|
206
|
-
except KeyError:
|
207
|
-
pass
|
208
|
-
return False
|
209
|
-
|
210
|
-
def open(self, index=0):
|
211
|
-
"""Opens device, returns index."""
|
212
|
-
_ = self.channel._
|
213
|
-
self.channel(_("Attempting connection to USB."))
|
214
|
-
try:
|
215
|
-
device = self.find_device(index)
|
216
|
-
self.devices[index] = device
|
217
|
-
self.set_config(device)
|
218
|
-
try:
|
219
|
-
interface = self.get_active_config(device)
|
220
|
-
self.interface[index] = interface
|
221
|
-
self.detach_kernel(device, interface)
|
222
|
-
try:
|
223
|
-
self.claim_interface(device, interface)
|
224
|
-
except ConnectionRefusedError:
|
225
|
-
# Attempting interface cycle.
|
226
|
-
self.unclaim_interface(device, interface)
|
227
|
-
self.claim_interface(device, interface)
|
228
|
-
except usb.core.USBError:
|
229
|
-
self.channel(_("Device failed during detach and claim"))
|
230
|
-
self.channel(_("USB Connected."))
|
231
|
-
return index
|
232
|
-
except usb.core.NoBackendError as e:
|
233
|
-
self.channel(str(e))
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
1
|
+
"""
|
2
|
+
Galvo USB Connection
|
3
|
+
|
4
|
+
Performs the required interactions with the Galvo backend through pyusb and libusb.
|
5
|
+
"""
|
6
|
+
|
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 = 0x9588
|
14
|
+
USB_LOCK_PRODUCT = 0x9899
|
15
|
+
|
16
|
+
WRITE_ENDPOINT = 0x02 # usb.util.ENDPOINT_OUT|usb.util.ENDPOINT_TYPE_BULK
|
17
|
+
READ_ENDPOINT = 0x88
|
18
|
+
|
19
|
+
# DEBUG CODE FOR POINTING TO CH341A chip.
|
20
|
+
# USB_LOCK_VENDOR = 0x1A86 # Dev : (1a86) QinHeng Electronics
|
21
|
+
# USB_LOCK_PRODUCT = 0x5512 # (5512) CH341A
|
22
|
+
# WRITE_ENDPOINT = 0x02 # usb.util.ENDPOINT_OUT|usb.util.ENDPOINT_TYPE_BULK
|
23
|
+
# READ_ENDPOINT = 0x82
|
24
|
+
|
25
|
+
|
26
|
+
class USBConnection:
|
27
|
+
def __init__(self, channel):
|
28
|
+
self.channel = channel
|
29
|
+
self.devices = {}
|
30
|
+
self.interface = {}
|
31
|
+
self.backend_error_code = None
|
32
|
+
self.timeout = 100
|
33
|
+
|
34
|
+
def find_device(self, index=0):
|
35
|
+
_ = self.channel._
|
36
|
+
self.channel(_("Using LibUSB to connect."))
|
37
|
+
self.channel(_("Finding devices."))
|
38
|
+
try:
|
39
|
+
devices = list(
|
40
|
+
usb.core.find(
|
41
|
+
idVendor=USB_LOCK_VENDOR, idProduct=USB_LOCK_PRODUCT, find_all=True
|
42
|
+
)
|
43
|
+
)
|
44
|
+
except usb.core.USBError as e:
|
45
|
+
self.backend_error_code = e.backend_error_code
|
46
|
+
|
47
|
+
self.channel(str(e))
|
48
|
+
raise ConnectionRefusedError
|
49
|
+
if len(devices) == 0:
|
50
|
+
self.channel(_("Devices Not Found."))
|
51
|
+
raise ConnectionRefusedError
|
52
|
+
for d in devices:
|
53
|
+
self.channel(_("Galvo device detected:"))
|
54
|
+
string = str(d)
|
55
|
+
string = string.replace("\n", "\n\t")
|
56
|
+
self.channel(string)
|
57
|
+
try:
|
58
|
+
device = devices[index]
|
59
|
+
except IndexError:
|
60
|
+
if self.backend_error_code == LIBUSB_ERROR_ACCESS:
|
61
|
+
self.channel(_("Your OS does not give you permissions to access USB."))
|
62
|
+
raise PermissionError
|
63
|
+
elif self.backend_error_code == LIBUSB_ERROR_NOT_FOUND:
|
64
|
+
self.channel(
|
65
|
+
_(
|
66
|
+
"Galvo devices were found. But something else was connected to them."
|
67
|
+
)
|
68
|
+
)
|
69
|
+
else:
|
70
|
+
self.channel(
|
71
|
+
_(
|
72
|
+
"Galvo devices were found but they were rejected by device criteria in Controller."
|
73
|
+
)
|
74
|
+
)
|
75
|
+
raise ConnectionRefusedError
|
76
|
+
return device
|
77
|
+
|
78
|
+
def detach_kernel(self, device, interface):
|
79
|
+
_ = self.channel._
|
80
|
+
try:
|
81
|
+
if device.is_kernel_driver_active(interface.bInterfaceNumber):
|
82
|
+
# TODO: This can raise USBError on entity not found.
|
83
|
+
try:
|
84
|
+
self.channel(_("Attempting to detach kernel."))
|
85
|
+
device.detach_kernel_driver(interface.bInterfaceNumber)
|
86
|
+
self.channel(_("Kernel detach: Success."))
|
87
|
+
except usb.core.USBError as e:
|
88
|
+
self.backend_error_code = e.backend_error_code
|
89
|
+
|
90
|
+
self.channel(str(e))
|
91
|
+
self.channel(_("Kernel detach: Failed."))
|
92
|
+
raise ConnectionRefusedError
|
93
|
+
except NotImplementedError:
|
94
|
+
self.channel(
|
95
|
+
_("Kernel detach: Not Implemented.")
|
96
|
+
) # Driver does not permit kernel detaching.
|
97
|
+
# Non-fatal error.
|
98
|
+
|
99
|
+
def get_active_config(self, device):
|
100
|
+
_ = self.channel._
|
101
|
+
self.channel(_("Getting Active Config"))
|
102
|
+
try:
|
103
|
+
interface = device.get_active_configuration()[(0, 0)]
|
104
|
+
self.channel(_("Active Config: Success."))
|
105
|
+
return interface
|
106
|
+
except usb.core.USBError as e:
|
107
|
+
self.backend_error_code = e.backend_error_code
|
108
|
+
|
109
|
+
self.channel(str(e))
|
110
|
+
self.channel(_("Active Config: Failed."))
|
111
|
+
raise ConnectionRefusedError
|
112
|
+
|
113
|
+
def set_config(self, device):
|
114
|
+
_ = self.channel._
|
115
|
+
self.channel(_("Config Set"))
|
116
|
+
try:
|
117
|
+
device.set_configuration()
|
118
|
+
self.channel(_("Config Set: Success"))
|
119
|
+
except usb.core.USBError as e:
|
120
|
+
self.backend_error_code = e.backend_error_code
|
121
|
+
|
122
|
+
self.channel(str(e))
|
123
|
+
self.channel(
|
124
|
+
_(
|
125
|
+
"Config Set: Fail\n(Hint: may recover if you change where the USB is plugged in.)"
|
126
|
+
)
|
127
|
+
)
|
128
|
+
# raise ConnectionRefusedError
|
129
|
+
|
130
|
+
def claim_interface(self, device, interface):
|
131
|
+
_ = self.channel._
|
132
|
+
try:
|
133
|
+
self.channel(_("Attempting to claim interface."))
|
134
|
+
usb.util.claim_interface(device, interface)
|
135
|
+
self.channel(_("Interface claim: Success"))
|
136
|
+
except usb.core.USBError as e:
|
137
|
+
self.backend_error_code = e.backend_error_code
|
138
|
+
|
139
|
+
self.channel(str(e))
|
140
|
+
self.channel(_("Interface claim: Failed. (Interface is in use.)"))
|
141
|
+
raise ConnectionRefusedError
|
142
|
+
# Already in use. This is critical.
|
143
|
+
|
144
|
+
def disconnect_detach(self, device, interface):
|
145
|
+
_ = self.channel._
|
146
|
+
try:
|
147
|
+
self.channel(_("Attempting kernel attach"))
|
148
|
+
device.attach_kernel_driver(interface.bInterfaceNumber)
|
149
|
+
self.channel(_("Kernel attach: Success."))
|
150
|
+
except usb.core.USBError as e:
|
151
|
+
self.backend_error_code = e.backend_error_code
|
152
|
+
|
153
|
+
self.channel(str(e))
|
154
|
+
self.channel(_("Kernel attach: Fail."))
|
155
|
+
# Continue and hope it is non-critical.
|
156
|
+
except NotImplementedError:
|
157
|
+
self.channel(_("Kernel attach: Fail."))
|
158
|
+
|
159
|
+
def unclaim_interface(self, device, interface):
|
160
|
+
_ = self.channel._
|
161
|
+
try:
|
162
|
+
self.channel(_("Attempting to release interface."))
|
163
|
+
usb.util.release_interface(device, interface)
|
164
|
+
self.channel(_("Interface released."))
|
165
|
+
except usb.core.USBError as e:
|
166
|
+
self.backend_error_code = e.backend_error_code
|
167
|
+
|
168
|
+
self.channel(str(e))
|
169
|
+
self.channel(_("Interface did not exist."))
|
170
|
+
|
171
|
+
def disconnect_dispose(self, device):
|
172
|
+
_ = self.channel._
|
173
|
+
try:
|
174
|
+
self.channel(_("Attempting to dispose resources."))
|
175
|
+
usb.util.dispose_resources(device)
|
176
|
+
self.channel(_("Dispose Resources: Success"))
|
177
|
+
except usb.core.USBError as e:
|
178
|
+
self.backend_error_code = e.backend_error_code
|
179
|
+
|
180
|
+
self.channel(str(e))
|
181
|
+
self.channel(_("Dispose Resources: Fail"))
|
182
|
+
|
183
|
+
def disconnect_reset(self, device):
|
184
|
+
_ = self.channel._
|
185
|
+
try:
|
186
|
+
self.channel(_("Attempting USB reset."))
|
187
|
+
device.reset()
|
188
|
+
self.channel(_("USB connection reset."))
|
189
|
+
except usb.core.USBError as e:
|
190
|
+
self.backend_error_code = e.backend_error_code
|
191
|
+
|
192
|
+
self.channel(str(e))
|
193
|
+
self.channel(_("USB connection did not exist."))
|
194
|
+
|
195
|
+
def bus(self, index):
|
196
|
+
return self.devices[index].bus
|
197
|
+
|
198
|
+
def address(self, index):
|
199
|
+
return self.devices[index].address
|
200
|
+
|
201
|
+
def is_open(self, index=0):
|
202
|
+
try:
|
203
|
+
dev = self.devices[index]
|
204
|
+
if dev:
|
205
|
+
return True
|
206
|
+
except KeyError:
|
207
|
+
pass
|
208
|
+
return False
|
209
|
+
|
210
|
+
def open(self, index=0):
|
211
|
+
"""Opens device, returns index."""
|
212
|
+
_ = self.channel._
|
213
|
+
self.channel(_("Attempting connection to USB."))
|
214
|
+
try:
|
215
|
+
device = self.find_device(index)
|
216
|
+
self.devices[index] = device
|
217
|
+
self.set_config(device)
|
218
|
+
try:
|
219
|
+
interface = self.get_active_config(device)
|
220
|
+
self.interface[index] = interface
|
221
|
+
self.detach_kernel(device, interface)
|
222
|
+
try:
|
223
|
+
self.claim_interface(device, interface)
|
224
|
+
except ConnectionRefusedError:
|
225
|
+
# Attempting interface cycle.
|
226
|
+
self.unclaim_interface(device, interface)
|
227
|
+
self.claim_interface(device, interface)
|
228
|
+
except usb.core.USBError:
|
229
|
+
self.channel(_("Device failed during detach and claim"))
|
230
|
+
self.channel(_("USB Connected."))
|
231
|
+
return index
|
232
|
+
except usb.core.NoBackendError as e:
|
233
|
+
self.channel(str(e))
|
234
|
+
from platform import system
|
235
|
+
osname = system()
|
236
|
+
if osname == "Windows":
|
237
|
+
self.channel(_("Did you install the libusb driver via Zadig (https://zadig.akeo.ie/)?"))
|
238
|
+
self.channel(_("Consult the wiki: https://github.com/meerk40t/meerk40t/wiki/Install%3A-Windows"))
|
239
|
+
self.channel(_("PyUsb detected no backend LibUSB driver."))
|
240
|
+
return -2
|
241
|
+
except ConnectionRefusedError:
|
242
|
+
self.channel(_("Connection to USB failed.\n"))
|
243
|
+
return -1
|
244
|
+
|
245
|
+
def close(self, index=0):
|
246
|
+
"""Closes device."""
|
247
|
+
_ = self.channel._
|
248
|
+
device = self.devices.get(index)
|
249
|
+
self.channel(_("Attempting disconnection from USB."))
|
250
|
+
if device is not None:
|
251
|
+
interface = self.interface.get(index)
|
252
|
+
try:
|
253
|
+
if interface is not None:
|
254
|
+
self.disconnect_detach(device, interface)
|
255
|
+
self.unclaim_interface(device, interface)
|
256
|
+
self.disconnect_dispose(device)
|
257
|
+
self.disconnect_reset(device)
|
258
|
+
self.channel(_("USB Disconnection Successful.\n"))
|
259
|
+
del self.devices[index]
|
260
|
+
except ConnectionError:
|
261
|
+
pass
|
262
|
+
|
263
|
+
def write(self, index=0, packet=None, attempt=0):
|
264
|
+
packet_length = len(packet)
|
265
|
+
assert packet_length == 0xC or packet_length == 0xC00
|
266
|
+
if packet is not None:
|
267
|
+
try:
|
268
|
+
# endpoint, data, timeout
|
269
|
+
self.devices[index].write(
|
270
|
+
endpoint=WRITE_ENDPOINT, data=packet, timeout=self.timeout
|
271
|
+
)
|
272
|
+
except usb.core.USBError as e:
|
273
|
+
if attempt <= 3:
|
274
|
+
try:
|
275
|
+
self.close(index)
|
276
|
+
self.open(index)
|
277
|
+
except ConnectionError:
|
278
|
+
time.sleep(1)
|
279
|
+
self.write(index, packet, attempt + 1)
|
280
|
+
return
|
281
|
+
self.backend_error_code = e.backend_error_code
|
282
|
+
|
283
|
+
self.channel(str(e))
|
284
|
+
raise ConnectionError
|
285
|
+
except KeyError:
|
286
|
+
raise ConnectionError("Not Connected.")
|
287
|
+
|
288
|
+
def read(self, index=0, attempt=0):
|
289
|
+
try:
|
290
|
+
return self.devices[index].read(
|
291
|
+
endpoint=READ_ENDPOINT, size_or_buffer=8, timeout=self.timeout
|
292
|
+
)
|
293
|
+
except usb.core.USBError as e:
|
294
|
+
if attempt <= 3:
|
295
|
+
try:
|
296
|
+
self.close(index)
|
297
|
+
self.open(index)
|
298
|
+
except ConnectionError:
|
299
|
+
time.sleep(1)
|
300
|
+
return self.read(index, attempt + 1)
|
301
|
+
self.backend_error_code = e.backend_error_code
|
302
|
+
|
303
|
+
self.channel(str(e))
|
304
|
+
raise ConnectionError
|
305
|
+
except KeyError:
|
306
|
+
raise ConnectionError("Not Connected.")
|
meerk40t/camera/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
name = "camera"
|
1
|
+
name = "camera"
|