Canned G-code: implement continuous replay of G-code stored on flash.

This commit is contained in:
Michael Moon 2014-08-30 19:23:54 +10:00 committed by Markus Hitter
parent 0723b53c44
commit aed4bfdb5b
4 changed files with 51 additions and 5 deletions

View File

@ -49,7 +49,7 @@ OBJDUMP = $(TOOLCHAIN)objdump
OBJCOPY = $(TOOLCHAIN)objcopy OBJCOPY = $(TOOLCHAIN)objcopy
OBJ = $(patsubst %.c,$(BUILDDIR)/%.o,$(SOURCES)) OBJ = $(patsubst %.c,$(BUILDDIR)/%.o,$(SOURCES)) $(BUILDDIR)/canned_gcode.o
.PHONY: all clean doc functionsbysize .PHONY: all clean doc functionsbysize
.PRECIOUS: %.o %.elf .PRECIOUS: %.o %.elf
@ -57,7 +57,7 @@ OBJ = $(patsubst %.c,$(BUILDDIR)/%.o,$(SOURCES))
all: $(BUILDDIR) $(TARGET) all: $(BUILDDIR) $(TARGET)
clean: clean:
rm -rf $(BUILDDIR) $(TARGET) *~ rm -rf $(BUILDDIR) $(TARGET) *~ canned_gcode.c
doc: Doxyfile *.c *.h doc: Doxyfile *.c *.h
doxygen $< doxygen $<
@ -107,3 +107,11 @@ $(BUILDDIR)/%.bin: $(BUILDDIR)/%.elf
$(BUILDDIR)/%.sym: $(BUILDDIR)/%.elf $(BUILDDIR)/%.sym: $(BUILDDIR)/%.elf
@echo " SYM $@" @echo " SYM $@"
@$(OBJDUMP) -t $< | perl -ne 'BEGIN { printf " ADDR NAME SIZE\n"; } /([0-9a-f]+)\s+(\w+)\s+O\s+\.(bss|data)\s+([0-9a-f]+)\s+(\w+)/ && printf "0x%04x %-20s +%d\n", eval("0x$$1") & 0xFFFF, $$5, eval("0x$$4")' | sort -k1 > $@ @$(OBJDUMP) -t $< | perl -ne 'BEGIN { printf " ADDR NAME SIZE\n"; } /([0-9a-f]+)\s+(\w+)\s+O\s+\.(bss|data)\s+([0-9a-f]+)\s+(\w+)/ && printf "0x%04x %-20s +%d\n", eval("0x$$1") & 0xFFFF, $$5, eval("0x$$4")' | sort -k1 > $@
canned_gcode.c: canned_gcode.g
@echo " GEN $@"
@echo "#include \"canned_gcode.h\"" > $@
@echo "" >> $@
@echo -n "const char canned_gcode_P[] PROGMEM = \"" >> $@
@perl -pe 's/\n/\\n/gs' $< >> $@
@echo "\";" >> $@

3
canned_gcode.g Normal file
View File

@ -0,0 +1,3 @@
G28
G1 X100
G1 X0

3
canned_gcode.h Normal file
View File

@ -0,0 +1,3 @@
#include <avr/pgmspace.h>
extern const char canned_gcode_P[] PROGMEM;

View File

@ -254,13 +254,45 @@ int main (void)
#endif #endif
init(); init();
#ifdef CANNED_CYCLE
#include "canned_gcode.h"
uint32_t canned_gcode_pos = 0;
#endif /* CANNED_CYCLE */
// main loop // main loop
for (;;) for (;;)
{ {
// if queue is full, no point in reading chars- host will just have to wait // if queue is full, no point in reading chars- host will just have to wait
if ((serial_rxchars() != 0) && (queue_full() == 0)) { if (queue_full() == 0) {
uint8_t c = serial_popchar(); if (serial_rxchars() != 0) {
gcode_parse_char(c); uint8_t c = serial_popchar();
gcode_parse_char(c);
}
#ifdef CANNED_CYCLE
/**
WARNING!
This code works on a per-character basis.
Any data received over serial WILL be randomly distributed through
the canned gcode, and you'll have a big mess!
The solution is to either store gcode parser state with each source,
or only parse a line at a time.
This will take extra ram, and may be out of scope for the Teacup
project.
If ever print-from-SD card is implemented, these changes may become
necessary.
*/
if (pgm_read_byte(canned_gcode_P[++canned_gcode_pos]) == 0)
canned_gcode_pos = 0;
else
gcode_parse_char(pgm_read_byte(canned_gcode_P[canned_gcode_pos]));
#endif /* CANNED_CYCLE */
} }
clock(); clock();