Initial commit
This commit is contained in:
12
.gitignore
vendored
Executable file
12
.gitignore
vendored
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
# Node
|
||||||
|
node_modules
|
||||||
|
npm-debug.log
|
||||||
|
yarn-debug.log
|
||||||
|
yarn-error.log
|
||||||
|
pnpm-debug.log
|
||||||
|
coverage
|
||||||
|
dist
|
||||||
|
build
|
||||||
|
.env
|
||||||
|
.env.
|
||||||
|
.DS_Store
|
||||||
2
CallCode.bat
Executable file
2
CallCode.bat
Executable file
@@ -0,0 +1,2 @@
|
|||||||
|
code .
|
||||||
|
exit
|
||||||
28
GCodeFiles/log.gcode
Executable file
28
GCodeFiles/log.gcode
Executable file
@@ -0,0 +1,28 @@
|
|||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e0.00 t176148132360 f1000;!
|
||||||
|
G90 G1 x-50 y300 z0 a131.25 b-90.00 c0.00 e0.00 t176148136260 f1000
|
||||||
|
G90 G1 x-128.5 y410 z-11 a134.11 b-90.00 c9.74 e-57.30 t176148145060 f1000
|
||||||
|
G90 G1 x-128.5 y410 z-11 a134.11 b-90.00 c9.74 e62.45 t176148148860 f1000
|
||||||
|
G90 G1 x-128.5 y410 z35 a134.11 b-90.00 c9.74 e62.45 t176148149240 f1000
|
||||||
|
G90 G1 x-128.5 y410 z35 a163.90 b-90.00 c9.74 e62.45 t176148149980 f1000
|
||||||
|
G90 G1 x-128.5 y410 z35 a84.84 b-90.00 c9.74 e62.45 t176148150690 f1000
|
||||||
|
G90 G1 x-128.5 y410 z-21 a84.84 b-88.85 c9.74 e62.45 t176148152270 f1000
|
||||||
|
G90 G1 x-128.5 y410 z-21 a84.84 b-88.85 c9.74 e-59.59 t176148152820 f1000
|
||||||
|
G90 G1 x-128.5 y410 z65 a84.84 b-88.85 c9.74 e-59.59 t176148159940 f1000
|
||||||
|
G90 G1 x-47 y410 z65 a84.84 b-88.85 c9.74 e-59.59 t176148160630 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e-59.59 t176148160830 f1000
|
||||||
|
G90 G1 x-130.5 y349 z24 a90.00 b-90.00 c0.00 e-59.59 t176148225410 f1000
|
||||||
|
G90 G1 x-130.5 y429 z-25.5 a90.00 b-90.00 c0.00 e-59.59 t176148229060 f1000
|
||||||
|
G90 G1 x-128 y429 z-25.5 a90.00 b-90.00 c0.00 e-24.64 t176148231270 f1000
|
||||||
|
G90 G1 x-125.5 y429 z-25.5 a90.00 b-90.00 c0.00 e-24.64 t176148231800 f1000
|
||||||
|
G90 G1 x-125.5 y429 z-25.5 a90.00 b-90.00 c0.00 e47.55 t176148233380 f1000
|
||||||
|
G90 G1 x-125.5 y429 z42 a90.00 b-90.00 c0.00 e47.55 t176148234250 f1000
|
||||||
|
G90 G1 x-125.5 y429 z42 a90.00 b-90.00 c99.12 e47.55 t176148239130 f1000
|
||||||
|
G90 G1 x-125.5 y429 z42 a90.00 b-90.00 c193.09 e47.55 t176148241640 f1000
|
||||||
|
G90 G1 x-125.5 y429 z-52 a90.00 b-90.00 c193.09 e47.55 t176148245260 f1000
|
||||||
|
G90 G1 x-125.5 y429 z-52 a90.00 b-90.00 c193.09 e-100.85 t176148247310 f1000
|
||||||
|
G90 G1 x-125.5 y369 z-52 a90.00 b-90.00 c193.09 e-100.85 t176148248360 f1000
|
||||||
|
G90 G1 x-125.5 y369 z87.5 a90.00 b-90.00 c193.09 e-100.85 t176148249370 f1000
|
||||||
|
G90 G1 x-37 y369 z87.5 a90.00 b-90.00 c193.09 e-100.85 t176148250020 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e-100.85 t176148250630 f1000
|
||||||
|
G90 G1 x0 y614 z0 a-90.00 b90.00 c0.00 e0.00 t176242679300 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e0.00 t176244052830 f1000
|
||||||
7
GCodeFiles/log_2025_09_24.gcode
Executable file
7
GCodeFiles/log_2025_09_24.gcode
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
G90 G1 x0 y300 z0 a1.5707963267948966 b-1.5707963267948966 c0 e1.440000000000001 f1000
|
||||||
|
G90 G1 x-252 y552 z-9 a1.5707963267948966 b-1.5707963267948966 c-0.03 e0.15999999999999992 f1000
|
||||||
|
G90 G1 x-252 y552 z-9 a1.5707963267948966 b-1.5707963267948966 c-0.03 e1.1000000000000008 f1000
|
||||||
|
G90 G1 x-252 y519 z24 a1.5707963267948966 b-1.5707963267948966 c-0.03 e1.1000000000000008 f1000
|
||||||
|
G90 G1 x0 y300 z0 a1.5707963267948966 b-1.5707963267948966 c0 e-0.6900000000000004 f1000;!
|
||||||
|
G90 G1 x-453 y462 z-3 a1.5707963267948966 b-1.5707963267948966 c0 e-1.7000000000000013 f1000
|
||||||
|
G90 G1 x-546 y486 z0 a1.5707963267948966 b-1.5707963267948966 c0.09 e-3.5400000000000142 f1000
|
||||||
10
GCodeFiles/log_2025_10_04_08_00.gcode
Executable file
10
GCodeFiles/log_2025_10_04_08_00.gcode
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
G90 G1 x0 y494 z0 a-90.00 b90.00 c0.00 e0.00 t175951009710 f1000;!
|
||||||
|
G90 G1 x0 y484 z100 a-90.00 b90.00 c0.00 e0.00 t175951010790 f1000
|
||||||
|
G90 G1 x-150 y484 z110 a-90.00 b90.00 c0.00 e0.00 t175951011430 f1000
|
||||||
|
G90 G1 x-160 y484 z-170 a-90.00 b90.00 c0.00 e0.00 t175951012370 f1000
|
||||||
|
G90 G1 x0 y564 z0 a-90.00 b90.00 c0.00 e0.00 t175951074020 f1000
|
||||||
|
G90 G1 x-150 y484 z110 a-45.00 b90.00 c0.00 e0.90 t175951083030 f1000
|
||||||
|
G90 G1 x-150 y484 z110 a-80.00 b90.00 c0.00 e0.90 t175951083030 f1000
|
||||||
|
G90 G1 x-150 y484 z110 a-90.00 b80.00 c0.00 e0.90 t175951083030 f1000
|
||||||
|
G90 G1 x-150 y484 z110 a-90.00 b20.00 c0.00 e0.90 t175951083030 f1000
|
||||||
|
G90 G1 x-150 y484 z110 a-90.00 b90.00 c0.00 e0.90 t175951083030 f1000
|
||||||
11
GCodeFiles/log_2025_10_04_10_19.gcode
Executable file
11
GCodeFiles/log_2025_10_04_10_19.gcode
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e-0.5729577951308232 t175956572230 f1000
|
||||||
|
G90 G1 x331 y367 z0 a90.00 b-90.00 c0.92 e-110.00789666511805 t175956577860 f1000
|
||||||
|
G90 G1 x324 y457 z-0.5 a90.00 b-90.00 c0.69 e-110.00789666511805 t175956580600 f1000
|
||||||
|
G90 G1 x324 y457 z-0.5 a90.00 b-90.00 c0.69 e7.448451336700702 t175956581720 f1000
|
||||||
|
G90 G1 x324 y457 z39.5 a90.00 b-90.00 c0.69 e7.448451336700702 t175956582450 f1000
|
||||||
|
G90 G1 x154 y457 z39.5 a90.00 b-90.00 c0.69 e7.448451336700702 t175956583410 f1000
|
||||||
|
G90 G1 x154 y457 z-0.5 a90.00 b-90.00 c0.69 e7.448451336700702 t175956584470 f1000
|
||||||
|
G90 G1 x154 y457 z-0.5 a90.00 b-90.00 c0.69 e-104.27831871380984 t175956585230 f1000
|
||||||
|
G90 G1 x154 y387 z-0.5 a90.00 b-90.00 c0.69 e-104.27831871380984 t175956586680 f1000;!
|
||||||
|
G90 G1 x154 y387 z-0.5 a90.00 b-90.00 c0.69 e-104.27831871380984 t175956586880 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e-104.27831871380984 t175956587360 f1000
|
||||||
12
GCodeFiles/log_2025_10_04_10_25.gcode
Executable file
12
GCodeFiles/log_2025_10_04_10_25.gcode
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
G90 G1 x0 y614 z0 a-90.00 b90.00 c0.00 e0 t175956601400 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e0 t175956605160 f1000
|
||||||
|
G90 G1 x310 y300 z0 a90.00 b-90.00 c0.00 e-90.52733163067008 t175956609050 f1000
|
||||||
|
G90 G1 x310 y444 z0.5 a90.00 b-90.00 c0.00 e-90.52733163067008 t175956610430 f1000
|
||||||
|
G90 G1 x310 y444 z0.5 a90.00 b-90.00 c0.00 e6.875493541569878 t175956611220 f1000;!
|
||||||
|
G90 G1 x310 y444 z30.5 a90.00 b-90.00 c0.00 e6.875493541569878 t175956611850 f1000
|
||||||
|
G90 G1 x140 y522 z30.5 a90.00 b-90.00 c0.00 e6.875493541569878 t175956614060 f1000
|
||||||
|
G90 G1 x140 y522 z0.5 a90.00 b-90.00 c0.00 e6.875493541569878 t175956614840 f1000
|
||||||
|
G90 G1 x140 y522 z0.5 a90.00 b-90.00 c0.00 e6.875493541569878 t175956614980 f1000
|
||||||
|
G90 G1 x140 y522 z0.5 a90.00 b-90.00 c0.00 e-134.07212406061262 t175956616500 f1000
|
||||||
|
G90 G1 x140 y432 z0.5 a90.00 b-90.00 c0.00 e-134.07212406061262 t175956617150 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e-134.07212406061262 t175956618030 f1000
|
||||||
13
GCodeFiles/log_2025_10_04_10_41_Video.gcode
Executable file
13
GCodeFiles/log_2025_10_04_10_41_Video.gcode
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
G90 G1 x0 y614 z0 a-90.00 b90.00 c0.00 e0 t175956635500 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e0 t175956639660 f1000;!
|
||||||
|
G90 G1 x344 y381 z3 a90.00 b-90.00 c0.00 e-86.51662706475432 t175956675210 f1000
|
||||||
|
G90 G1 x340.5 y439 z-13.5 a90.00 b-90.00 c7.33 e-86.51662706475432 t175956700440 f1000
|
||||||
|
G90 G1 x340.5 y439 z-13.5 a90.00 b-90.00 c7.33 e28.64788975654116 t175956701790 f1000
|
||||||
|
G90 G1 x335 y439 z16.5 a90.00 b-90.00 c7.33 e28.64788975654116 t175956703230 f1000
|
||||||
|
G90 G1 x258 y351.5 z-13 a90.00 b-90.00 c7.33 e28.64788975654116 t175956705480 f1000
|
||||||
|
G90 G1 x258 y351.5 z-22.5 a90.00 b-90.00 c7.33 e28.64788975654116 t175956705860 f1000
|
||||||
|
G90 G1 x258 y351.5 z-22.5 a90.00 b-90.00 c7.33 e-10.313240312354818 t175956706520 f1000
|
||||||
|
G90 G1 x258 y351.5 z-22.5 a90.00 b-90.00 c7.33 e-56.7228217179515 t175956706810 f1000
|
||||||
|
G90 G1 x258 y291.5 z-22.5 a90.00 b-90.00 c7.33 e-56.7228217179515 t175956707740 f1000
|
||||||
|
G90 G1 x148 y291.5 z-22.5 a90.00 b-90.00 c7.33 e-56.7228217179515 t175956708830 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e-56.7228217179515 t175956709250 f1000
|
||||||
14
GCodeFiles/log_2025_10_04_11_08_Video_B.gcode
Executable file
14
GCodeFiles/log_2025_10_04_11_08_Video_B.gcode
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
G90 G1 x0 y614 z0 a-90.00 b90.00 c0.00 e0 t175956787570 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e3.437746770784939 t175956774430 f1000
|
||||||
|
G90 G1 x327.5 y300 z1 a90.00 b-90.00 c0.00 e3.437746770784939 t175956780360 f1000
|
||||||
|
G90 G1 x327.5 y300 z1 a90.00 b-90.00 c0.00 e-70.47380880109127 t175956876210 f1000
|
||||||
|
G90 G1 x330.5 y359 z2 a90.00 b-90.00 c0.00 e-99.12169855763241 t175956877430 f1000
|
||||||
|
G90 G1 x330.5 y424 z-21 a90.00 b-90.00 c0.00 e-99.12169855763241 t175956878370 f1000
|
||||||
|
G90 G1 x330.5 y424 z-21 a90.00 b-90.00 c0.00 e16.615776058793873 t175956879310 f1000
|
||||||
|
G90 G1 x330.5 y424.5 z7.5 a90.00 b-90.00 c0.00 e16.615776058793873 t175956880010 f1000
|
||||||
|
G90 G1 x218 y371.5 z1.5 a90.00 b-90.00 c0.00 e16.615776058793873 t175956881440 f1000;!
|
||||||
|
G90 G1 x218 y371.5 z-23 a90.00 b-90.00 c0.00 e16.615776058793873 t175956881830 f1000
|
||||||
|
G90 G1 x218 y371.5 z-23 a90.00 b-90.00 c0.00 e-71.6197243913529 t175956882260 f1000
|
||||||
|
G90 G1 x218 y371.5 z-23 a90.00 b-90.00 c0.00 e-114.59155902616465 t175956882730 f1000
|
||||||
|
G90 G1 x218 y332 z-23 a90.00 b-90.00 c0.00 e-114.59155902616465 t175956883210 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e-114.59155902616465 t175956884110 f1000
|
||||||
11
GCodeFiles/log_2025_10_04_15_VideoC.gcode
Executable file
11
GCodeFiles/log_2025_10_04_15_VideoC.gcode
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
G90 G1 x0 y614 z0 a-90.00 b90.00 c0.00 e0 t175956909920 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e98.54 t175956909240 f1000
|
||||||
|
G90 G1 x351.5 y300 z0 a90.00 b-90.00 c0.00 e-30.94 t175958048770 f1000
|
||||||
|
G90 G1 x353 y372 z-22 a90.00 b-90.00 c0.00 e-30.94 t175958180520 f1000;!
|
||||||
|
G90 G1 x353 y415 z-34 a90.00 b-90.00 c0.00 e-30.94 t175958181460 f1000
|
||||||
|
G90 G1 x353 y415 z-34 a90.00 b-90.00 c0.00 e41.25 t175958182110 f1000
|
||||||
|
G90 G1 x353 y415 z-9.5 a90.00 b-90.00 c2.29 e41.25 t175958182340 f1000
|
||||||
|
G90 G1 x227 y360.5 z-9.5 a90.00 b-90.00 c2.29 e41.25 t175958183180 f1000
|
||||||
|
G90 G1 x227 y360.5 z-38.5 a90.00 b-90.00 c2.29 e41.25 t175958183580 f1000
|
||||||
|
G90 G1 x227 y360.5 z-38.5 a90.00 b-90.00 c2.29 e-13.75 t175958183940 f1000
|
||||||
|
G90 G1 x227 y327 z-38.5 a90.00 b-90.00 c2.29 e-13.75 t175958184280 f1000
|
||||||
14
GCodeFiles/log_2025_10_05_Besteck_Spuehlmaschiene.gcode
Executable file
14
GCodeFiles/log_2025_10_05_Besteck_Spuehlmaschiene.gcode
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e0.00 t175966771100 f1000
|
||||||
|
G90 G1 x372 y300.5 z0 a90.00 b-90.00 c0.00 e0.00 t175966792050 f1000
|
||||||
|
G90 G1 x278.5 y387 z0 a90.00 b-90.00 c0.00 e0.00 t175966887270 f1000
|
||||||
|
G90 G1 x278.5 y387 z0 a90.00 b5.11 c79.07 e0.00 t175966931530 f1000
|
||||||
|
G90 G1 x369 y333 z-164.5 a90.00 b5.11 c75.63 e-80.21 t175966934480 f1000
|
||||||
|
G90 G1 x369 y329 z-205.5 a90.00 b5.11 c75.63 e-80.21 t175966935090 f1000
|
||||||
|
G90 G1 x369 y329 z-196.5 a90.00 b5.11 c75.63 e-80.21 t175966935460 f1000
|
||||||
|
G90 G1 x369 y329 z-196.5 a90.00 b5.11 c75.63 e87.09 t175966936320 f1000
|
||||||
|
G90 G1 x369 y329 z-42.5 a90.00 b5.11 c75.63 e87.09 t175966937040 f1000
|
||||||
|
G90 G1 x-166.5 y329 z-42.5 a90.00 b5.11 c-19.48 e87.09 t175966939400 f1000
|
||||||
|
G90 G1 x-190.5 y329 z-141 a90.00 b5.11 c1.15 e87.09 t175966940480 f1000
|
||||||
|
G90 G1 x-190.5 y329 z-167 a90.00 b5.11 c1.15 e87.09 t175966940890 f1000
|
||||||
|
G90 G1 x-190.5 y334.5 z-127 a90.00 b5.11 c1.15 e-6.30 t175966947680 f1000
|
||||||
|
G90 G1 x90 y375 z0 a90.00 b-1.76 c0.00 e-63.02 t175966965130 f1000;!
|
||||||
10
GCodeFiles/log_2025_10_26_gespeichertes_Programm_0.gcode
Executable file
10
GCodeFiles/log_2025_10_26_gespeichertes_Programm_0.gcode
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e0.00 t176147975780 f1000;!
|
||||||
|
G90 G1 x1.5 y388.5 z-57.5 a90.00 b-90.00 c0.00 e-52.71 t176147986400 f1000
|
||||||
|
G90 G1 x1.5 y388.5 z-57.5 a90.00 b-90.00 c0.00 e53.29 t176147988990 f1000
|
||||||
|
G90 G1 x1.5 y392 z-39.5 a90.00 b-90.00 c0.00 e53.29 t176147989660 f1000
|
||||||
|
G90 G1 x1.5 y392 z-22.5 a90.00 b-90.00 c0.00 e53.29 t176147989940 f1000
|
||||||
|
G90 G1 x-66.5 y392 z-22.5 a90.00 b-90.00 c0.00 e53.29 t176147990550 f1000
|
||||||
|
G90 G1 x-66.5 y492.5 z-65 a90.00 b-90.00 c0.00 e53.29 t176147992450 f1000
|
||||||
|
G90 G1 x-66.5 y492.5 z-65 a90.00 b-90.00 c0.00 e-64.17 t176147993590 f1000
|
||||||
|
G90 G1 x-66.5 y387 z-65 a90.00 b-90.00 c0.00 e-64.17 t176147994590 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e-64.17 t176147995090 f1000
|
||||||
26
GCodeFiles/log_2025_10_29.gcode
Executable file
26
GCodeFiles/log_2025_10_29.gcode
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e0.00 t176148132360 f1000;!
|
||||||
|
G90 G1 x-50 y300 z0 a131.25 b-90.00 c0.00 e0.00 t176148136260 f1000
|
||||||
|
G90 G1 x-128.5 y410 z-11 a134.11 b-90.00 c9.74 e-57.30 t176148145060 f1000
|
||||||
|
G90 G1 x-128.5 y410 z-11 a134.11 b-90.00 c9.74 e62.45 t176148148860 f1000
|
||||||
|
G90 G1 x-128.5 y410 z35 a134.11 b-90.00 c9.74 e62.45 t176148149240 f1000
|
||||||
|
G90 G1 x-128.5 y410 z35 a163.90 b-90.00 c9.74 e62.45 t176148149980 f1000
|
||||||
|
G90 G1 x-128.5 y410 z35 a84.84 b-90.00 c9.74 e62.45 t176148150690 f1000
|
||||||
|
G90 G1 x-128.5 y410 z-21 a84.84 b-88.85 c9.74 e62.45 t176148152270 f1000
|
||||||
|
G90 G1 x-128.5 y410 z-21 a84.84 b-88.85 c9.74 e-59.59 t176148152820 f1000
|
||||||
|
G90 G1 x-128.5 y410 z65 a84.84 b-88.85 c9.74 e-59.59 t176148159940 f1000
|
||||||
|
G90 G1 x-47 y410 z65 a84.84 b-88.85 c9.74 e-59.59 t176148160630 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e-59.59 t176148160830 f1000
|
||||||
|
G90 G1 x-130.5 y349 z24 a90.00 b-90.00 c0.00 e-59.59 t176148225410 f1000
|
||||||
|
G90 G1 x-130.5 y429 z-25.5 a90.00 b-90.00 c0.00 e-59.59 t176148229060 f1000
|
||||||
|
G90 G1 x-128 y429 z-25.5 a90.00 b-90.00 c0.00 e-24.64 t176148231270 f1000
|
||||||
|
G90 G1 x-125.5 y429 z-25.5 a90.00 b-90.00 c0.00 e-24.64 t176148231800 f1000
|
||||||
|
G90 G1 x-125.5 y429 z-25.5 a90.00 b-90.00 c0.00 e47.55 t176148233380 f1000
|
||||||
|
G90 G1 x-125.5 y429 z42 a90.00 b-90.00 c0.00 e47.55 t176148234250 f1000
|
||||||
|
G90 G1 x-125.5 y429 z42 a90.00 b-90.00 c99.12 e47.55 t176148239130 f1000
|
||||||
|
G90 G1 x-125.5 y429 z42 a90.00 b-90.00 c193.09 e47.55 t176148241640 f1000
|
||||||
|
G90 G1 x-125.5 y429 z-52 a90.00 b-90.00 c193.09 e47.55 t176148245260 f1000
|
||||||
|
G90 G1 x-125.5 y429 z-52 a90.00 b-90.00 c193.09 e-100.85 t176148247310 f1000
|
||||||
|
G90 G1 x-125.5 y369 z-52 a90.00 b-90.00 c193.09 e-100.85 t176148248360 f1000
|
||||||
|
G90 G1 x-125.5 y369 z87.5 a90.00 b-90.00 c193.09 e-100.85 t176148249370 f1000
|
||||||
|
G90 G1 x-37 y369 z87.5 a90.00 b-90.00 c193.09 e-100.85 t176148250020 f1000
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e-100.85 t176148250630 f1000
|
||||||
10
GCodeFiles/log_2025_11_03_remote_Rumspielen_2.gcode
Executable file
10
GCodeFiles/log_2025_11_03_remote_Rumspielen_2.gcode
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e0.00 t176148132360 f1000
|
||||||
|
G90 G1 x0 y395.5 z0 a90.00 b-90.00 c0.00 e0.00 t176220043020 f1000
|
||||||
|
G90 G1 x0 y395.5 z-39 a90.00 b-90.00 c0.00 e0.00 t176220043450 f1000
|
||||||
|
G90 G1 x0 y395.5 z-39 a90.00 b-90.00 c0.00 e121.47 t176220044130 f1000
|
||||||
|
G90 G1 x0 y356 z-11.5 a-2.25 b-90.00 c0.00 e121.47 t176220044940 f1000
|
||||||
|
G90 G1 x0 y356 z-47 a-2.25 b-90.00 c0.00 e121.47 t176220045500 f1000
|
||||||
|
G90 G1 x0 y356 z-52 a-2.25 b-90.00 c0.00 e121.47 t176220045640 f1000
|
||||||
|
G90 G1 x0 y356 z-52 a-2.25 b-90.00 c0.00 e25.21 t176220046140 f1000
|
||||||
|
G90 G1 x0 y356 z4 a-2.25 b-90.00 c0.00 e25.21 t176220046390 f1000;!
|
||||||
|
G90 G1 x0 y300 z0 a90.00 b-90.00 c0.00 e25.21 t176220046780 f1000
|
||||||
116
Logo.svg
Executable file
116
Logo.svg
Executable file
@@ -0,0 +1,116 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="46.770107mm"
|
||||||
|
height="48.495022mm"
|
||||||
|
viewBox="0 0 46.770107 48.495022"
|
||||||
|
version="1.1"
|
||||||
|
id="svg1"
|
||||||
|
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
|
||||||
|
sodipodi:docname="Logo.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview1"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:zoom="1.0242632"
|
||||||
|
inkscape:cx="169.87821"
|
||||||
|
inkscape:cy="-66.87734"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1009"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="layer1">
|
||||||
|
<sodipodi:guide
|
||||||
|
position="24.777427,273.28241"
|
||||||
|
orientation="1,0"
|
||||||
|
id="guide3"
|
||||||
|
inkscape:locked="false" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<defs
|
||||||
|
id="defs1">
|
||||||
|
<marker
|
||||||
|
style="overflow:visible"
|
||||||
|
id="ArrowTriangleStylized"
|
||||||
|
refX="0"
|
||||||
|
refY="0"
|
||||||
|
orient="auto-start-reverse"
|
||||||
|
inkscape:stockid="Stylized triangle arrow"
|
||||||
|
markerWidth="1"
|
||||||
|
markerHeight="1"
|
||||||
|
viewBox="0 0 1 1"
|
||||||
|
inkscape:isstock="true"
|
||||||
|
inkscape:collect="always"
|
||||||
|
preserveAspectRatio="xMidYMid">
|
||||||
|
<path
|
||||||
|
transform="scale(0.5)"
|
||||||
|
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
|
||||||
|
d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
|
||||||
|
id="path4" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
style="overflow:visible"
|
||||||
|
id="ArrowTriangleStylized-2"
|
||||||
|
refX="0"
|
||||||
|
refY="0"
|
||||||
|
orient="auto-start-reverse"
|
||||||
|
inkscape:stockid="Stylized triangle arrow"
|
||||||
|
markerWidth="1"
|
||||||
|
markerHeight="1"
|
||||||
|
viewBox="0 0 1 1"
|
||||||
|
inkscape:isstock="true"
|
||||||
|
inkscape:collect="always"
|
||||||
|
preserveAspectRatio="xMidYMid">
|
||||||
|
<path
|
||||||
|
transform="scale(0.5)"
|
||||||
|
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
|
||||||
|
d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
|
||||||
|
id="path4-9" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
inkscape:label="Ebene 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(7.4505806e-8,-26.504978)">
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke:#bebeff;stroke-width:1.73011;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:2.4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="rect5"
|
||||||
|
width="5.4336185"
|
||||||
|
height="5.063127"
|
||||||
|
x="2.850307"
|
||||||
|
y="44.071819" />
|
||||||
|
<rect
|
||||||
|
style="fill:#4d4d4d;stroke:#000000;stroke-width:0.445148;stroke-miterlimit:2.4;stroke-dasharray:none"
|
||||||
|
id="rect1"
|
||||||
|
width="24.554853"
|
||||||
|
height="24.554852"
|
||||||
|
x="0.22257392"
|
||||||
|
y="50.222576"
|
||||||
|
ry="0" />
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;stroke:#000000;stroke-width:0.567685;stroke-miterlimit:2.4;stroke-dasharray:none;marker-end:url(#ArrowTriangleStylized)"
|
||||||
|
d="M 24.777427,50.222575 V 28.806426"
|
||||||
|
id="path3" />
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;stroke:#000000;stroke-width:0.545682;stroke-miterlimit:2.4;stroke-dasharray:none;marker-end:url(#ArrowTriangleStylized-2)"
|
||||||
|
d="M 24.769655,50.222575 H 44.557862"
|
||||||
|
id="path3-6" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#0000ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:2.4;stroke-dasharray:none"
|
||||||
|
d="m 5.5710333,46.760148 26.3939107,-13.790591 3.196495,26.028598 5.20572,4.01845"
|
||||||
|
id="path5" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.9 KiB |
19
https/cert_abcd.cer
Executable file
19
https/cert_abcd.cer
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDGDCCAgCgAwIBAgIQIKm3TdMAErVIFuSUWmXD1TANBgkqhkiG9w0BAQsFADAU
|
||||||
|
MRIwEAYDVQQDDAlsb2NhbGhvc3QwHhcNMjIwNzI3MTMwMDUzWhcNMjMwNzI3MTMy
|
||||||
|
MDUzWjAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
||||||
|
DwAwggEKAoIBAQC97MG8XIuUGoAskplE0qhMv5VyZ2Sgkp4vv8yLVP63VBvYPpg9
|
||||||
|
hi6w8HTCwhBIy2ZmUrztqQ7Ye8fFaWlowDnrTp10ewAiAWvpjxSyeJE7dfP1AQcb
|
||||||
|
x3/YgrOCvQfy/5Xtcnm1SC/9VtxutcePJMwvD6S/5dpkVeCUhVpPuagEGvzStMhk
|
||||||
|
ovMxxaTcEG++N+2CiEtBpe4xxmDs0mmZhhJgO5t6roYLZzy2Q3BSJ3FNHArOOD3R
|
||||||
|
hxh0aV9c4RHQUGSZVVUfwUORGDp5XMqlJjfSsnNncBDBex4byV9SBOkQ4mxKQa/c
|
||||||
|
LG2MQ1RjLSVXSZ3QFMDgWdw+FWIapiOCoMXJAgMBAAGjZjBkMA4GA1UdDwEB/wQE
|
||||||
|
AwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwFAYDVR0RBA0wC4IJ
|
||||||
|
bG9jYWxob3N0MB0GA1UdDgQWBBSju5UGtw9Kz49/xVHoT0XnTlKtkDANBgkqhkiG
|
||||||
|
9w0BAQsFAAOCAQEAlEqbYXNgVTBLedFNOZz97IxrlAckG+4FMzcXIWhY55GvqwtL
|
||||||
|
gwWGrjKqGkXLhMVDzWHPSKWYxDdU6WJcBux9yuOz//s1Pro59jRIJvcOivbpXLPI
|
||||||
|
SaFPnc/29UeEDoh22AGr/9sAhOX2CrVMmrbaaDcZ8UN/YnT1bwufKFQipK1sGSR+
|
||||||
|
U5ISZ+pUXJ75aJFEZujucpFT1Sl6GWRWiL7u1Zacmm8jGIdZwpDIynSYK821fJMR
|
||||||
|
lVDQ9kPBBmU+Ummei/8vc+tqm2/3voekgLxIwxdpykn3L4JMtOn83+sZ2HVoS3Bz
|
||||||
|
/5+6Gc6u5+d3wLeO23q/sOARprC3ytzGc5bQRw==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
BIN
https/cert_abcd.pfx
Executable file
BIN
https/cert_abcd.pfx
Executable file
Binary file not shown.
4
https/info.txt
Executable file
4
https/info.txt
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
abcd
|
||||||
|
|
||||||
|
|
||||||
|
SET OPENSSL_CONF="C:\Program Files (x86)\OpenSSL-Win32\bin\openssl.cfg"
|
||||||
27
https/key.pem
Executable file
27
https/key.pem
Executable file
@@ -0,0 +1,27 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEpAIBAAKCAQEArGn6Cbl+aqN8Fv0fW8IkDIHI3eF4mY6RdVIlJf9XD6amrUA4
|
||||||
|
fh3cyjriGKwT/KxB8B5czluo0kJ4ZDZvEDnfUkSdCXo2oCg6hBUfvcIA0X15rrn2
|
||||||
|
RdMZH8vtQ4P2ICrldpQS+A8ZnnnVnaGWql27sxygq6splqtXqhDBkuaA1x79mFlZ
|
||||||
|
6BRpELihDHpz0j67MgbRpQgauQSo5axPVYH4l7ZMhBX/u7USyfJyU+1aedNZ7Gtd
|
||||||
|
x5Hy4VytVYYO8y1/SaOAM6v/jo9C3rw8uEOvcs3+bK4+BrJBRGUzTRiQiBrx2mHx
|
||||||
|
BimZ0ZGtuLPVaU0EkFnXnBJnRtY/HaAMJghEQQIDAQABAoIBAQCptEpbZgxrdG2A
|
||||||
|
xzclfysycFDBLNwi8TR1cRyFkRYlnpgysaKpaEVZfKntNPsbWoYwjgI1T/0UsD6G
|
||||||
|
DRo2s3AALu8PVA8Oh2pJde1fPuTFTqcF957TTZxOMtBgAzSwpuhjVg5xwZMq7Kr5
|
||||||
|
VALTwB0viH8RWhE+b3qDN6kBKgcpNYc3/KEgW2Ernxt+UBY/iN5j80Q+cI87kr5U
|
||||||
|
uQ+bmGpDh0+uNpevinnfD06Dwle+eI1nDh+GjAfrdS7GU/PPFB78PTu5G1GOh6LB
|
||||||
|
debifPkBNs08890McHRspd3q59FPTyLcyetqhaBV1rrydkVwm1deN2uF0EImsxTX
|
||||||
|
E99mISYtAoGBANP1J8HB+iVAkJWtEA5z846oHkBbvFKSKuLugt2APa/Ma6ZP3TCA
|
||||||
|
aBomY7vXG0F+x7bnMQLOhsir18i4VCd0FXhqysjUowRGj241NwuTVEvttw5yjfSZ
|
||||||
|
aZuoGakEXRTbQytBxFtUdndY6FjgYnlD4qsZMXyCszx7punLbabdni/nAoGBANA9
|
||||||
|
V1jIai1/dWYwB1eokJekmTEJt2sgzoDChXZe2UbQY5Ai/00taPnKp7BN5qURUNth
|
||||||
|
KFf+ZiJloSwM0t9gbNKlkkdIJfIKAG/QDm5v6ekBdAOmctdBD2KUw/vYbFFAMJhw
|
||||||
|
KC2RuZF5YCLZKYkrgxLe11OpPawyXde6NcRbkYWXAoGBAJ8TZU0z6is/M8RB6MUQ
|
||||||
|
HQE6B8pBjythbDJ401quPp3MDBb75YPbO0Y0/bEileAn6HfLN6tlmR7OadrJDM+3
|
||||||
|
fc2sSJlFjTtOQaNy6OcVIbUCqdp7+zJSWUJrfSaukbVvgg/bAiWRVH/qCCd78CwW
|
||||||
|
2O2UsOFDroV8QB9Df/42YdyNAoGALYEKAkOhOBn/HHpoUFZsaka0lwupggZkOazI
|
||||||
|
H0qwrhHBf/C12zaOFu+a3yLWwMFc6uN7PmdACEovAwI2Xkui3BEEOwFgEVjwKX7M
|
||||||
|
eIOKGLmRkW6g77qu0vrxLKppWQPu2pC/pt2OMGTWhibwNaJFfS0m3ohACs3ixc5S
|
||||||
|
C3t6/DcCgYB7I6BfANEwd+KVEUYZXhjVvlXdQvyr+ZEQpxpwYFmC2WTxFjGuB5k0
|
||||||
|
IzGOAxfTnE4LdLYk/qLu51w64zLGqEdxETE8wLbnWxHO1tXDBmjqxMC+9C4onQ0V
|
||||||
|
OSN22zpjLTCv5TVRks2JfM3j5onBS1SqrHVd50DvV9E35CDl0/sUTg==
|
||||||
|
-----END RSA PRIVATE KEY-----
|
||||||
30
https/localhost.key
Executable file
30
https/localhost.key
Executable file
@@ -0,0 +1,30 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
Proc-Type: 4,ENCRYPTED
|
||||||
|
DEK-Info: AES-256-CBC,9FB898B8D313CB3A043B4F4E2F62C6D8
|
||||||
|
|
||||||
|
cg368RyYjMGTo9L8CtbSDMvzUisFai7fsWtrzegoGMrgYEsmkqI/NPDHO893tf7n
|
||||||
|
X4kXDqpWlYT9awry0yYDgYOyOVffBbh7+TfHEH2ZHC8dCNf7uF8OJlGbV3fVKZ92
|
||||||
|
yrNaHrrnHgVwb78SYrFpkKJLL42O7OAIC9yKfKv9TFJF+g5bntAqe/TNv1vL1Zmm
|
||||||
|
Y2Hlm9SaDgZhrn8dhUQ6uWq0pNVZ8NBcjzerAyEw8CSIa8y4pXU8dQHz0aMGqmW3
|
||||||
|
P9hgo8g9jI1U/V9WmacLuh6DDyWuT2qEqw+Qcp6WgXBV9eTVUMN+rmWxfFmL+hOn
|
||||||
|
fgSwFrQwNpI1V/WZlp5qL9UvzthJs7H5fK62pSfSN8ZRAWN2Yi4pOPQTOPY//h8t
|
||||||
|
q2x9f5YXrV+GOfDFeLAoUElENNh0zakjjNv5n/q1Pnw8RPouB9TWkJMEjGWbwxYb
|
||||||
|
vNt5z8QJXF9oB0wZgX6kcMpZST9Mi1+7AoWUrFWTeHmP55s2gv9lx+M1XvRkqtv1
|
||||||
|
Ddg5ANkCYf4chv2GLsn5nEae4aALIMq8XOa1BF7LkHQxuNTBNamfJwm4/U45+f1W
|
||||||
|
NaG+xHroPkgRRW8fklvpF8mJ0q8IbvrtapSWZQcxPnxmknJtZynJjqeiO22tbtmc
|
||||||
|
n1okJzNI6FvertxGDNY+QZfx6NZJ4sIXEhTw6dQce2x9vJPpA6VbMI+A39RJS4VO
|
||||||
|
LxWU+Zv2H1YTR0QjrT0of/sFOdMhUldyyTDdqTZd7Z1NIUDX1GW9pFua+29ntK04
|
||||||
|
QTwCis5feu/egSWctbCNAIf/YXi9IM5su1njY7H6G4wwcRFGU11O6I8TqM/8l3gm
|
||||||
|
5mYkTGJiBmEqbz3q+99XGbr+0K8YfB6x8eUlWZgmdw3cvKYRly+km1+kyJGB+pTc
|
||||||
|
2wNMN9oLHntcQV9NBgKtebuQQygfd4ZSVdheijIJQfpPFW0aDiKrnvvhcEixSTqn
|
||||||
|
6WTaEJhhA67GOWmtXLjLN3r0+nndvtL6N2UXP9FSZg6tCpn0k5jvJidKfGucBL7K
|
||||||
|
aoKP1yJ19ho4WjpJcAF1TyKgEbLb0rNHMr6AObLFQsVynbyPgA5FY5zTvUH5PZDd
|
||||||
|
oVyL8yYD2fQC2ghLdBxNLanlIh6gbintHCO2DEx8LY7itvjGthR5WdVCPbxK6L74
|
||||||
|
4FgXRBW9NXNh53O+6SBUT6dn064qVVBOsxqGhur15Bna5X8ULkRSHw3QMsv4e+9Q
|
||||||
|
kWyJ3r5jfHGMhdvNlU/gc6S4qaPFEBRAB3QUE7xDHjU9rrzXZzd+gcy7+pqFtRJz
|
||||||
|
pFQeVNuKYpwVqx1V+nAN+ZlIJim67JOuY9qGMeKwT4kVtujESgLG4eNmXyoxsT4Y
|
||||||
|
hwCmxzLr9eu0HpmcHVULTg1NhflaLSK1ThauawEhght2JmGgxsn3xTElx4adWUBI
|
||||||
|
4hb5MTCHy0NY6T3sDNOXeRSJoRb31rMA099CVTrF7xui9Bbzoj7q9DImh43S1h4d
|
||||||
|
nwQ/optM7GiMZlGqgHdEob6hBxXMfA1EfSnyN3KPxwsa0z9OoMio7Uu6+MZt+we7
|
||||||
|
Z9myzP2XSg/YsmtCvtvKKHuxdOun2byScwtagtGty/IXBkRsRz/E7sXNxOnJJVSS
|
||||||
|
-----END RSA PRIVATE KEY-----
|
||||||
22
https/localhost.pem
Executable file
22
https/localhost.pem
Executable file
@@ -0,0 +1,22 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDuzCCAqOgAwIBAgIJAOtJAMcSg7G5MA0GCSqGSIb3DQEBCwUAMHQxCzAJBgNV
|
||||||
|
BAYTAkNIMQswCQYDVQQIDAJaSDEPMA0GA1UEBwwGWnVyaWNoMQwwCgYDVQQKDAND
|
||||||
|
aEsxDzANBgNVBAsMBkRldkNoSzEMMAoGA1UEAwwDQ2hLMRowGAYJKoZIhvcNAQkB
|
||||||
|
FgtjaGtAYWJjZC5lZjAeFw0yMjA3MjcxNDI2MjNaFw0zMjA3MjQxNDI2MjNaMHQx
|
||||||
|
CzAJBgNVBAYTAkNIMQswCQYDVQQIDAJaSDEPMA0GA1UEBwwGWnVyaWNoMQwwCgYD
|
||||||
|
VQQKDANDaEsxDzANBgNVBAsMBkRldkNoSzEMMAoGA1UEAwwDQ2hLMRowGAYJKoZI
|
||||||
|
hvcNAQkBFgtjaGtAYWJjZC5lZjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
||||||
|
ggEBAOZS5yfFHiPN4AvGoAhTrJ+MqcuNdwr8a1oug3yjgfLUdpCSzYsHMyDwNkD1
|
||||||
|
acGX4csalo5qnqEzsG9Aj3v5zBPXbCDUb5AfCzEo+C5QkHsEEVFlLcAgh0haSiFo
|
||||||
|
J2ossXPIwptosv2jNUBAp25tk7CoI0yNgYk/WT0ZxwYlAPI1oOVlIdGSHoQfVLVr
|
||||||
|
1+xudxP4H2F/2ZoGvYE1FU3vHNDWumrIjpVC1YdKiB7TiMxL72etbhNIWj6ZMrgQ
|
||||||
|
h+ZhqUbN/crzoQT3gd5TK5gAWTEY34Hxhl9W/IDFxGrwyIct/YVdLOvPbqyWo+W/
|
||||||
|
1gGQzFlN85DUYCe2kPZfvIP15vcCAwEAAaNQME4wHQYDVR0OBBYEFMl+Cq5lqeN2
|
||||||
|
lf3mp7mPDk7AXT10MB8GA1UdIwQYMBaAFMl+Cq5lqeN2lf3mp7mPDk7AXT10MAwG
|
||||||
|
A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBADc8KDpE4zXb0Gag82Iueux+
|
||||||
|
RCOLNb6Rbt3Ltoi8TzlbHpBb9LMsplpuQt+RHUDBDKh+vs73y53Sne5Ro9jd3JV7
|
||||||
|
0eY+V3SJYk3sSzSkqPgxeJFHsXFkQz9Y9UqloW9jpULGJTBPavXa0P4QcZ/2dnys
|
||||||
|
LGmV+cZhg3i8wOeM+3Ny8ZJGRJi7xj2Zb7EjGfuDwwc9wrXxGA2l9bJHuqxnzdyi
|
||||||
|
L4ApXrZ8t6lABOD+XwgbY5DepO2av8KUcBnhA91Jc2DD/gZrHZyxHG2/vT662+Mc
|
||||||
|
VdCS92IIPjOTe3TxJZ+5NgRjlU0JlYHe+aRG2RZ+AmmWBc+5DB+58PaImpcwkt8=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
30
https/localhost2.key
Executable file
30
https/localhost2.key
Executable file
@@ -0,0 +1,30 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
Proc-Type: 4,ENCRYPTED
|
||||||
|
DEK-Info: AES-256-CBC,FD72C71993563663BEF543276EED15FD
|
||||||
|
|
||||||
|
wEVQsIkYWEzxiVHCKMN3W5XHtlLQS/bNioPUtNoc/CkECmh82pR7NYphEMBB2ZQj
|
||||||
|
yZSVd+nFKQ70nP8qMhLzOBHG6pYRS3/DqQ4kON4/VtF33VUzC8R5dnBf+VydCUCp
|
||||||
|
1CjS71BJbAr3kQZLFFNPeMesr9iy4hBpxmVcfBC+rZjWoxPCiUxgwf7C/Aq53MJl
|
||||||
|
MuvY1EZ5NhvFpqvj2ncbIrjRhrg6NBN2hhICEfiwAoVOlSNJ+cDaNsGy86I82+Yd
|
||||||
|
n8t02mZcCMn8OWQvT5u7OhhUGbsKlRtbDdsFmGzuWapaWhLB145IvDIP/K6AuR35
|
||||||
|
GTGBVcODdk+APtGYvhw0XqLV5tJXo1CfrKcFdsZtMzPT3VLCsvUTWJ0d+NcPqRpa
|
||||||
|
nON/89sULZfeTlsoWWrn6sZRCeGrP8diqqnrVKfPdH06zcty3gWnmRZM1ZYnRjuC
|
||||||
|
JKchULbSvMM0G9cY80+/PVydoIkXyrwl6hMGPmDFD3kosJbePrUoWZXH0yv0AVx+
|
||||||
|
tobGiWiFycYRlW0V5SVU8eBwmBAN+r7L3USLYsd7As9sulYvUsGrUpbWjImN/ADm
|
||||||
|
nHbwX7aclFLZblpnVWI9GBXm7NmWQcnD3U37+kzPDAK0BpqSCkYI8orEyTtRoMpL
|
||||||
|
4WE6D738uBjnKOVX5Zlx9RTyiFF5tO7EXOVD2YymtpsyzGNk00c6YR6qevWM7/Ga
|
||||||
|
tAHqbv3ER18XZjmWz0A2JjvDaDvFKHH5uXoNwTt/EIdObkguOc3YOPJWQbDz6WaQ
|
||||||
|
SpYvM+0Xm8wkjN+gfn93ZsNokHut2k54Zy1tjQcAxtqjy/qdNMRhH8SstJP5xLj4
|
||||||
|
DkI/UpNTs+ePw5tuvJoWvelTXhxnHnXvsIa7SuavL1mUmFcWvuOVsCKzij5H8xIt
|
||||||
|
htEmOL4GXT7oJ80Udj7t9Fu0V7GxFSvxiYJyFD/djJY0WTsPpZbp6HLOCuFTc/p6
|
||||||
|
IQFsyGaYiTbg4+ShFWeSQ5bJ7KlTMUcJfO4rFC/GQjtp1odaJO7e7P26RYCZoo5k
|
||||||
|
amBWXdP7FQL1cIEtdHp12jCUCbiStRNjE9yW1hQFxBFj4b9FoGvP32MWyHv2nZx8
|
||||||
|
xluy0sTHG6r/0Ir1kdSPZCd/1tE3mRikWt0rg/fT21tAYtxXIxUARCUS7utu+JfK
|
||||||
|
2/1uyNK+S4/LLsr1cxsJBbjScs+JLIMwB+OCDJE0J2x1X73W/37gEQ94MbQZD9cC
|
||||||
|
xyi/0nrJIfRoNmLWT4Xo/rbXnGWZkVubZDBPUaxHQzYrbdt+bQJyOjeWQs3snQsw
|
||||||
|
gr5rSvMaGaSikt000sCMFSzS8bqRpd0iDIw/m7t4qzax7DOUPqem9DWgr+2FfjrC
|
||||||
|
gtUD1A+jUm8iUeuCSio6Vyn+nPTWCTfKXTnsJPg3gjvMF3SrOFo4v2UB/ti/vhCy
|
||||||
|
0XEc81RZxvPE0cA8O+4k3hriBIk89Fza+RW5TntOmAV3gnwf5h5KHeA50D9Z1OOl
|
||||||
|
OfMPc/ie31H4BjrpwPs6cI3vZOtEJnw1FWaI6a/LE/dlcFj61A+6HkbBUtCBC4hN
|
||||||
|
YlFMKLfQJd6RSsR7RRwo1fFqIECNWbC5zr7ozNatDwK9ln6zGLQ2vFOd3k83g/P0
|
||||||
|
-----END RSA PRIVATE KEY-----
|
||||||
8
install.bat
Executable file
8
install.bat
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
npm install config
|
||||||
|
npm install os
|
||||||
|
npm install --save express
|
||||||
|
npm install wss
|
||||||
|
npm init
|
||||||
|
npm install socketcan
|
||||||
|
npm install jest
|
||||||
|
|
||||||
4596
package-lock.json
generated
Executable file
4596
package-lock.json
generated
Executable file
File diff suppressed because it is too large
Load Diff
25
package.json
Executable file
25
package.json
Executable file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "roboticsdriver_webservicetest",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "WebService is provieded here",
|
||||||
|
"main": "startRobot.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node startRobot.js",
|
||||||
|
"test": "jest"
|
||||||
|
},
|
||||||
|
"author": "Ch Kendel",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"config": "^3.3.12",
|
||||||
|
"express": "^4.18.2",
|
||||||
|
"jayson": "^4.1.0",
|
||||||
|
"jest": "^29.7.0",
|
||||||
|
"json-rpc-2.0": "^1.7.0",
|
||||||
|
"mock-socket": "^9.3.1",
|
||||||
|
"telnet-stream": "^1.1.0",
|
||||||
|
"wss": "^3.3.4"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"jest-websocket-mock": "^2.5.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
318
robot/GCode.js
Executable file
318
robot/GCode.js
Executable file
@@ -0,0 +1,318 @@
|
|||||||
|
/***
|
||||||
|
* Receives GCode, processes it and moves the Data to the Roboter-Class
|
||||||
|
*/
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
|
||||||
|
class GCode{
|
||||||
|
|
||||||
|
static fileName = "GCodeFiles/log.gcode";
|
||||||
|
|
||||||
|
static containsMCode(s){
|
||||||
|
return s.indexOf('M1') == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
static receiveMCode(robot, m){
|
||||||
|
|
||||||
|
m = m.split(" ");
|
||||||
|
if(m[0] == "M1"){
|
||||||
|
m.forEach((s) => {
|
||||||
|
if(s.includes("X")){ robot.xMotor += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("x")){ robot.xMotor += Number(s.substring(1, s.length));}
|
||||||
|
|
||||||
|
|
||||||
|
if(s.includes("Y")){ robot.alpha += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("y")){ robot.alpha += Number(s.substring(1, s.length));}
|
||||||
|
|
||||||
|
|
||||||
|
if(s.includes("Z")){ robot.beta += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("z")){ robot.beta += Number(s.substring(1, s.length));}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Empfangene Motor-Position (" + robot.xMotor.toPrecision(3)+ ", "+ robot.alpha.toPrecision(3)+ ", "+ robot.beta.toPrecision(3)+ ", "+ robot.a.toPrecision(5) + ", "+ robot.b.toPrecision(5)+ ", "+ robot.c.toPrecision(5)+ ") ");
|
||||||
|
robot.sendCommand();
|
||||||
|
}
|
||||||
|
|
||||||
|
static containsCommand(s){
|
||||||
|
if(s.indexOf('M1 ') !== -1){return true;} // M1-Commands = G1-Command only for Motor-Coordinates
|
||||||
|
if(s.indexOf('G') !== 0){return false;}
|
||||||
|
if(s.indexOf('G90') == 0){return true;}
|
||||||
|
if(s.indexOf('G91') == 0){return true;}
|
||||||
|
if(s.indexOf('G28') !== -1){return true;}
|
||||||
|
if(s.indexOf('G1 ') !== -1){return true;}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static getM114(robot){
|
||||||
|
let text = '{"position":{ "x":'+robot.x+
|
||||||
|
', "y":'+robot.y+
|
||||||
|
', "z":'+robot.z+
|
||||||
|
', "a":' +robot.phi +
|
||||||
|
', "b":' +robot.theta +
|
||||||
|
', "c":' +robot.psi + '},' +
|
||||||
|
'"motorCounts":{ "x":'+ robot.xMotor +
|
||||||
|
', "y":'+ robot.alpha +
|
||||||
|
', "z":'+ robot.beta +
|
||||||
|
', "a":'+ robot.a +
|
||||||
|
', "b":'+ robot.b +
|
||||||
|
', "c":'+ robot.c +
|
||||||
|
', "e":'+ 0.0 +
|
||||||
|
'}}';
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static toPiMultiple(gCode){
|
||||||
|
if(gCode == undefined){return gCode;}
|
||||||
|
|
||||||
|
var multipleParameters = gCode.split(" ");
|
||||||
|
var newGString = "";
|
||||||
|
multipleParameters.forEach((paramet) => {
|
||||||
|
if(paramet == undefined || !paramet || paramet.length === 0 || paramet == " " || paramet ==""){
|
||||||
|
|
||||||
|
}
|
||||||
|
else if(['A', 'a', 'B', 'b', 'C', 'c','E','e'].includes(paramet.charAt(0)) )
|
||||||
|
{
|
||||||
|
var numberParameter = Number(paramet.substring(1, paramet.length))
|
||||||
|
newGString += " " + paramet[0] + String(numberParameter*Math.PI/180)
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
newGString += " " + paramet;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return newGString.trim();
|
||||||
|
};
|
||||||
|
|
||||||
|
static receiveGCode(robot, g){
|
||||||
|
|
||||||
|
if(g == undefined) return;
|
||||||
|
|
||||||
|
var multipleCommands = g.split(" G");
|
||||||
|
var doProcessRest = false;
|
||||||
|
if(multipleCommands.length > 1){
|
||||||
|
doProcessRest = true;
|
||||||
|
g = multipleCommands[0];
|
||||||
|
}
|
||||||
|
//console.log("Command: " + g);
|
||||||
|
|
||||||
|
g = g.split(" ");
|
||||||
|
|
||||||
|
var calculateNew = true;
|
||||||
|
var calculateFromMotorCoordinates = false;
|
||||||
|
|
||||||
|
if(g[0] == "G90") {robot.moveRelative = false; calculateNew = false;}
|
||||||
|
else if(g[0] == "G91") {robot.moveRelative = true; calculateNew = false;}
|
||||||
|
else if(g[0] == "G28") {
|
||||||
|
robot.x = 0;
|
||||||
|
robot.y = robot.l1 + robot.l2 + robot.l3;
|
||||||
|
robot.z = 0;
|
||||||
|
robot.phi = -Math.PI/2;
|
||||||
|
robot.theta = Math.PI/2;
|
||||||
|
robot.psi = 0;
|
||||||
|
robot.e = 0;
|
||||||
|
}
|
||||||
|
else if(g[0] == "G1" && robot.moveRelative){
|
||||||
|
g.forEach((s) => {
|
||||||
|
if(s.includes("X")){ robot.x += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("x")){ robot.x += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("Y")){ robot.y += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("y")){ robot.y += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("Z")){ robot.z += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("z")){ robot.z += Number(s.substring(1, s.length));}
|
||||||
|
|
||||||
|
|
||||||
|
// abc in 2Pi-Angles
|
||||||
|
if(s.includes("A")){ robot.phi += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("a")){ robot.phi += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("B")){ robot.theta += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("b")){ robot.theta += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("C")){ robot.psi += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("c")){ robot.psi += Number(s.substring(1, s.length));}
|
||||||
|
|
||||||
|
if(s.includes("E")){ robot.e += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("e")){ robot.e += Number(s.substring(1, s.length));}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if(g[0] == "M1" && robot.moveRelative){
|
||||||
|
calculateFromMotorCoordinates = true;
|
||||||
|
g.forEach((s) => {
|
||||||
|
if(s.includes("X")){ robot.xMotor += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("x")){ robot.xMotor += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("Y")){ robot.alpha += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("y")){ robot.alpha += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("Z")){ robot.beta += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("z")){ robot.beta += Number(s.substring(1, s.length));}
|
||||||
|
|
||||||
|
|
||||||
|
if(s.includes("A")){ robot.a += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("a")){ robot.a += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("B")){ robot.b += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("b")){ robot.b += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("C")){ robot.c += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("c")){ robot.c += Number(s.substring(1, s.length));}
|
||||||
|
|
||||||
|
if(s.includes("E")){ robot.e += Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("e")){ robot.e += Number(s.substring(1, s.length));}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// Absolute-Positioning
|
||||||
|
else if(g[0] == "G1" && !robot.moveRelative){
|
||||||
|
g.forEach((s) => {
|
||||||
|
if(s.includes("X")){ robot.x = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("x")){ robot.x = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("Y")){ robot.y = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("y")){ robot.y = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("Z")){ robot.z = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("z")){ robot.z = Number(s.substring(1, s.length));}
|
||||||
|
|
||||||
|
if(s.includes("A")){ robot.phi = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("a")){ robot.phi = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("B")){ robot.theta = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("b")){ robot.theta = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("C")){ robot.psi = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("c")){ robot.psi = Number(s.substring(1, s.length));}
|
||||||
|
|
||||||
|
if(s.includes("E")){ robot.e = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("e")){ robot.e = Number(s.substring(1, s.length));}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if(g[0] == "M1" && !robot.moveRelative){
|
||||||
|
calculateFromMotorCoordinates = true;
|
||||||
|
g.forEach((s) => {
|
||||||
|
if(s.includes("X")){ robot.xMotor = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("x")){ robot.xMotor = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("Y")){ robot.alpha = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("y")){ robot.alpha = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("Z")){ robot.beta = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("z")){ robot.beta = Number(s.substring(1, s.length));}
|
||||||
|
|
||||||
|
if(s.includes("A")){ robot.a = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("a")){ robot.a = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("B")){ robot.b = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("b")){ robot.b = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("C")){ robot.c = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("c")){ robot.c = Number(s.substring(1, s.length));}
|
||||||
|
|
||||||
|
if(s.includes("E")){ robot.e = Number(s.substring(1, s.length));}
|
||||||
|
if(s.includes("e")){ robot.e = Number(s.substring(1, s.length));}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(calculateNew && !calculateFromMotorCoordinates){
|
||||||
|
robot.calculateAngles3D();
|
||||||
|
robot.sendCommand();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(calculateFromMotorCoordinates){
|
||||||
|
robot.calculatePositionFromMotorAngles();
|
||||||
|
robot.sendCommand();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// verarbeitet alle weiteren Commands in dieser Zeile.
|
||||||
|
if(doProcessRest){
|
||||||
|
multipleCommands.forEach((cmd) => {
|
||||||
|
if(cmd[0] != "G"){
|
||||||
|
this.receiveGCode(robot, "G"+cmd);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////77
|
||||||
|
// Commands for Files
|
||||||
|
|
||||||
|
static removeStringFromFile(fileName, stringToRemove) {
|
||||||
|
try {
|
||||||
|
const data = fs.readFileSync(fileName, 'utf8');
|
||||||
|
const modifiedData = data.replace(new RegExp(stringToRemove, 'g'), '');
|
||||||
|
fs.writeFileSync(fileName, modifiedData, 'utf8');
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Error:', err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static ContainsFilesCommand(message){
|
||||||
|
if(message.indexOf('FPoint') !== -1){return true;} // Writes new Point (at end of file)
|
||||||
|
if(message.indexOf('FPlus') !== -1){return true;} // go to Next Position in Log File
|
||||||
|
if(message.indexOf('FMinus') !== -1){return true;} // go to Previous Position
|
||||||
|
if(message.indexOf('FFirst') !== -1){return true;} // set Cursour to First Position of Log File
|
||||||
|
if(message.indexOf('FLast') !== -1){return true;} // set Cursour to Last Position of Log File
|
||||||
|
|
||||||
|
|
||||||
|
if(message.indexOf('FShow') !== -1){return true;} // Shows/Sends GCode-File
|
||||||
|
if(message.indexOf('FList') !== -1){return true;} // Lists GCode-Files
|
||||||
|
if(message.indexOf('FLoad ') !== -1){return true;} // Loads File into Log
|
||||||
|
if(message.indexOf('FSave ') !== -1){return true;} // Saves Log to GCode-File
|
||||||
|
if(message.indexOf('FClear') !== -1){return true;} // Clears default Log File
|
||||||
|
|
||||||
|
if(message.indexOf('M20') !== -1){return true;} // M20 - List SD Card-Contents // https://marlinfw.org/docs/gcode/M020.html
|
||||||
|
if(message.indexOf('M23') !== -1){return true;} // M23 - Select SD file
|
||||||
|
if(message.indexOf('M28') !== -1){return true;} // M28 - Start SD write // M28 [B1] filename
|
||||||
|
if(message.indexOf('M29') !== -1){return true;} // M29 - Stop SD write
|
||||||
|
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static receiveFC(robot, message){
|
||||||
|
|
||||||
|
if(message.indexOf('FShow') !== -1){
|
||||||
|
try {
|
||||||
|
const data = fs.readFileSync(this.fileName, 'utf8');
|
||||||
|
const reply = "XYZ__FShow__XYZ" + data; // prepend header
|
||||||
|
return reply.replaceAll("G91 ","").replaceAll("G90 ","").replace(/\s?\bt\d+\b\s?/g, '').trim();
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Error:', err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(message.indexOf('FPoint') !== -1){
|
||||||
|
|
||||||
|
const secondsSinceEpoch = 10*Math.floor(Date.now() / 100);
|
||||||
|
|
||||||
|
var strGCode = String(`G90 G1 x${robot.x} y${robot.y} z${robot.z} a${(robot.phi*180/Math.PI).toFixed(2)} b${(robot.theta*180/Math.PI).toFixed(2)} c${(robot.psi*180/Math.PI).toFixed(2)} e${(robot.e*180/Math.PI).toFixed(2)} t${secondsSinceEpoch} f1000` )
|
||||||
|
this.removeStringFromFile(this.fileName, ';!')
|
||||||
|
fs.appendFileSync(this.fileName, strGCode+ ';!'+ '\r\n', 'utf8');
|
||||||
|
}
|
||||||
|
|
||||||
|
if(message.indexOf('FMinus') !== -1 || message.indexOf('FPlus') !== -1){
|
||||||
|
let lines = fs.readFileSync(this.fileName, 'utf8').split('\r\n');
|
||||||
|
|
||||||
|
let lineChange = -1;
|
||||||
|
|
||||||
|
// Process lines
|
||||||
|
for (let i = 0; i < lines.length; i++) {
|
||||||
|
if (lines[i].indexOf(';!') !== -1) {
|
||||||
|
if(message.indexOf('FMinus') !== -1 && i > 0){
|
||||||
|
lines[i - 1] += ';!';
|
||||||
|
lines[i] = lines[i].split(';!')[0];
|
||||||
|
var gCodePi = this.toPiMultiple(lines[i-1]);
|
||||||
|
this.receiveGCode(robot, gCodePi);
|
||||||
|
}
|
||||||
|
if(message.indexOf('FPlus') !== -1 && i < (lines.length-2) && lineChange == -1){
|
||||||
|
lines[i + 1] += ';!';
|
||||||
|
lines[i] = lines[i].split(';!')[0];
|
||||||
|
lineChange = i+1;
|
||||||
|
var gCodePi = this.toPiMultiple(lines[i+1]);
|
||||||
|
this.receiveGCode(robot, gCodePi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write the updated content back
|
||||||
|
fs.writeFileSync(this.fileName, lines.join('\r\n'), 'utf8');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return GCode.getM114(robot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = GCode
|
||||||
|
|
||||||
53
robot/PythonSender.js
Executable file
53
robot/PythonSender.js
Executable file
@@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
module.exports = class PythonSender {
|
||||||
|
|
||||||
|
|
||||||
|
constructor(p = 9875){
|
||||||
|
const WebSocket = require('ws');
|
||||||
|
|
||||||
|
|
||||||
|
this.sockets = [];
|
||||||
|
this.server = new WebSocket.Server({port: p});
|
||||||
|
|
||||||
|
this.server.on('connection', (socket) => this.connectThis(socket));
|
||||||
|
}
|
||||||
|
|
||||||
|
msgThis(msg){
|
||||||
|
console.log("message:" + msg.toString())
|
||||||
|
this.sockets.forEach(s => s.send(msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
closeThis(socket){
|
||||||
|
console.log("Python Receiver is closing the connection");
|
||||||
|
this.sockets = this.sockets.filter(s => s !== socket);
|
||||||
|
}
|
||||||
|
connectThis(socket) {
|
||||||
|
console.log("Python Receiver is connected")
|
||||||
|
this.sockets.push(socket);
|
||||||
|
|
||||||
|
// When you receive a message, send that message to every socket.
|
||||||
|
socket.on('message', (msg) => this.msgThis(msg));
|
||||||
|
|
||||||
|
|
||||||
|
// When a socket closes, or disconnects, remove it from the array.
|
||||||
|
socket.on('close', () => this.closeThis(socket));
|
||||||
|
}
|
||||||
|
|
||||||
|
send(m){
|
||||||
|
if((this.sockets.length) > 0){
|
||||||
|
this.sockets.forEach( s => s.send(m));
|
||||||
|
}
|
||||||
|
else{ console.warn("No sockets connected. Can't send the Message.");}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if(this.pythonSender != null){
|
||||||
|
var strJSON = CANCreator.cmdMovement(this.motorPositionOld, this.motorPosition);
|
||||||
|
if(strJSON != '{"message":"empty"}'){
|
||||||
|
this.pythonSender.send(strJSON);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
152
robot/Robot.js
Executable file
152
robot/Robot.js
Executable file
@@ -0,0 +1,152 @@
|
|||||||
|
const MotorPosition = require('./RobotMotorPosition.js')
|
||||||
|
const telnetSender = require('./TelnetSenderGRBL.js')
|
||||||
|
|
||||||
|
class Robot{
|
||||||
|
|
||||||
|
|
||||||
|
constructor(l1, l2, l3) {
|
||||||
|
this.speedX = 200; // mm/min
|
||||||
|
this.speedY = 200;
|
||||||
|
this.speedZ = 200;
|
||||||
|
|
||||||
|
this.lastCommandSend = 0;
|
||||||
|
|
||||||
|
if(this.lastCommandSend == 0){ this.lastCommandSend = Date.now() };
|
||||||
|
this.doAnimate = false;
|
||||||
|
|
||||||
|
this.l1 = l1; // Oberarm
|
||||||
|
this.l2 = l2; // Unterarm
|
||||||
|
this.l3 = l3; // Hand-Länge
|
||||||
|
|
||||||
|
// Plan-Koordinaten - XYZ FingerSpitze
|
||||||
|
this.x = 0;
|
||||||
|
this.y = 0;
|
||||||
|
this.z = 0;
|
||||||
|
|
||||||
|
// Plan-Koordinaten - HandRichtung
|
||||||
|
this.phi = 0.0; // Euler-Winkel zwischen X-Achse - Laengengrad
|
||||||
|
this.theta = -Math.PI/2; // Euler-Winkel zwischen Z-Achse und P - Breitengrad
|
||||||
|
this.psi = 0.0; // Euler-Winkel: Drehung des Handgelenks abweichend vom Breitengrad
|
||||||
|
|
||||||
|
this.e = 0.0 // Finger-Distance
|
||||||
|
|
||||||
|
// Zwischen-Ergebnisse: Hand Punkt (nur für Tests sind die Public)
|
||||||
|
this.pX = 0.0;
|
||||||
|
this.pY = 0.0;
|
||||||
|
this.pZ = 0.0;
|
||||||
|
|
||||||
|
// Motor-Koordinaten - Schulter, Ellebogen, Hand-Dreher
|
||||||
|
this.xMotor = 0;
|
||||||
|
this.alpha = 0; // =Y Motor
|
||||||
|
this.beta = 0; // =Z Motor = Winkel die der Unterarm unter der Y-Achse ist.
|
||||||
|
|
||||||
|
// Motor-Winkel fuer's Handgelenk
|
||||||
|
this.a = 0; // aMotor am Ellebogen
|
||||||
|
this.b = 0; // bMotor Handgelenk-Knicker
|
||||||
|
this.c = 0; // cMotor Hand-Dreher
|
||||||
|
|
||||||
|
this.eMotor = 0; // eMotor Finger-Distanz
|
||||||
|
|
||||||
|
|
||||||
|
this.oldCommandTime = Date.now();
|
||||||
|
this.showFunctions = [];
|
||||||
|
|
||||||
|
this.savedPoints = [];
|
||||||
|
this.atPointNr = 0;
|
||||||
|
this.t = 0; // TimeStamp of this Point
|
||||||
|
|
||||||
|
this.moveRelative = true;
|
||||||
|
|
||||||
|
this.pythonSender = null;
|
||||||
|
this.cmdReceivers = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
createMotorPosition(){
|
||||||
|
this.motorPosition = new MotorPosition(this.xMotor, this.alpha, this.beta, this.a, this.b, this.c, this.eMotor);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Berechnet aus XYZ die Motor-Winkel für den GCode
|
||||||
|
calculateAngles3D(){
|
||||||
|
|
||||||
|
while(this.phi > Math.PI){this.phi -= 2*Math.PI}
|
||||||
|
while(this.phi < -Math.PI){this.phi += 2*Math.PI}
|
||||||
|
while(this.theta > Math.PI){this.theta -= 2*Math.PI}
|
||||||
|
while(this.theta < -Math.PI){this.theta += 2*Math.PI}
|
||||||
|
|
||||||
|
// Handgelenk-Punkt ausrechnen:
|
||||||
|
this.pX = this.x + this.l3*Math.sin(this.theta)*Math.cos(this.phi);
|
||||||
|
this.pY = this.y + this.l3*Math.sin(this.theta)*Math.sin(this.phi);
|
||||||
|
this.pZ = this.z + this.l3*Math.cos(this.theta);
|
||||||
|
|
||||||
|
var pX = this.pX;
|
||||||
|
var pY = this.pY;
|
||||||
|
var pZ = this.pZ;
|
||||||
|
|
||||||
|
this.xMotor = pX;
|
||||||
|
// Ziel-Punkt ausrechnen ==> 2D Rechnung Arm
|
||||||
|
var r = Math.sqrt(pY * pY + pZ * pZ);
|
||||||
|
|
||||||
|
if (r > (this.l1 + this.l2)) { return; }
|
||||||
|
if (r == 0) { return; }
|
||||||
|
|
||||||
|
var gamma = Math.asin(pZ / r);
|
||||||
|
var delta = Math.acos((this.l1 * this.l1 + this.l2 * this.l2 - r * r) / (2 * this.l1 * this.l2));
|
||||||
|
this.alpha = Math.acos((this.l1 * this.l1 + r * r - this.l2 * this.l2) / (2 * r * this.l1)) + gamma;
|
||||||
|
this.beta = -Math.PI + (this.alpha + delta);
|
||||||
|
// Ende <== 2D Rechnung Arm
|
||||||
|
|
||||||
|
// Richtung der Hand ausgerechnet
|
||||||
|
// Arm = (0, cos(beta), sin(beta)) Punkt = (sin(theta)cos(phi), sin(theta)sin(phi), cos(theta))
|
||||||
|
//
|
||||||
|
// Unterarm muss gedreht werden. Aus der Y-Z-Ebene raus. Hin in die Ebene n x r
|
||||||
|
// wobei n = Unterarm x (P-O) ist
|
||||||
|
var nX = Math.cos(this.beta)*Math.cos(this.theta) - Math.sin(this.theta)*Math.sin(this.phi)*Math.sin(this.beta);
|
||||||
|
var nY = Math.sin(this.beta)*Math.sin(this.theta)*Math.cos(this.phi);
|
||||||
|
var nZ = -1.0*Math.sin(this.theta)*Math.cos(this.phi)*Math.cos(this.beta);
|
||||||
|
var nBetrag = Math.sqrt(nX*nX + nY*nY + nZ*nZ);
|
||||||
|
|
||||||
|
var cosA = (nX)/nBetrag;
|
||||||
|
this.a = Math.acos(cosA)
|
||||||
|
if(Math.cos(this.phi) > 0){this.a = -this.a}
|
||||||
|
if(Math.sin(this.theta) < 0) {this.a = -this.a}
|
||||||
|
|
||||||
|
|
||||||
|
// Handgelenk-Knick-Winkel ist zwischen Arm und Punkt-O
|
||||||
|
var cosB = Math.cos(this.beta)*Math.sin(this.theta)*Math.sin(this.phi) + Math.sin(this.beta)*Math.cos(this.theta);
|
||||||
|
this.b = Math.acos(cosB);
|
||||||
|
|
||||||
|
|
||||||
|
// Winkel zwischen n und z muss rumgedreht werden.
|
||||||
|
var cosC = - nZ / nBetrag;
|
||||||
|
this.c = Math.acos(cosC);
|
||||||
|
this.c += this.psi;
|
||||||
|
|
||||||
|
// a um 180° drehen
|
||||||
|
this.a += Math.PI;
|
||||||
|
while(this.a > Math.PI){this.a -= 2*Math.PI}
|
||||||
|
while(this.a < -Math.PI){this.a += 2*Math.PI}
|
||||||
|
|
||||||
|
this.eMotor = this.e - this.b - this.c;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
calculatePositionFromMotorAngles(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sendCommand(){
|
||||||
|
if(this.motorPosition == null){this.createMotorPosition() }
|
||||||
|
this.motorPositionOld = this.motorPosition;
|
||||||
|
this.createMotorPosition()
|
||||||
|
|
||||||
|
console.log("Robot.sendCommand: neue RobotMotorPosition: x=", this.motorPosition.x.toFixed(3), "yMotor=",this.motorPosition.y.toFixed(3), "zMotor=",this.motorPosition.z.toFixed(3), "aM=", this.motorPosition.a.toFixed(3), "bM=", this.motorPosition.b.toFixed(3), "cM=", this.motorPosition.c.toFixed(3), " e=", this.motorPosition.e.toFixed(3));
|
||||||
|
|
||||||
|
this.cmdReceivers.forEach(receiver => {
|
||||||
|
receiver.moveTo(this.motorPositionOld, this.motorPosition);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = Robot // Export class
|
||||||
19
robot/RobotMotorPosition.js
Executable file
19
robot/RobotMotorPosition.js
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
module.exports = class RobotMotorPosition{
|
||||||
|
|
||||||
|
|
||||||
|
constructor(x, y, z, a, b, c, e = 0.0){
|
||||||
|
this.x = x; // X-Motor
|
||||||
|
this.y = y; // Y-Motor
|
||||||
|
this.z = z;
|
||||||
|
|
||||||
|
this.a = a; // A-Motor: Ellbow-LowerArm turner
|
||||||
|
this.b = b; // B-Motor: Hand up-down
|
||||||
|
this.c = c; // C-Motor: Hand twist
|
||||||
|
|
||||||
|
this.e = e; // Finger open
|
||||||
|
|
||||||
|
this.time = Date.now();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
213
robot/TelnetSenderGRBL.js
Executable file
213
robot/TelnetSenderGRBL.js
Executable file
@@ -0,0 +1,213 @@
|
|||||||
|
const net = require("net");
|
||||||
|
const { resolve } = require("path");
|
||||||
|
const { TelnetSocket } = require("telnet-stream");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = class TelnetSenderGRBL{
|
||||||
|
|
||||||
|
/* urlGRBL: URL für den GCode Empfänger (MicroController, GRBL)
|
||||||
|
* xAxisGrbl: Welche Achse soll ausgelesen werden? Welche Achse ist die GRBL-X-Achse
|
||||||
|
* yAxisGrbl: ...
|
||||||
|
* zAxisGrbl: ...
|
||||||
|
*/
|
||||||
|
constructor(urlGRBL = "grblesp.local", maxSpeedF = 5000, xAxisGrbl = "x", yAxisGrbl = "y", zAxisGrbl = "z", aAxisGrbl = null, bAxisGrbl = null, cAxisGrbl = null, eAxisGrbl = null){
|
||||||
|
|
||||||
|
var socket = null;
|
||||||
|
this.tSocket = null;
|
||||||
|
this.receiver = null;
|
||||||
|
|
||||||
|
this.urlGRBLstr = urlGRBL;
|
||||||
|
this.xAxisGrbl = xAxisGrbl;
|
||||||
|
this.yAxisGrbl = yAxisGrbl;
|
||||||
|
this.zAxisGrbl = zAxisGrbl;
|
||||||
|
this.aAxisGrbl = aAxisGrbl;
|
||||||
|
this.bAxisGrbl = bAxisGrbl;
|
||||||
|
this.cAxisGrbl = cAxisGrbl;
|
||||||
|
this.eAxisGrbl = eAxisGrbl;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
new Promise((resolve, reject) => {
|
||||||
|
socket = net.createConnection({port: 23, host: urlGRBL},() => {
|
||||||
|
resolve(socket);
|
||||||
|
})
|
||||||
|
.on('error', reject);
|
||||||
|
}).then( connection => {
|
||||||
|
connection.on('data', data => {
|
||||||
|
//console.log("data from " + urlGRBL + " is: " + data);
|
||||||
|
//if(this.receiver && this.receiver != null){
|
||||||
|
// this.receiver.send(buffer);
|
||||||
|
// }
|
||||||
|
});
|
||||||
|
}, error => {
|
||||||
|
console.log("Telnet Connection Error on " + urlGRBL + ": " + error.toString());
|
||||||
|
this.tSocket = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
if(socket != null){
|
||||||
|
this.tSocket = new TelnetSocket(socket);
|
||||||
|
|
||||||
|
this.tSocket.on("close", function () {
|
||||||
|
console.log("Telnet Closed " + urlGRBL);
|
||||||
|
this.tSocket = null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
moveTo(mOld, mNew){
|
||||||
|
|
||||||
|
// The Hand-Turn is not 1:1 to the Hand-Lift °
|
||||||
|
var factorTurnLift = 1.2;
|
||||||
|
|
||||||
|
// The Hand-Open is not 1:1 to the Hand-Turn
|
||||||
|
var factorOpenTurn = 1.92;
|
||||||
|
|
||||||
|
// Hand-Open in mm
|
||||||
|
var handOpenInMM = 1.0
|
||||||
|
|
||||||
|
var data = "G1"
|
||||||
|
|
||||||
|
if(this.xAxisGrbl == "x"){
|
||||||
|
data += " x" + (mNew.x).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.xAxisGrbl == "y"){
|
||||||
|
data += " x" + (mNew.y * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.xAxisGrbl == "z"){
|
||||||
|
data += " x" + ((mNew.z * 180 / Math.PI) - (mNew.y * 180 / Math.PI) ).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.xAxisGrbl == "a"){
|
||||||
|
// This is the case for the Ellbow, when the Motor is connected to the X-Port of the FluidNC
|
||||||
|
data += " x" + (mNew.a * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.xAxisGrbl == "b"){
|
||||||
|
data += " x" + (mNew.b * 180 / Math.PI+(mNew.z * 180 / Math.PI) - (mNew.y * 180 / Math.PI)).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.xAxisGrbl == "c"){
|
||||||
|
// Runs correctly, substracts the "b" axis, uses the "c" axis to send to the x-Motor wich is in this case the hand-twist
|
||||||
|
data += " x" + ((-1)*mNew.b * 180 / Math.PI + (mNew.c * 180 / Math.PI) ).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.xAxisGrbl == "e"){
|
||||||
|
//This is the case for the Hand, when the Open-Close Motor is connected to the X-Port of FluidNC
|
||||||
|
var handUpDown = mNew.b * 180 * factorTurnLift / Math.PI ;
|
||||||
|
var handTurn = mNew.c*180/Math.PI ;
|
||||||
|
data += " x" + ((-1.0*(-1.0*(handUpDown) + handTurn) + mNew.e*handOpenInMM)).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(this.yAxisGrbl == "x"){
|
||||||
|
data += " y" + (mNew.x ).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.yAxisGrbl == "y"){
|
||||||
|
data += " y" + (mNew.y * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.yAxisGrbl == "z"){
|
||||||
|
data += " y" + ((mNew.z * 180 / Math.PI) - (mNew.y * 180 / Math.PI) ).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.yAxisGrbl == "a"){
|
||||||
|
data += " y" + (mNew.a * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.yAxisGrbl == "b"){
|
||||||
|
data += " y" + (mNew.b * 180 / Math.PI+(mNew.z * 180 / Math.PI) - (mNew.y * 180 / Math.PI)).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.yAxisGrbl == "c"){
|
||||||
|
// This is the case if the hand-rotation-turner is connected to the FluidNC-Y
|
||||||
|
var handUpDown = (mNew.b * 180 / Math.PI ) * factorTurnLift;
|
||||||
|
var handTurn = ( mNew.c*180/Math.PI ) ;
|
||||||
|
data += " y" + (-1.0*(handUpDown) + handTurn).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.yAxisGrbl == "e"){
|
||||||
|
data += " y" + (mNew.e * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(this.zAxisGrbl == "x"){
|
||||||
|
data += " z" + (mNew.x).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.zAxisGrbl == "y"){
|
||||||
|
data += " z" + (mNew.y * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.zAxisGrbl == "z"){
|
||||||
|
data += " z" + ((mNew.z * 180 / Math.PI) - (mNew.y * 180 / Math.PI) ).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.zAxisGrbl == "a"){
|
||||||
|
data += " z" + (mNew.a * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.zAxisGrbl == "b"){
|
||||||
|
// This is the case of the Hand, when the Up-Down-Motor is connected to the FluidNC-Z
|
||||||
|
data += " z" + ( mNew.b * 180 / Math.PI ).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.zAxisGrbl == "c"){
|
||||||
|
data += " z" + (mNew.c * 180 / Math.PI + (mNew.b * 180 / Math.PI) + (mNew.z * 180 / Math.PI) - (mNew.y * 180 / Math.PI)).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.zAxisGrbl == "e"){
|
||||||
|
|
||||||
|
data += " z" + (mNew.e * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(this.aAxisGrbl == "x"){
|
||||||
|
data += " a" + (mNew.y * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.aAxisGrbl == "y"){
|
||||||
|
data += " a" + (mNew.y * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.aAxisGrbl == "z"){
|
||||||
|
data += " a" + ((mNew.z * 180 / Math.PI) - (mNew.y * 180 / Math.PI) ).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.aAxisGrbl == "a"){
|
||||||
|
data += " a" + (mNew.a * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.aAxisGrbl == "b"){
|
||||||
|
data += " a" + (mNew.b * 180 / Math.PI+(mNew.z * 180 / Math.PI) - (mNew.y * 180 / Math.PI)).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.aAxisGrbl == "c"){
|
||||||
|
data += " a" + (mNew.c * 180 / Math.PI + (mNew.b * 180 / Math.PI) + (mNew.z * 180 / Math.PI) - (mNew.y * 180 / Math.PI)).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.aAxisGrbl == "e"){
|
||||||
|
// ToDo Mai 2024
|
||||||
|
data += " a" + (mNew.e * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(this.bAxisGrbl == "x"){
|
||||||
|
data += " b" + (mNew.x).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.bAxisGrbl == "y"){
|
||||||
|
data += " b" + (mNew.y * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.bAxisGrbl == "z"){
|
||||||
|
data += " b" + ((mNew.z * 180 / Math.PI) - (mNew.y * 180 / Math.PI) ).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.bAxisGrbl == "a"){
|
||||||
|
data += " b" + (mNew.a * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.bAxisGrbl == "b"){
|
||||||
|
data += " b" + (mNew.b * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.bAxisGrbl == "c"){
|
||||||
|
data += " b" + (mNew.c * 180 / Math.PI + (mNew.b * 180 / Math.PI) + (mNew.z * 180 / Math.PI) - (mNew.y * 180 / Math.PI)).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
if(this.bAxisGrbl == "e"){
|
||||||
|
data += " b" + (mNew.e * 180 / Math.PI).toFixed(2).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
data += " f"+(maxSpeedF.toFixed(2).toString())
|
||||||
|
|
||||||
|
|
||||||
|
console.log("" + this.urlGRBLstr + " receives: " + data.toString("utf-8"))
|
||||||
|
|
||||||
|
if(this.tSocket && data.toString("utf-8").length > 3){
|
||||||
|
this.tSocket.write( data.toString("utf-8") + "\r\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
1
runTest.bat
Executable file
1
runTest.bat
Executable file
@@ -0,0 +1 @@
|
|||||||
|
npm test
|
||||||
88
sendTest_Client.py
Executable file
88
sendTest_Client.py
Executable file
@@ -0,0 +1,88 @@
|
|||||||
|
import websocket, json
|
||||||
|
import time
|
||||||
|
import can
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def on_message(ws, message):
|
||||||
|
j = message
|
||||||
|
if(type(message) == str):
|
||||||
|
j = json.loads(message)
|
||||||
|
|
||||||
|
if(type(j) == list):
|
||||||
|
for x in j:
|
||||||
|
on_message(ws, x)
|
||||||
|
else:
|
||||||
|
print(j)
|
||||||
|
if 'id' not in j:
|
||||||
|
print("Message ohne ID empfangen. Wird ignoriert.")
|
||||||
|
return
|
||||||
|
if 'cmd' not in j:
|
||||||
|
print("Message ohne CMD empfangen. Wird ignoriert.")
|
||||||
|
return
|
||||||
|
|
||||||
|
id = j['id'] # 0x01
|
||||||
|
cmd = j['cmd'] # 0xf6 # Speed Mode Command
|
||||||
|
|
||||||
|
if "data" in j:
|
||||||
|
dat = j["data"] # [0x02,0x80,0x02]
|
||||||
|
data = [cmd] + dat
|
||||||
|
else:
|
||||||
|
data = [cmd]
|
||||||
|
|
||||||
|
dlc = len(data)+1
|
||||||
|
cr = id
|
||||||
|
for i in data:
|
||||||
|
cr += i
|
||||||
|
|
||||||
|
CRC = cr & 0xFF
|
||||||
|
|
||||||
|
msg = can.Message(arbitration_id=id, dlc=dlc, data=data+[CRC], is_extended_id=False)
|
||||||
|
|
||||||
|
try:
|
||||||
|
bus.send(msg)
|
||||||
|
#print(f"CAN Message sent on {bus.channel_info}")
|
||||||
|
|
||||||
|
except can.CanError:
|
||||||
|
print("CAN Message NOT sent: " + str(can.CanError))
|
||||||
|
print("CAN Message NOT sent: " + str(can.CanError.error_code))
|
||||||
|
|
||||||
|
start_time = curtime = time.time()
|
||||||
|
while 1:
|
||||||
|
tdiff = start_time + 0.001 - curtime
|
||||||
|
if tdiff <= 0.:
|
||||||
|
break
|
||||||
|
msg = bus.recv(tdiff)
|
||||||
|
curtime = time.time()
|
||||||
|
if (msg is None):
|
||||||
|
continue
|
||||||
|
|
||||||
|
print("CAN Reply is received:")
|
||||||
|
print(msg)
|
||||||
|
|
||||||
|
|
||||||
|
def on_error(ws, error):
|
||||||
|
print("WebSocket Error:" + error)
|
||||||
|
|
||||||
|
def on_close(a, b, c):
|
||||||
|
print("### WebSocket closed ###")
|
||||||
|
|
||||||
|
def on_open(ws):
|
||||||
|
print("WebSocket Connection open")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
websocket.enableTrace(True)
|
||||||
|
ws = websocket.WebSocketApp("ws://01-KW-S0139:9875",
|
||||||
|
on_message = on_message,
|
||||||
|
on_error = on_error,
|
||||||
|
on_close = on_close)
|
||||||
|
ws.on_open = on_open
|
||||||
|
|
||||||
|
with can.interface.Bus(channel='can0', bustype='socketcan') as bus:
|
||||||
|
|
||||||
|
ws.run_forever()
|
||||||
114
startRobot.js
Executable file
114
startRobot.js
Executable file
@@ -0,0 +1,114 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const https = require('https');
|
||||||
|
const WebSocket = require('ws');
|
||||||
|
|
||||||
|
|
||||||
|
const Robot = require('./robot/Robot.js')
|
||||||
|
const GCode = require('./robot/GCode.js')
|
||||||
|
// 238 + 1 + 25 = 264
|
||||||
|
let robot = new Robot(250,264,100); //(300,290,10);
|
||||||
|
|
||||||
|
|
||||||
|
const httpsOptions = {
|
||||||
|
"enable": true,
|
||||||
|
'key': fs.readFileSync('https/localhost.key'),
|
||||||
|
'cert': fs.readFileSync('https/localhost.pem'),
|
||||||
|
"passphrase": "abcd"
|
||||||
|
}
|
||||||
|
|
||||||
|
server = https.createServer(httpsOptions, (req, res) => {;});
|
||||||
|
|
||||||
|
const wss = new WebSocket.Server({ server });
|
||||||
|
|
||||||
|
// Input Connection for WebService
|
||||||
|
wss.on('connection', function connection(ws)
|
||||||
|
{
|
||||||
|
console.log("WebServer for Input is connected");
|
||||||
|
|
||||||
|
ws.on('message', function incoming(message)
|
||||||
|
{
|
||||||
|
if(message == "Ping"){
|
||||||
|
wss.clients.forEach(function (client)
|
||||||
|
{
|
||||||
|
if (client.readyState == WebSocket.OPEN)
|
||||||
|
{
|
||||||
|
client.send( message );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if(GCode.containsCommand(message)){
|
||||||
|
GCode.receiveGCode(robot,message);
|
||||||
|
reply = GCode.getM114(robot);
|
||||||
|
wss.clients.forEach(function (client)
|
||||||
|
{
|
||||||
|
if (client.readyState == WebSocket.OPEN)
|
||||||
|
{
|
||||||
|
client.send( reply );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if(GCode.ContainsFilesCommand(message)){
|
||||||
|
reply = GCode.receiveFC(robot, message);
|
||||||
|
wss.clients.forEach(function (client)
|
||||||
|
{
|
||||||
|
if (client.readyState == WebSocket.OPEN)
|
||||||
|
{
|
||||||
|
client.send( reply );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Request for Status
|
||||||
|
if(message == "M114"){
|
||||||
|
reply = GCode.getM114(robot);
|
||||||
|
wss.clients.forEach(function (client)
|
||||||
|
{
|
||||||
|
if (client.readyState == WebSocket.OPEN)
|
||||||
|
{
|
||||||
|
client.send( reply );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var TenetSender = require('./robot/TelnetSenderGRBL.js')
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
var telnetSender1 = null; //new TenetSender(urlGRBL = "fluidNcBase.local", maxSpeedF = 2300, xAxisGrbl = "x", yAxisGrbl = "y", zAxisGrbl = "z");
|
||||||
|
var telnetSender2 = null; // new TenetSender(urlGRBL = "fluidNcEllbow.local", maxSpeedF = 5000, xAxisGrbl = "a", yAxisGrbl = null, zAxisGrbl = null);
|
||||||
|
var telnetSender3 = null; // new TenetSender(urlGRBL = "fluidNcHand.local", maxSpeedF = 5000, xAxisGrbl = "c", yAxisGrbl = "e", zAxisGrbl = "b");
|
||||||
|
*/
|
||||||
|
|
||||||
|
var telnetSender1 = new TenetSender(urlGRBL = "fluidNcBase.local", maxSpeedF = 2300, xAxisGrbl = "x", yAxisGrbl = "y", zAxisGrbl = "z");
|
||||||
|
var telnetSender2 = new TenetSender(urlGRBL = "fluidNcEllbow.local", maxSpeedF = 5000, xAxisGrbl = "a", yAxisGrbl = null, zAxisGrbl = null);
|
||||||
|
var telnetSender3 = new TenetSender(urlGRBL = "fluidNcHand.local", maxSpeedF = 5000, xAxisGrbl = "c", yAxisGrbl = "e", zAxisGrbl = "b");
|
||||||
|
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
if(telnetSender1?.tSocket != null) { robot.cmdReceivers.push(telnetSender1); console.log("Socket 1 added");}
|
||||||
|
else{ console.log("Socket 1 is not connected"); console.log(telnetSender1?.tSocket);}
|
||||||
|
|
||||||
|
if(telnetSender2?.tSocket != null) { robot.cmdReceivers.push(telnetSender2); console.log("Socket 2 added");}
|
||||||
|
else{ console.log("Socket 2 is not connected"); console.log(telnetSender2?.tSocket);}
|
||||||
|
|
||||||
|
if(telnetSender3?.tSocket != null) { robot.cmdReceivers.push(telnetSender3); console.log("Socket 3 added");}
|
||||||
|
else{ console.log("Socket 3 is not connected"); console.log(telnetSender3?.tSocket);}
|
||||||
|
}, 8000);
|
||||||
|
|
||||||
|
setTimeout(function(){
|
||||||
|
if(robot.cmdReceivers.length == 0){
|
||||||
|
console.log("Kein GRBL Command-Receiver gefunden. Verwende reines Test-Setting.")
|
||||||
|
}
|
||||||
|
},8002)
|
||||||
|
|
||||||
|
console.log("Works with FluidNc Base");
|
||||||
|
|
||||||
|
|
||||||
|
port = 2095
|
||||||
|
server.listen(port);
|
||||||
|
console.log("Listen on Port: https://localhost:" + port.toString()+ "/")
|
||||||
15
test/GCode.test.js
Executable file
15
test/GCode.test.js
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
const GCode = require('../robot/GCode.js');
|
||||||
|
|
||||||
|
|
||||||
|
test('G91 ist ein GCode Command', () => {
|
||||||
|
var x = GCode.containsCommand("G91") ;
|
||||||
|
expect(x).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('G28 ist ein GCode Command', () => {
|
||||||
|
var x = GCode.containsCommand("G28") ;
|
||||||
|
expect(x).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
6
test/GCodeFileOperation.test.js
Executable file
6
test/GCodeFileOperation.test.js
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
const GCode = require('../robot/GCode.js');
|
||||||
|
|
||||||
|
test('GCode - FPoint', () => {
|
||||||
|
var x = GCode.ContainsFilesCommand("FPoint") ;
|
||||||
|
expect(x).toBe(true);
|
||||||
|
});
|
||||||
20
test/PythonSender_01.test.js
Executable file
20
test/PythonSender_01.test.js
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
var PythonSender = require('../robot/PythonSender.js');
|
||||||
|
|
||||||
|
|
||||||
|
test('Initialisiere den WS', () => {
|
||||||
|
var p = new PythonSender();
|
||||||
|
p.server.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Connect to WS', ()=> {
|
||||||
|
var p = new PythonSender(9991);
|
||||||
|
|
||||||
|
const WebSocket = require('ws');
|
||||||
|
|
||||||
|
//w = new WebSocket("ws://localhost:9991")
|
||||||
|
|
||||||
|
console.log(p.sockets)
|
||||||
|
p.server.close();
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
144
test/Robot.01_WristPoint.test.js
Executable file
144
test/Robot.01_WristPoint.test.js
Executable file
@@ -0,0 +1,144 @@
|
|||||||
|
|
||||||
|
const Robot = require('../robot/Robot.js');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
test('Initialisiere den Robot', () => {
|
||||||
|
robot = new Robot(300,290,10)
|
||||||
|
expect(robot.x).toBe(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
test('3D Handgelenk Punkt prüfen 1', () => {
|
||||||
|
robot = new Robot(300,290,10)
|
||||||
|
|
||||||
|
robot.x = 0 ;
|
||||||
|
robot.y = 600;
|
||||||
|
robot.z = 0;
|
||||||
|
robot.phi = -Math.PI/2;
|
||||||
|
robot.theta = Math.PI/2;
|
||||||
|
|
||||||
|
robot.calculateAngles3D();
|
||||||
|
|
||||||
|
// console.log("p = " + robot.pX.toString() +", "+robot.pY.toString() +", "+robot.pZ.toString() );
|
||||||
|
expect(Math.abs(robot.pX)).toBeLessThanOrEqual(0.0001)
|
||||||
|
expect(Math.abs(robot.pY)).toBe(590)
|
||||||
|
expect(Math.abs(robot.pZ)).toBeLessThanOrEqual(0.0001)
|
||||||
|
});
|
||||||
|
|
||||||
|
test('3D Handgelenk Punkt prüfen 2', () => {
|
||||||
|
robot = new Robot(300,290,10)
|
||||||
|
|
||||||
|
robot.x = 0 ;
|
||||||
|
robot.y = 400;
|
||||||
|
robot.z = 0;
|
||||||
|
robot.phi = -Math.PI/2;
|
||||||
|
robot.theta = Math.PI/2;
|
||||||
|
|
||||||
|
robot.calculateAngles3D();
|
||||||
|
|
||||||
|
// console.log("p = " + robot.pX.toString() +", "+robot.pY.toString() +", "+robot.pZ.toString() );
|
||||||
|
expect(Math.abs(robot.pX)).toBeLessThanOrEqual(0.0001)
|
||||||
|
expect(Math.abs(robot.pY)).toBe(390)
|
||||||
|
expect(Math.abs(robot.pZ)).toBeLessThanOrEqual(0.0001)
|
||||||
|
});
|
||||||
|
|
||||||
|
test('3D Handgelenk Punkt prüfen 3', () => {
|
||||||
|
robot = new Robot(300,290,10)
|
||||||
|
|
||||||
|
robot.x = 0 ;
|
||||||
|
robot.y = 400;
|
||||||
|
robot.z = 0;
|
||||||
|
robot.phi = -Math.PI/2;
|
||||||
|
robot.theta = 0;
|
||||||
|
|
||||||
|
robot.calculateAngles3D();
|
||||||
|
|
||||||
|
// console.log("p = " + robot.pX.toString() +", "+robot.pY.toString() +", "+robot.pZ.toString() );
|
||||||
|
expect(Math.abs(robot.pX)).toBeLessThanOrEqual(0.0001)
|
||||||
|
expect(Math.abs(robot.pY)).toBe(400)
|
||||||
|
expect(Math.abs(robot.pZ)).toBe(10)
|
||||||
|
});
|
||||||
|
|
||||||
|
test('3D Handgelenk Punkt prüfen 4', () => {
|
||||||
|
robot = new Robot(300,290,10)
|
||||||
|
|
||||||
|
robot.x = 0 ;
|
||||||
|
robot.y = 400;
|
||||||
|
robot.z = 0;
|
||||||
|
robot.phi = 0;
|
||||||
|
robot.theta = Math.PI/2;
|
||||||
|
|
||||||
|
robot.calculateAngles3D();
|
||||||
|
|
||||||
|
// console.log("p = " + robot.pX.toString() +", "+robot.pY.toString() +", "+robot.pZ.toString() );
|
||||||
|
expect(robot.pX).toBe(10)
|
||||||
|
expect(robot.pY).toBe(400)
|
||||||
|
expect(Math.abs(robot.pZ)).toBeLessThanOrEqual(0.0001)
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
// Griff mit ausgetrecktem Arm
|
||||||
|
test('3D Angles AlphaBeta', () => {
|
||||||
|
robot = new Robot(300,290,10)
|
||||||
|
|
||||||
|
robot.x = 0 ;
|
||||||
|
robot.y = 600;
|
||||||
|
robot.z = 0;
|
||||||
|
robot.phi = -Math.PI / 2;
|
||||||
|
robot.theta = 0;
|
||||||
|
|
||||||
|
robot.calculateAngles3D();
|
||||||
|
|
||||||
|
expect(robot.alpha).toBe(0);
|
||||||
|
expect(robot.beta).toBe(0);
|
||||||
|
expect(robot.a).toBe(0);
|
||||||
|
expect(robot.b).toBe(0);
|
||||||
|
expect(robot.c).toBe(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Griff mit minimal gewinkeltem Arm
|
||||||
|
test('3D Angles AlphaBeta with slight angle', () => {
|
||||||
|
robot = new Robot(300,290,10)
|
||||||
|
|
||||||
|
robot.x = 0 ;
|
||||||
|
robot.y = 550;
|
||||||
|
robot.z = 0;
|
||||||
|
robot.phi = -Math.PI / 2;
|
||||||
|
robot.theta = 0;
|
||||||
|
|
||||||
|
robot.calculateAngles3D();
|
||||||
|
|
||||||
|
expect(robot.alpha).not.toBe(0);
|
||||||
|
expect(robot.beta).not.toBe(0);
|
||||||
|
expect(Math.abs(robot.a % (Math.PI/2))).toBe(0);
|
||||||
|
expect(robot.b).not.toBe(0);
|
||||||
|
console.log(robot.b);
|
||||||
|
expect(Math.abs(robot.c % (Math.PI/2))).toBe(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Griff mit gewinkeltem Arm
|
||||||
|
test('3D Angles AlphaBeta', () => {
|
||||||
|
robot = new Robot(300,290,10)
|
||||||
|
|
||||||
|
robot.x = 0 ;
|
||||||
|
robot.y = 300;
|
||||||
|
robot.z = 0;
|
||||||
|
robot.phi = -Math.PI / 2;
|
||||||
|
robot.theta = Math.PI/3;
|
||||||
|
|
||||||
|
robot.calculateAngles3D();
|
||||||
|
|
||||||
|
console.log("alpha = " + robot.alpha.toString());
|
||||||
|
console.log("beta = " + robot.beta.toString());
|
||||||
|
console.log("a = " + robot.a.toString());
|
||||||
|
console.log("b = " + robot.b.toString());
|
||||||
|
console.log("c = " + robot.c.toString());
|
||||||
|
expect(robot.alpha).toBe(Math.PI/3);
|
||||||
|
expect(robot.beta).toBe(-Math.PI/3);
|
||||||
|
});
|
||||||
|
|
||||||
|
*/
|
||||||
59
test/Robot.02_UpperArm.test.js
Executable file
59
test/Robot.02_UpperArm.test.js
Executable file
@@ -0,0 +1,59 @@
|
|||||||
|
const Robot = require('../robot/Robot.js');
|
||||||
|
|
||||||
|
test('Grade ausgestreckt', () => {
|
||||||
|
robot = new Robot(300,290,10)
|
||||||
|
|
||||||
|
robot.x = 0 ;
|
||||||
|
robot.y = 600;
|
||||||
|
robot.z = 0;
|
||||||
|
robot.phi = -Math.PI/2;
|
||||||
|
robot.theta = Math.PI/2;
|
||||||
|
|
||||||
|
|
||||||
|
robot.calculateAngles3D();
|
||||||
|
|
||||||
|
expect(robot.pX).toBeLessThanOrEqual(0.00001)
|
||||||
|
expect(robot.pY).toBe(590)
|
||||||
|
expect(robot.pZ).toBeLessThanOrEqual(0.00001)
|
||||||
|
|
||||||
|
expect(robot.alpha).toBeLessThanOrEqual(0.00001)
|
||||||
|
expect(robot.beta).toBeLessThanOrEqual(0.00001)
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Grade gewinkelt', () => {
|
||||||
|
robot = new Robot(300,290,10)
|
||||||
|
|
||||||
|
robot.x = 0 ;
|
||||||
|
robot.y = 300;
|
||||||
|
robot.z = 0;
|
||||||
|
robot.phi = -Math.PI/2;
|
||||||
|
robot.theta = Math.PI/2 - Math.PI/3;
|
||||||
|
|
||||||
|
|
||||||
|
robot.calculateAngles3D();
|
||||||
|
|
||||||
|
expect(robot.pX).toBeLessThanOrEqual(0.00001)
|
||||||
|
expect(robot.pZ).toBe(10 * Math.cos(robot.theta))
|
||||||
|
|
||||||
|
expect(robot.alpha - Math.PI/3).toBeLessThanOrEqual(0.00002)
|
||||||
|
expect(robot.beta + Math.PI/3).toBeLessThanOrEqual(0.00002)
|
||||||
|
});
|
||||||
|
|
||||||
|
test('schräg gewinkelt 1', () => {
|
||||||
|
robot = new Robot(300,300,10)
|
||||||
|
|
||||||
|
robot.x = 0 ;
|
||||||
|
robot.y = 310;
|
||||||
|
robot.z = 0;
|
||||||
|
robot.phi = 0;
|
||||||
|
robot.theta = Math.PI/2;
|
||||||
|
|
||||||
|
|
||||||
|
robot.calculateAngles3D();
|
||||||
|
|
||||||
|
expect(robot.pX).toBe(10);
|
||||||
|
expect(robot.pZ).toBeLessThanOrEqual(0.001);
|
||||||
|
|
||||||
|
expect(robot.alpha - Math.PI/3).toBeLessThanOrEqual(0.02);
|
||||||
|
expect(robot.beta + Math.PI/3).toBeLessThanOrEqual(0.02);
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user