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