Leetro

## Contents

* 1 Leetro
* 1.1 USB Protocol
* 1.2 Leetro Commands
* 1.3 Reverse engineering resources.
* 2 Links
* 2.1 Official
* 2.2 Other Sources

# Leetro[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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 | Ranges

|
|
|
|

arc_center | 4 | 0x4020300 | (p1, p2), p3, p4, (p5, p6) |

2 <= p1 <= 4,
2 <= p2 <= 4,
0x2000001

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 | 3 | 0x3003509 | p1, p2, 0x3003509 |

0 <= p1 <= 10,000,
0 <= p2 <= 10,000,
0x2000003

c_change_voltage | 2 | 0x2003509 | p1, 0x2003509 |

0 <= p1 <= 10,000,
0x2000003

c_curve_begin | 1 | 0x1000109 | (p1, p2) |
c_curve_end | 0 | 0x209 |  |
c_delay_time | 2 | 0x2003209 | p1 * 20, 0x2003209 |

0 <= p1,
0x2000004

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 | 3 | 0x3000a09 | (p1,p2), (p3,p4), (p4,p5) |

0 <= (p2,p1) <= 1m,
0 <= (p4,p3) <= 1m,
0x2000002

c_set_multi_power | 7 | 0x7002009 | p1, p2, p3, p4, (p5,p6), (p7,p8), p9 |

0 <= (p6,p5) <= 1m,
0 <= (p8,p7) <= 1m,
0 <= p1 <= 10,000,
0 <= p2 <= 10,000,
0 <= p3 <= 10,000,
0 <= p4 <= 10,000,
0x2000002

c_set_power | 5 | 0x5002009 | p1, p2, (p3, p4), (p5,p6), p7 |

0 <= (p4,p3) <= 1m,
0 <= (p6,p5) <= 1m,
0 <= p1 <= 10,000,
0 <= p2 <= 10,0000,
0x2000003

c_set_vector_profile | 3 | 0x3000409 | (p1, p2), (p3, p4), (p5, p6) |

0 <= (p2,p1) <= 1m,
0 <= (p4,p3) <= 1m,
0x2000002

c_write_data | 3 | 0x3003309 | p1, p2, 0x3003309 |
change_multi_voltage | 2 | 0x2000120 | p1, p2 |

0 <= p1 <= 10,000,
0 <= p2 <= 10,000,
0x2000003

change_power_ontime | 1 | 0x1020109 | p1 |
change_speed_ontime | 1 | 0x1020009 | (p1,p2) |
change_voltage | 1 | 0x1000120 | p1 |

0 <= p1 <= 10,000,
0x2000003

change_voltage2 | 1 | 0x1000b20 | p1 |

0 <= p1 <= 10,000,
0x2000003

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 | 2 | 0x2010200 | p1, p2 |

2 <= p1 <= 4,
0x2000001

con_hmove2 | 3 | 0x3020200 | (p1, p3), p2, p4 |

2 <= p1 <= 4,
2 <= p3 <= 4,
0x2000001

con_line2 | 3 | 0x3022000 | (p1, p3), p2, p4 |

2 <= p1 <= 4,
2 <= p3 <= 4,
0x2000001

con_pmove | 2 | 0x2010000 | p1, p2 |

2 <= p1 <= 4,
0x2000001

con_pmove2 | 3 | 0x3020000 | (p1, p3), p2, p4 |

2 <= p1 <= 4,
2 <= p3 <= 4,
0x2000001

con_vmove | 2 | 0x2010100 | p1, p2 |

2 <= p1 <= 4,
0x2000001

con_vmove2 | 3 | 0x3020100 | (p1, p3), p2, p2 (yes, p2 twice) |

2 <= p1 <= 4,
2 <= p3 <= 4,
0x2000001

con_decel_stop | 1 | 0x1010102 | p1 |

2 <= p1 <= 4,
0x2000001

con_decel_stop2 | 1 | 0x1020102 | (p1,p2) |

2 <= p1 <= 4,
2 <= p2 <= 4,
0x2000001

con_decel_stop3 | 1 | 0x1030102 | (p1,p2,p3) |

2 <= p1 <= 4,
2 <= p2 <= 4,
2 <= p3 <= 4,
0x2000001

delay_time | 1 | 0x1000602 | p1 * 20 |

0 <= p1,
0x2000004

end_backlash | 1 | 0x1004b01 | (p1,0) |

2 <= p1 <= 4,
0x2000001

fast_arc_center | 4 | 0x4024300 | (p1, p2), p3, p4, (p5,p6) |

2 <= p1 <= 4,
2 <= p2 <= 4,
0x2000001

fast_hmove | 2 | 0x2014200 | p1, p2 |

2 <= p1 <= 4,
0x2000001

fast_hmove2 | 3 | 0x3024200 | (p1, p3), p2, p4 |

