
A sample of SFE's ColorLCDShield library demonstrating Conway's Game of Life
Dependencies: ColorLCDShield mbed
main.cpp@1:eed4416d3359, 2015-02-22 (annotated)
- Committer:
- kayekss
- Date:
- Sun Feb 22 17:18:04 2015 +0000
- Revision:
- 1:eed4416d3359
- Parent:
- 0:bc852e1d0b48
Initial release with swimming blinkership
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kayekss | 0:bc852e1d0b48 | 1 | // ColorLCDShield_Conway |
kayekss | 0:bc852e1d0b48 | 2 | // --------------------- |
kayekss | 0:bc852e1d0b48 | 3 | // A program example using Sparkfun's Color LCD Shield for FRDM-KL25Z boards. |
kayekss | 0:bc852e1d0b48 | 4 | // - https://www.sparkfun.com/products/9363 |
kayekss | 0:bc852e1d0b48 | 5 | // - The library has modified from Sparkfun's Arduino library code |
kayekss | 0:bc852e1d0b48 | 6 | // - Conway's Life Game simulator in a 128x128 world |
kayekss | 0:bc852e1d0b48 | 7 | |
kayekss | 0:bc852e1d0b48 | 8 | #include <stdint.h> |
kayekss | 0:bc852e1d0b48 | 9 | #include "mbed.h" |
kayekss | 0:bc852e1d0b48 | 10 | #include "ColorLCDShield.h" |
kayekss | 0:bc852e1d0b48 | 11 | #include "Conway.h" |
kayekss | 0:bc852e1d0b48 | 12 | |
kayekss | 0:bc852e1d0b48 | 13 | LCDShield lcd; |
kayekss | 0:bc852e1d0b48 | 14 | DigitalIn sw1(D3); |
kayekss | 0:bc852e1d0b48 | 15 | DigitalIn sw2(D4); |
kayekss | 0:bc852e1d0b48 | 16 | DigitalIn sw3(D5); |
kayekss | 0:bc852e1d0b48 | 17 | AnalogIn seed(A0); |
kayekss | 0:bc852e1d0b48 | 18 | |
kayekss | 0:bc852e1d0b48 | 19 | Conway life; |
kayekss | 0:bc852e1d0b48 | 20 | Timer timer; |
kayekss | 0:bc852e1d0b48 | 21 | |
kayekss | 0:bc852e1d0b48 | 22 | void drawWorld() { |
kayekss | 0:bc852e1d0b48 | 23 | static bool firstTime = true; |
kayekss | 0:bc852e1d0b48 | 24 | uint8_t b; |
kayekss | 0:bc852e1d0b48 | 25 | uint16_t ix8; |
kayekss | 0:bc852e1d0b48 | 26 | |
kayekss | 0:bc852e1d0b48 | 27 | for (uint8_t j = 0; j < 128; j++) { |
kayekss | 0:bc852e1d0b48 | 28 | for (uint8_t i = 0; i < 16; i++) { |
kayekss | 0:bc852e1d0b48 | 29 | b = life.world[j][i]; |
kayekss | 0:bc852e1d0b48 | 30 | if (firstTime || b != life.worldTemp[j][i]) { |
kayekss | 0:bc852e1d0b48 | 31 | ix8 = i << 3; |
kayekss | 0:bc852e1d0b48 | 32 | lcd.setPixel(b & 0x80 ? 0xfff : 0x000, j, ix8); |
kayekss | 0:bc852e1d0b48 | 33 | lcd.setPixel(b & 0x40 ? 0xfff : 0x000, j, ix8 + 1); |
kayekss | 0:bc852e1d0b48 | 34 | lcd.setPixel(b & 0x20 ? 0xfff : 0x000, j, ix8 + 2); |
kayekss | 0:bc852e1d0b48 | 35 | lcd.setPixel(b & 0x10 ? 0xfff : 0x000, j, ix8 + 3); |
kayekss | 0:bc852e1d0b48 | 36 | lcd.setPixel(b & 0x08 ? 0xfff : 0x000, j, ix8 + 4); |
kayekss | 0:bc852e1d0b48 | 37 | lcd.setPixel(b & 0x04 ? 0xfff : 0x000, j, ix8 + 5); |
kayekss | 0:bc852e1d0b48 | 38 | lcd.setPixel(b & 0x02 ? 0xfff : 0x000, j, ix8 + 6); |
kayekss | 0:bc852e1d0b48 | 39 | lcd.setPixel(b & 0x01 ? 0xfff : 0x000, j, ix8 + 7); |
kayekss | 0:bc852e1d0b48 | 40 | } |
kayekss | 0:bc852e1d0b48 | 41 | } |
kayekss | 0:bc852e1d0b48 | 42 | } |
kayekss | 0:bc852e1d0b48 | 43 | firstTime = false; |
kayekss | 0:bc852e1d0b48 | 44 | } |
kayekss | 0:bc852e1d0b48 | 45 | |
kayekss | 0:bc852e1d0b48 | 46 | void setup() { |
kayekss | 1:eed4416d3359 | 47 | sw1.mode(PullUp); |
kayekss | 1:eed4416d3359 | 48 | sw2.mode(PullUp); |
kayekss | 1:eed4416d3359 | 49 | sw3.mode(PullUp); |
kayekss | 1:eed4416d3359 | 50 | |
kayekss | 0:bc852e1d0b48 | 51 | lcd.init(PHILIPS); |
kayekss | 0:bc852e1d0b48 | 52 | lcd.contrast(-63); |
kayekss | 0:bc852e1d0b48 | 53 | lcd.clear(0x444); |
kayekss | 0:bc852e1d0b48 | 54 | |
kayekss | 0:bc852e1d0b48 | 55 | // Blinker ship 1 |
kayekss | 0:bc852e1d0b48 | 56 | // http://conwaylife.com/wiki/Blinker_ship_1 |
kayekss | 0:bc852e1d0b48 | 57 | uint8_t offsetX = 64 >> 3; |
kayekss | 0:bc852e1d0b48 | 58 | uint8_t offsetY = 64; |
kayekss | 0:bc852e1d0b48 | 59 | |
kayekss | 0:bc852e1d0b48 | 60 | life.world[offsetY - 4][offsetX - 1] = 0x60; |
kayekss | 0:bc852e1d0b48 | 61 | life.world[offsetY - 3][offsetX - 1] = 0xd8; |
kayekss | 0:bc852e1d0b48 | 62 | life.world[offsetY - 2][offsetX - 1] = 0x78; |
kayekss | 0:bc852e1d0b48 | 63 | life.world[offsetY - 1][offsetX - 1] = 0x31; |
kayekss | 0:bc852e1d0b48 | 64 | life.world[offsetY ][offsetX - 1] = 0x02; |
kayekss | 0:bc852e1d0b48 | 65 | life.world[offsetY + 1][offsetX - 1] = 0x31; |
kayekss | 0:bc852e1d0b48 | 66 | life.world[offsetY + 2][offsetX - 1] = 0x78; |
kayekss | 0:bc852e1d0b48 | 67 | life.world[offsetY + 3][offsetX - 1] = 0xd8; |
kayekss | 0:bc852e1d0b48 | 68 | life.world[offsetY + 4][offsetX - 1] = 0x60; |
kayekss | 0:bc852e1d0b48 | 69 | |
kayekss | 0:bc852e1d0b48 | 70 | life.world[offsetY - 7][offsetX ] = 0x3c; |
kayekss | 0:bc852e1d0b48 | 71 | life.world[offsetY - 6][offsetX ] = 0x22; |
kayekss | 0:bc852e1d0b48 | 72 | life.world[offsetY - 5][offsetX ] = 0x20; |
kayekss | 0:bc852e1d0b48 | 73 | life.world[offsetY - 4][offsetX ] = 0x12; |
kayekss | 0:bc852e1d0b48 | 74 | life.world[offsetY - 2][offsetX ] = 0x80; |
kayekss | 0:bc852e1d0b48 | 75 | life.world[offsetY - 1][offsetX ] = 0x60; |
kayekss | 0:bc852e1d0b48 | 76 | life.world[offsetY ][offsetX ] = 0x20; |
kayekss | 0:bc852e1d0b48 | 77 | life.world[offsetY + 1][offsetX ] = 0x60; |
kayekss | 0:bc852e1d0b48 | 78 | life.world[offsetY + 2][offsetX ] = 0x80; |
kayekss | 0:bc852e1d0b48 | 79 | life.world[offsetY + 4][offsetX ] = 0x12; |
kayekss | 0:bc852e1d0b48 | 80 | life.world[offsetY + 5][offsetX ] = 0x20; |
kayekss | 0:bc852e1d0b48 | 81 | life.world[offsetY + 6][offsetX ] = 0x22; |
kayekss | 0:bc852e1d0b48 | 82 | life.world[offsetY + 7][offsetX ] = 0x3c; |
kayekss | 0:bc852e1d0b48 | 83 | |
kayekss | 0:bc852e1d0b48 | 84 | life.world[offsetY - 1][offsetX + 1] = 0x10; |
kayekss | 0:bc852e1d0b48 | 85 | life.world[offsetY ][offsetX + 1] = 0x10; |
kayekss | 0:bc852e1d0b48 | 86 | life.world[offsetY + 1][offsetX + 1] = 0x10; |
kayekss | 0:bc852e1d0b48 | 87 | |
kayekss | 0:bc852e1d0b48 | 88 | life.world[offsetY - 1][offsetX + 2] = 0xe0; |
kayekss | 0:bc852e1d0b48 | 89 | life.world[offsetY ][offsetX + 2] = 0xa0; |
kayekss | 0:bc852e1d0b48 | 90 | life.world[offsetY + 1][offsetX + 2] = 0xe0; |
kayekss | 0:bc852e1d0b48 | 91 | |
kayekss | 0:bc852e1d0b48 | 92 | drawWorld(); |
kayekss | 0:bc852e1d0b48 | 93 | |
kayekss | 0:bc852e1d0b48 | 94 | // Start timer |
kayekss | 0:bc852e1d0b48 | 95 | timer.start(); |
kayekss | 0:bc852e1d0b48 | 96 | } |
kayekss | 0:bc852e1d0b48 | 97 | |
kayekss | 0:bc852e1d0b48 | 98 | void switches() { |
kayekss | 0:bc852e1d0b48 | 99 | static bool sw1Prev, sw2Prev, sw3Prev; |
kayekss | 0:bc852e1d0b48 | 100 | |
kayekss | 0:bc852e1d0b48 | 101 | if (!sw1 && sw1Prev) { |
kayekss | 0:bc852e1d0b48 | 102 | life.randomizeWorld25(seed.read_u16()); |
kayekss | 0:bc852e1d0b48 | 103 | } |
kayekss | 0:bc852e1d0b48 | 104 | if (!sw2 && sw2Prev) { |
kayekss | 0:bc852e1d0b48 | 105 | life.randomizeWorld(seed.read_u16()); |
kayekss | 0:bc852e1d0b48 | 106 | } |
kayekss | 0:bc852e1d0b48 | 107 | if (!sw3 && sw3Prev) { |
kayekss | 0:bc852e1d0b48 | 108 | life.randomizeWorld75(seed.read_u16()); |
kayekss | 0:bc852e1d0b48 | 109 | } |
kayekss | 0:bc852e1d0b48 | 110 | |
kayekss | 0:bc852e1d0b48 | 111 | sw1Prev = sw1; |
kayekss | 0:bc852e1d0b48 | 112 | sw2Prev = sw2; |
kayekss | 0:bc852e1d0b48 | 113 | sw3Prev = sw3; |
kayekss | 0:bc852e1d0b48 | 114 | } |
kayekss | 0:bc852e1d0b48 | 115 | |
kayekss | 0:bc852e1d0b48 | 116 | void loop() { |
kayekss | 0:bc852e1d0b48 | 117 | int32_t t = timer.read_ms(); |
kayekss | 0:bc852e1d0b48 | 118 | static int32_t prevSwitch = t; |
kayekss | 0:bc852e1d0b48 | 119 | |
kayekss | 0:bc852e1d0b48 | 120 | if (t >= prevSwitch + 20 || t < prevSwitch) { |
kayekss | 0:bc852e1d0b48 | 121 | prevSwitch = t; |
kayekss | 0:bc852e1d0b48 | 122 | switches(); |
kayekss | 0:bc852e1d0b48 | 123 | } |
kayekss | 0:bc852e1d0b48 | 124 | |
kayekss | 0:bc852e1d0b48 | 125 | life.nextGeneration(); |
kayekss | 0:bc852e1d0b48 | 126 | life.swap(); |
kayekss | 0:bc852e1d0b48 | 127 | drawWorld(); |
kayekss | 0:bc852e1d0b48 | 128 | } |
kayekss | 0:bc852e1d0b48 | 129 | |
kayekss | 0:bc852e1d0b48 | 130 | int main() { |
kayekss | 0:bc852e1d0b48 | 131 | setup(); |
kayekss | 0:bc852e1d0b48 | 132 | |
kayekss | 0:bc852e1d0b48 | 133 | while (1) { |
kayekss | 0:bc852e1d0b48 | 134 | loop(); |
kayekss | 0:bc852e1d0b48 | 135 | } |
kayekss | 0:bc852e1d0b48 | 136 | } |