diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | maps/map1.map | bin | 0 -> 84 bytes | |||
-rw-r--r-- | maps/map1.txt | 16 | ||||
-rw-r--r-- | maps/map2.map | bin | 0 -> 17 bytes | |||
-rw-r--r-- | maps/map2.txt | 5 | ||||
-rwxr-xr-x | maps/mapgen.py | 31 | ||||
-rwxr-xr-x | maps/mapprint.py | 24 | ||||
-rw-r--r-- | maps/readme.md | 32 |
8 files changed, 109 insertions, 0 deletions
@@ -1,4 +1,5 @@ compile_commands.json +__pycache__ *.o robot/out.hex robot/a.out diff --git a/maps/map1.map b/maps/map1.map Binary files differnew file mode 100644 index 0000000..980c069 --- /dev/null +++ b/maps/map1.map diff --git a/maps/map1.txt b/maps/map1.txt new file mode 100644 index 0000000..37ab452 --- /dev/null +++ b/maps/map1.txt @@ -0,0 +1,16 @@ +c559e59c98 +ac16f163aa +aac92c553a +6ba6969c9a +c369ac7be3 +69cba2c3e9 +c3aae9ac3a +2c3a26361a +c38a8c559a +6d3673c532 +cfddddf988 +efff777baa +eff3000aaa +eff9000efb +efffdddbaa +6777777322 diff --git a/maps/map2.map b/maps/map2.map Binary files differnew file mode 100644 index 0000000..c7777c9 --- /dev/null +++ b/maps/map2.map diff --git a/maps/map2.txt b/maps/map2.txt new file mode 100644 index 0000000..6465c5a --- /dev/null +++ b/maps/map2.txt @@ -0,0 +1,5 @@ +c5559 +ac59a +aa8aa +a63aa +6553a diff --git a/maps/mapgen.py b/maps/mapgen.py new file mode 100755 index 0000000..a7e6817 --- /dev/null +++ b/maps/mapgen.py @@ -0,0 +1,31 @@ +import sys +from struct import pack + +def mapgen(filename): + file = open(filename, 'r') + target = open(filename + '.map', 'wb') + contents = file.read() + + lines = contents.strip().split("\n") + target.write(pack('>H', len(lines[0]))) + target.write(pack('>H', len(lines))) + + first_nibble = False + temp_byte = 0 + for char in contents.replace('\n', '').strip(): + first_nibble = not first_nibble + num = int(char, 16) + temp_byte |= num << (4 * first_nibble) + if not first_nibble: + target.write(pack('B', temp_byte)) + temp_byte = 0 + if first_nibble: target.write(pack('B', temp_byte)) + + file.close() + target.close() + +if __name__ == "__main__": + if len(sys.argv) > 1: + mapgen(sys.argv[1]) + else: + exit(1) diff --git a/maps/mapprint.py b/maps/mapprint.py new file mode 100755 index 0000000..4b56db6 --- /dev/null +++ b/maps/mapprint.py @@ -0,0 +1,24 @@ +import sys +from struct import unpack + +def mapprint(filename): + file = open(filename, 'rb') + contents = file.read() + file.close() + + width, height = unpack('>HH', contents[0:4]) + + for y in range(height): + for x in range(width): + nibble = x + y * width + byte = int(nibble / 2) + shift = byte * 2 - nibble + 1 + num = (contents[4 + byte] & (0xf << 4 * shift)) >> 4 * shift + print(" ─│┘──└┴│┐│┤┌┬├┼"[num], end='') + print("\n", end='') + +if __name__ == "__main__": + if len(sys.argv) > 1: + mapprint(sys.argv[1]) + else: + exit(1) diff --git a/maps/readme.md b/maps/readme.md new file mode 100644 index 0000000..85f94b0 --- /dev/null +++ b/maps/readme.md @@ -0,0 +1,32 @@ +# maps + +this directory contains map files. a .map file contains a binary representation +of a maze, and can be sent to the robot over the wireless serial connection. +map files have the following structure: first the width of the map as an +unsigned 16-bit integer, then the height of the map also as an unsigned 16-bit +integer. the rest of the file is the map content in reading order, where each +byte contains two (nibble) map tiles. tiles are stored in the most significant +portion of the byte first, so the last byte of a map file containing an uneven +amount of tiles would look like `0x?0`. + +example tile: + +``` +┌───────┐ ┌───┬───┐ +│ b │ │ │ │ +│ a c │ │ └───┤ +│ d │ │ │ +└───────┘ └───────┘ + 0bDCBA 0b0110 (0x6) +``` + +garbage python scripts for generating and viewing these maps are included. +[this](https://www.figma.com/file/GUKV1am9sqWpPoes9h8Ram/robotrun?node-id=0%3A1) +figma file can be used to create a map, and then read out the hexadecimal +notation for the map. google drive ocr works well enough to read out the red +characters if you turn off path visibility in the figma document. figma also +allows pdf export so you can print the maps, but the tiles are 24x24 pixels, +not robot-sized (one tile is supposed to have about the same width and height +as the robot's diameter). but maybe i'll make another script that stitches +together the map tiles as svg, and then converts the whole thing to pdf. + |