2 <= p1 <= 4,
2 <= p3 <= 4,
0x2000001

fast_line2 | 3 | 0x3026000 | (p1, p3), p2, p4 |

2 <= p1 <= 4,
2 <= p3 <= 4,
0x2000001

fast_pmove | 2 | 0x2014000 | p1, p2 |

2 <= p1 <= 4,
0x2000001

fast_pmove2 | 3 | 0x3024000 | (p1, p3), p2, p4 |

2 <= p1 <= 4,
2 <= p3 <= 4,
0x2000001

fast_vmove | 2 | 0x2014100 | p1, p2 |

2 <= p1 <= 4,
0x2000001

fast_vmove2 | 3 | 0x3024100 | (p1, p3), p2, p4 |

2 <= p1 <= 4,
2 <= p3 <= 4,
0x2000001

get_abs_pos | - | - | p1, *p2 (not export command) |

2 <= p1 <= 4,
p2 (return)

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 | defers to set_abs_pos(p1, 0) |

2 <= p1 <= 4,
0x2000001

set_abs_pos | 2 | 0x2014501 | p1, p2 |

2 <= p1 <= 4,
0x2000001

set_axis_ratio | 2 | 0x2015001 | p1, (p2, p3) |

2 <= p1 <= 4,
0x2000001

set_backlash | 2 | 0x2004a01 | p1, p2 |

2 <= p1 <= 4,
0x2000001

set_batch_flag | - | - | \- (not exported) |
set_conacc_start_speed | 1 | 0x1025101 | (p1,p2) |
set_conspeed | 2 | 0x2010001 | p1, (p2,p3) |

2 <= p1 <= 4,
0x2000001

set_cmd_counter | 2 | 0x2004c01 | p1, p2 |
set_home_mode | 1 | 0x1014001 | (p1,p2) |

2 <= p1 <= 4,
0x2000001

set_laser_mode | 1 | 0x1000220 | p1 |

0 <= p1 <= 4 (crimped),
0x2000001

set_level_in | 1 | 0x1014d01 | defers to set_level_sprt(p1, (p2)?9:0) |

2 <= p1 <= 4,
0x2000001

set_level_sprt | 1 | 0x1014d01 | (p1, p2 & 0xF) |

2 <= p1 <= 4,
0x2000001

set_maxspeed | 2 | 0x2014301 | p1, (p2, p3) |

2 <= p1 <= 4,
0 <= (p3,p2) <= 1m,
0x2000001

set_outmode | 1 | 0x1014101 | (p1,p2,p3) |

2 <= p1 <= 4,
0x2000001

set_power_mode | 1 | 0x1000320 | p1 |

0 <= p1 <= 4 (crimped),
No fail value.

set_profile | 4 | 0x4010101 | p1, (p2,p3), (p4,p5), (p6,p7) |

2 <= p1 <= 4,
0 <= (p3,p2) <= 1m,
0 <= (p5,p4) <= 1m
0x2000002

set_pwm2_frq | 1 | 0x1000a20 | p1 |

0 <= p1 < 60000,
fail returns -1

set_pwm_frq | 1 | 0x1000420 | p1 |

0 <= p1 < 60000,
fail returns -1

set_scan_startpos | 1 | 0x1000620 | p1 |
set_scan_step | 1 | 0x1000520 | p1 - 1 |
set_signal_in | 1 | 0x1014e01 | (p1, p2 & 0x1F) |

2 <= p1 <= 4,
0x2000001

set_vector_conspeed | 1 | 0x1000201 | (p1, p2) |

0 <= (p2,p1) <= 1m

set_vector_profile | 3 | 0x3000301 | (p1, p2), (p2, p3), (p5,p6) |

0 <= (p2,p1) <= 1m,
0 <= (p4,p3) <= 1m,
0x2000002

start_backlash | 1 | 0x1004b01 | (p1,2) |

2 <= p1 <= 4,
0x2000001

sudden_stop | 1 | 0x1010002 | p1 |

2 <= p1 <= 4,
0x2000001

sudden_stop2 | 2 | 0x1020002 | (p1,p2) |

2 <= p1 <= 4,
2 <= p2 <= 4,
0x2000001

sudden_stop3 | 1 | 0x1030002 | (p1,p2,p3) |

2 <= p1 <= 4,
2 <= p2 <= 4,
2 <= p3 <= 4,
0x2000001

write_data | 2 | 0x2000305 | p1, p2 |
write_data_block | p1 | 0x80000720 | p1, p2 |
write_power_data | p1 | 0x80000820 | p1, p2 |
write_power_tab | (p1,p2) | 0x80000920 | p1, p2, p3 |

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.[edit | edit source]

* 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[edit | edit source]

## Official[edit | edit source]

* Leetro

## Other Sources[edit | edit source]

* London HackerSpace London Hackerspace resources