| 
									
										
										
										
											2017-04-27 15:14:11 -04:00
										 |  |  | The Klippy host code has some tools to help in debugging. | 
					
						
							| 
									
										
										
										
											2016-05-25 11:37:40 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-27 15:14:11 -04:00
										 |  |  | Translating gcode files to micro-controller commands | 
					
						
							|  |  |  | ==================================================== | 
					
						
							| 
									
										
										
										
											2016-09-10 20:49:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | The Klippy host code can run in a batch mode to produce the low-level | 
					
						
							| 
									
										
										
										
											2017-04-27 15:14:11 -04:00
										 |  |  | micro-controller commands associated with a gcode file. Inspecting | 
					
						
							|  |  |  | these low-level commands is useful when trying to understand the | 
					
						
							| 
									
										
										
										
											2016-09-10 20:49:25 -04:00
										 |  |  | actions of the low-level hardware. It can also be useful to compare | 
					
						
							| 
									
										
										
										
											2017-04-27 15:14:11 -04:00
										 |  |  | the difference in micro-controller commands after a code change. | 
					
						
							| 
									
										
										
										
											2016-09-10 20:49:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | To run Klippy in this batch mode, there is a one time step necessary | 
					
						
							| 
									
										
										
										
											2017-04-27 15:14:11 -04:00
										 |  |  | to generate the micro-controller "data dictionary". This is done by | 
					
						
							|  |  |  | compiling the micro-controller code to obtain the **out/klipper.dict** | 
					
						
							|  |  |  | file: | 
					
						
							| 
									
										
										
										
											2016-09-10 20:49:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | make menuconfig | 
					
						
							|  |  |  | make | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Once the above is done it is possible to run Klipper in batch mode | 
					
						
							|  |  |  | (see [installation](Installation.md) for the steps necessary to build | 
					
						
							|  |  |  | the python virtual environment and a printer.cfg file): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | ~/klippy-env/bin/python ./klippy/klippy.py ~/printer.cfg -i test.gcode -o test.serial -v -d out/klipper.dict | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The above will produce a file **test.serial** with the binary serial | 
					
						
							|  |  |  | output. This output can be translated to readable text with: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | ~/klippy-env/bin/python ./klippy/parsedump.py out/klipper.dict test.serial > test.txt | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The resulting file **test.txt** contains a human readable list of | 
					
						
							| 
									
										
										
										
											2017-04-27 15:14:11 -04:00
										 |  |  | micro-controller commands. | 
					
						
							| 
									
										
										
										
											2016-09-10 20:49:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | The batch mode disables certain response / request commands in order | 
					
						
							|  |  |  | to function. As a result, there will be some differences between | 
					
						
							| 
									
										
										
										
											2017-04-27 15:14:11 -04:00
										 |  |  | actual commands and the above output. The generated data is useful for | 
					
						
							|  |  |  | testing and inspection; it is not useful for sending to a real | 
					
						
							|  |  |  | micro-controller. | 
					
						
							| 
									
										
										
										
											2016-09-10 20:49:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-25 11:37:40 -04:00
										 |  |  | Testing with simulavr | 
					
						
							|  |  |  | ===================== | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The [simulavr](http://www.nongnu.org/simulavr/) tool enables one to | 
					
						
							|  |  |  | simulate an Atmel ATmega micro-controller. This section describes how | 
					
						
							|  |  |  | one can run test gcode files through simulavr. It is recommended to | 
					
						
							|  |  |  | run this on a desktop class machine (not a Raspberry Pi) as it does | 
					
						
							|  |  |  | require significant cpu to run efficiently. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To use simulavr, download the simulavr package and compile with python | 
					
						
							|  |  |  | support: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | git clone git://git.savannah.nongnu.org/simulavr.git | 
					
						
							|  |  |  | cd simulavr | 
					
						
							|  |  |  | ./bootstrap | 
					
						
							|  |  |  | ./configure --enable-python | 
					
						
							|  |  |  | make | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Note that the build system may need to have some packages (such as | 
					
						
							|  |  |  | swig) installed in order to build the python module. Make sure the | 
					
						
							|  |  |  | file **src/python/_pysimulavr.so** is present after the above | 
					
						
							|  |  |  | compilation. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To compile Klipper for use in simulavr, run: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | cd /patch/to/klipper | 
					
						
							|  |  |  | make menuconfig | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 11:04:59 -04:00
										 |  |  | and compile the micro-controller software for an AVR atmega644p, set | 
					
						
							|  |  |  | the MCU frequency to 20Mhz, and select SIMULAVR software emulation | 
					
						
							|  |  |  | support. Then one can compile Klipper (run `make`) and then start the | 
					
						
							|  |  |  | simulation with: | 
					
						
							| 
									
										
										
										
											2016-05-25 11:37:40 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2016-06-10 19:51:04 -04:00
										 |  |  | PYTHONPATH=/path/to/simulavr/src/python/ ./scripts/avrsim.py -m atmega644 -s 20000000 -b 250000 out/klipper.elf | 
					
						
							| 
									
										
										
										
											2016-05-25 11:37:40 -04:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Then, with simulavr running in another window, one can run the | 
					
						
							|  |  |  | following to read gcode from a file (eg, "test.gcode"), process it | 
					
						
							| 
									
										
										
										
											2017-04-11 12:49:12 -04:00
										 |  |  | with Klippy, and send it to Klipper running in simulavr (see | 
					
						
							|  |  |  | [installation](Installation.md) for the steps necessary to build the | 
					
						
							|  |  |  | python virtual environment): | 
					
						
							| 
									
										
										
										
											2016-05-25 11:37:40 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | ~/klippy-env/bin/python ./klippy/klippy.py config/avrsim.cfg -i test.gcode -v | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Using simulavr with gtkwave | 
					
						
							|  |  |  | --------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | One useful feature of simulavr is its ability to create signal wave | 
					
						
							|  |  |  | generation files with the exact timing of events. To do this, follow | 
					
						
							|  |  |  | the directions above, but run avrsim.py with a command-line like the | 
					
						
							|  |  |  | following: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2016-06-10 19:51:04 -04:00
										 |  |  | PYTHONPATH=/path/to/simulavr/src/python/ ./scripts/avrsim.py -m atmega644 -s 20000000 -b 250000 out/klipper.elf -t PORTA.PORT,PORTC.PORT | 
					
						
							| 
									
										
										
										
											2016-05-25 11:37:40 -04:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The above would create a file **avrsim.vcd** with information on each | 
					
						
							|  |  |  | change to the GPIOs on PORTA and PORTB. This could then be viewed | 
					
						
							|  |  |  | using gtkwave with: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | gtkwave avrsim.vcd | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Manually sending commands to the micro-controller | 
					
						
							|  |  |  | ------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Normally, Klippy would be used to translate gcode commands to Klipper | 
					
						
							|  |  |  | commands. However, it's also possible to manually send Klipper | 
					
						
							|  |  |  | commands (functions marked with the DECL_COMMAND() macro in the | 
					
						
							|  |  |  | Klipper source code). To do so, run: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2016-06-10 19:51:04 -04:00
										 |  |  | ~/klippy-env/bin/python ./klippy/console.py /tmp/pseudoserial 250000 | 
					
						
							| 
									
										
										
										
											2016-05-25 11:37:40 -04:00
										 |  |  | ``` | 
					
						
							| 
									
										
										
										
											2017-04-11 13:41:11 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | Generating load graphs | 
					
						
							|  |  |  | ====================== | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The Klippy log file (/tmp/klippy.log) stores statistics on bandwidth, | 
					
						
							|  |  |  | micro-controller load, and host buffer load. It can be useful to graph | 
					
						
							|  |  |  | these statistics after a print. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To generate a graph, a one time step is necessary to install the | 
					
						
							|  |  |  | "matplotlib" package: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | sudo apt-get update | 
					
						
							|  |  |  | sudo apt-get install python-matplotlib | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Then graphs can be produced with: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | ~/klipper/scripts/graphstats.py /tmp/klippy.log loadgraph.png | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | One can then view the resulting **loadgraph.png** file. |