Leetro
Leetro
The Leetro laser cutter board is a proprietary controller with proprietary software. In the case of Leetro this software is called `LaserCut`. Like most proprietary laser cutting software intended for a specific board it has significant disadvantages and the only open source solutions are attempts at reverse engineering. In this case the reverse engineering is still very minor and scattershot. To the point that there do not seem to be any third party applications that work with the software.
USB Protocol
The usb device is located at vendor 0548 with a PID of 1005
These are sent to endpoint 0x04 and read from 0x88.
Leetro Commands
There are some parsing attempts made through London Hackerspace to decode .mol files, here's a list of the commands and their values:
Command | Length | Code | Parameters | |
---|---|---|---|---|
arc_center | - | 0x4020300 | 0x2000001 (param1 or param2 failure) | |
arc_center | 4 | 0x4020300 | (p1, p2), p3, p4, (p5, p6) | |
c_arc_curve | 3 | 0x3000c09 | p1, p2, (p3,p4) | |
c_bzerve_curve | 8 | 0x8000b09 | p1, p2, p3, p4, p5, p6, p7, p8 | |
c_change_multi_voltage | - | 0x3003509 | 0x2000003 (p1 or p2 failure) | |
c_change_multi_voltage | 3 | 0x3003509 | p1, p2, 0x3003509 | |
c_change_voltage | - | 0x2003509 | 0x2000003 (p1 failure) | |
c_change_voltage | 2 | 0x2003509 | p1, 0x2003509 | |
c_curve_begin | 1 | 0x1000109 | (p1, p2) | |
c_curve_end | 0 | 0x209 | ||
c_delay_time | - | 0x2003209 | 0x2000004 (p1 failure) | |
c_delay_time | 2 | 0x2003209 | p1 * 20, 0x2003209 | |
c_fast_line2 | 2 | 0x2020309 | p1, p2 | |
c_outport_bit | 2 | 0x2003609 | (p1 - 1), 0x2003609 | |
c_outport_byte | 2 | 0x2003709 | p1 & 3F, 0x2003709 | |
c_set_laser_mode | 2 | 0x2003409 | p1 | 0x2003409 |
c_set_lkh_length | 1 | 0x1000e09 | p1 | |
c_set_lkh_step | 1 | 0x1000d09 | p1 | |
c_set_max_accel | 1 | 0x1004509 | (p1, p2) | |
c_set_move_profile | - | 0x3000a09 | 0x2000002 ((p2,p1) or (p4,p3) failure) | |
c_set_move_profile | 3 | 0x3000a09 | (p1,p2), (p3,p4), (p4,p5) | |
c_set_multi_power | - | 0x7002009 | 0x2000002 ((p6,p5), (p8,p7), p1, p2, p3, p4 failure) | |
c_set_multi_power | 7 | 0x7002009 | p1, p2, p3, p4, (p5,p6), (p7,p8), p9 | |
c_set_power | - | 0x5002009 | 0x2000003 ((p4,p3), (p6,p5), p1, p2 failure) | |
c_set_power | 5 | 0x5002009 | p1, p2, (p3, p4), (p5,p6), p7 | |
c_set_vector_profile | - | 0x3000409 | 0x2000002 | |
c_set_vector_profile | 3 | 0x3000409 | (p1, p2), (p3, p4), (p5, p6) | |
c_write_data | 3 | 0x3003309 | p1, p2, 0x3003309 | |
change_multi_voltage | - | 0x2000120 | 0x2000003 | |
change_multi_voltage | 2 | 0x2000120 | p1, p2 | |
change_power_ontime | 1 | 0x1020109 | p1 | |
change_speed_ontime | 1 | 0x1020009 | (p1,p2) | |
change_voltage | - | 0x1000120 | 0x2000003 (p1 failure) | |
change_voltage | 1 | 0x1000120 | p1 | |
change_voltage2 | - | 0x1000b20 | 0x2000003 (p1 failure) | |
change_voltage2 | 1 | 0x1000b20 | p1 | |
check_batch_done | - | - | - (not export command) | |
check_done | - | - | p1 (not export command) | |
check_home | - | - | p1 (not export command) | |
check_limit | - | - | p1 (not export command) | |
check_SD | - | - | p1 (not export command) | |
check_status | - | - | p1 (not export command) | |
check_status32 | - | - | p1 (not export command) | |
checkin_bit | - | - | (p1 - 1) (not export command) | |
checkin_byte | - | - | - (not export command) | |
con_hmove | - | 0x2010200 | 0x2000001 (p1 failure) | |
con_hmove | 2 | 0x2010200 | p1, p2 | |
con_hmove2 | - | 0x3020200 | 0x2000001 (p1, p3 failure) | |
con_hmove2 | 3 | 0x3020200 | (p1, p3), p2, p4 | |
con_line2 | - | 0x3022000 | 0x2000001 (p1, p3 failure) | |
con_line2 | 3 | 0x3022000 | (p1, p3), p2, p4 | |
con_pmove | - | 0x2010000 | 0x2000001 (p1 failure) | |
con_pmove | 2 | 0x2010000 | p1, p2 | |
con_pmove2 | - | 0x3020000 | 0x2000001 (p1, p3 failure) | |
con_pmove2 | 3 | 0x3020000 | (p1, p3), p2, p4 | |
con_vmove | - | 0x2010100 | 0x2000001 (p1 failure) | |
con_vmove | 2 | 0x2010100 | p1, p2 | |
con_vmove2 | - | 0x3020100 | 0x2000001 (p1, p3 failure) | |
con_vmove2 | 3 | 0x3020100 | (p1, p3), p2, p2 (yes, p2 twice) | |
con_decel_stop | - | 0x1010102 | 0x2000001 (p1 failure) | |
con_decel_stop | 1 | 0x1010102 | p1 | |
con_decel_stop2 | - | 0x1020102 | 0x2000001 (p1, p2 failure) | |
con_decel_stop2 | 1 | 0x1020102 | (p1,p2) | |
con_decel_stop3 | - | 0x1030102 | 0x2000001 (p1, p2, p3 failure) | |
con_decel_stop3 | 1 | 0x1030102 | (p1,p2,p3) | |
delay_time | - | 0x1000602 | 0x2000004 (p1 failure) | |
delay_time | 1 | 0x1000602 | p1 * 20 | |
end_backlash | - | 0x1004b01 | 0x2000001 (p1 failure) | |
end_backlash | 1 | 0x1004b01 | (p1,0) | |
fast_arc_center | - | 0x4024300 | 0x2000001 (p1, p2 failure) | |
fast_arc_center | 4 | 0x4024300 | (p1, p2), p3, p4, (p5,p6) | |
fast_hmove | - | 0x2014200 | 0x2000001 (p1 failure) | |
fast_hmove | 2 | 0x2014200 | p1, p2 | |
fast_hmove2 | - | 0x3024200 | 0x2000001 (p1, p3 failure) | |
fast_hmove2 | 3 | 0x3024200 | (p1, p3), p2, p4 | |
fast_line2 | - | 0x3026000 | 0x2000001 (p1, p3 failure) | |
fast_line2 | 3 | 0x3026000 | (p1, p3), p2, p4 | |
fast_pmove | - | 0x2014000 | 0x2000001 (p1 failure) | |
fast_pmove | 2 | 0x2014000 | p1, p2 | |
fast_pmove2 | - | 0x3024000 | 0x2000001 (p1, p3 failure) | |
fast_pmove2 | 3 | 0x3024000 | (p1, p3), p2, p4 | |
fast_vmove | - | 0x2014100 | 0x2000001 (p1 failure) | |
fast_vmove | 2 | 0x2014100 | p1, p2 | |
fast_vmove2 | - | 0x3024100 | 0x2000001 (p1, p3 failure) | |
fast_vmove2 | 3 | 0x3024100 | (p1, p3), p2, p4 | |
get_abs_pos | - | - | p1, *p2 (not export command) | |
get_fmw_ver | - | - | - (not export command) | |
get_hdw_ver | - | - | - (not export command) | |
get_lib_ver | - | - | - (not export command) | |
get_sn | - | - | - (not export command) | |
get_init_board | - | - | - (not export command) | |
move_pause | 0 | 0x202 | ||
move_resume | 0 | 0x302 | ||
outport_bit | 1 | 0x1000105 | (p1 -1) | |
outport_byte | 1 | 0x1000205 | p1 & 0x3F | |
read_data | - | - | p1 (not export command) | |
reset_pos | - | 0x2014501 | 0x2000001 (p1, failure) | |
reset_pos | - | 0x2014501 | defers to set_abs_pos(p1, 0) | |
set_abs_pos | - | 0x2014501 | 0x2000001 (p1 failure) | |
set_abs_pos | 2 | 0x2014501 | p1, p2 | |
set_axis_ratio | - | 0x2015001 | 0x2000001 (p1 failure) | |
set_axis_ratio | 2 | 0x2015001 | p1, (p2, p3) | |
set_backlash | - | 0x2004a01 | 0x2000001 (p1 failure) | |
set_backlash | 2 | 0x2004a01 | p1, p2 | |
set_batch_flag | - | - | - (not exported) | |
set_conacc_start_speed | 1 | 0x1025101 | (p1,p2) | |
set_conspeed | - | 0x2010001 | 0x2000001 (p1 failure) | |
set_conspeed | 2 | 0x2010001 | p1, (p2,p3) | |
set_home_mode | - | 0x1014001 | 0x2000001 | |
set_home_mode | 1 | 0x1014001 | (p1,p2) | |
set_laser_mode | 1 | 0x1000220 | p1 [0-4] | |
set_level_in | - | 0x1014d01 | 0x2000001 (p1 failure) | |
set_level_in | 1 | 0x1014d01 | defers to set_level_sprt(p1, (p2)?9:0) | |
set_level_sprt | - | 0x1014d01 | 0x2000001 (p1 failure) | |
set_level_sprt | 1 | 0x1014d01 | (p1, p2 & 0xF) | |
set_maxspeed | - | 0x2014301 | 0x2000001 (p1, (p3,p2) failure) | |
set_maxspeed | 2 | 0x2014301 | p1, (p2, p3) | |
set_outmode | - | 0x1014101 | 0x2000001 (p1 failure) | |
set_outmode | 1 | 0x1014101 | (p1,p2,p3) | |
set_power_mode | ||||
set_profile | ||||
set_pwm2_frq | ||||
set_pwm_frq | ||||
set_scan_startpos | ||||
set_scan_step | ||||
set_signal_in | ||||
set_vector_conspeed | ||||
set_vector_profile | ||||
start_backlash | ||||
sudden_stop | ||||
sudden_stop2 | ||||
sudden_stop3 | ||||
write_data | ||||
write_data_block | ||||
write_power_tab | ||||
m_fast_line2 | ||||
m_set_vector_profile2 | ||||
reset_err | ||||
set_s_section | ||||
show_err |
init_board calls a series of commands to set these to valid and acceptable defaults:
Command Called | Static Paramaters Used |
---|---|
set_batch_flag | 1 |
set_maxspeed | 0, 0x412e8480 |
set_out_mode | 1, 0 |
set_home_mode | 0 |
set_con_speed | 0 , 0x409f4000 |
set_profile | 0, 0x409f4000, 0, 0x40bf4000, 0, 0x40f38800 |
set_vector_conspeed | 0, 0x409f4000 |
set_vector_profile | 0, 0x409f4000, 0, 0x40bf4000, 0, 0x40f38800 |
set_laser_mode | 0 |
Reverse engineering resources.
- Richard-sim has a fake dll that pretends to be the relevant controller dll and replaces the actual dll used in LaserCut so that it will write all the materials rather than send them to a laser. https://github.com/richard-sim/mpc05ls
- The London Hackerspace Wiki has a great collection of resources for Leetro reverse engineering. (https://wiki.london.hackspace.org.uk/view/Project:RELaserSoftware)
- The Mol parser also from London Hacker Space. https://github.com/londonhackspace/dumpmol
- The explanation for the files format. https://wiki.london.hackspace.org.uk/view/Project:RELaserSoftware/USB_protocol
- Some cursory work done to control the laser. https://pointless.net/hg/mpc6515/
Links
Official
Other Sources
- London HackerSpace London Hackerspace resources