disconnect
Dependencies: Puck lz mbed-src seeedstudio-epaper
Fork of display-puck by
main.cpp@1:42882ba4c901, 2014-07-18 (annotated)
- Committer:
- sigveseb
- Date:
- Fri Jul 18 09:20:35 2014 +0000
- Revision:
- 1:42882ba4c901
- Parent:
- 0:7499fa0a8ecb
- Child:
- 3:4ff226c4fe2a
display puck
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sigveseb | 0:7499fa0a8ecb | 1 | #include <mbed.h> |
sigveseb | 0:7499fa0a8ecb | 2 | #include <EPD.h> |
sigveseb | 0:7499fa0a8ecb | 3 | #include "mbed.h" |
sigveseb | 0:7499fa0a8ecb | 4 | #include "BLEDevice.h" |
sigveseb | 0:7499fa0a8ecb | 5 | #include "lz.h" |
sigveseb | 0:7499fa0a8ecb | 6 | |
sigveseb | 0:7499fa0a8ecb | 7 | Serial py(USBTX, USBRX); |
sigveseb | 0:7499fa0a8ecb | 8 | BLEDevice ble; |
sigveseb | 0:7499fa0a8ecb | 9 | DigitalOut myled(LED1); |
sigveseb | 0:7499fa0a8ecb | 10 | |
sigveseb | 0:7499fa0a8ecb | 11 | int receive_index = 0; |
sigveseb | 0:7499fa0a8ecb | 12 | |
sigveseb | 0:7499fa0a8ecb | 13 | |
sigveseb | 0:7499fa0a8ecb | 14 | /* |
sigveseb | 0:7499fa0a8ecb | 15 | |
sigveseb | 0:7499fa0a8ecb | 16 | connections: |
sigveseb | 0:7499fa0a8ecb | 17 | |
sigveseb | 0:7499fa0a8ecb | 18 | |
sigveseb | 0:7499fa0a8ecb | 19 | LPC1768 <--> nRF51822 <--> Shield |
sigveseb | 0:7499fa0a8ecb | 20 | ---------||------------||-------- |
sigveseb | 0:7499fa0a8ecb | 21 | p12 <--> p2 <--> D2 (M_EPD_PANEL_ON) |
sigveseb | 0:7499fa0a8ecb | 22 | p13 <--> p3 <--> D3 (M_EPD_BORDER) |
sigveseb | 0:7499fa0a8ecb | 23 | p14 <--> p4 <--> D4 (M_/SD_CS) |
sigveseb | 0:7499fa0a8ecb | 24 | p25 <--> p5 <--> D5 (M_EPD_PWM) |
sigveseb | 0:7499fa0a8ecb | 25 | p16 <--> p6 <--> D6 (M_EPD_/RESET) |
sigveseb | 0:7499fa0a8ecb | 26 | p17 <--> p7 <--> D7 (M_EPD_BUSY) |
sigveseb | 0:7499fa0a8ecb | 27 | p18 <--> p8 <--> D8 (M_EPD_DISCHARGE) |
sigveseb | 0:7499fa0a8ecb | 28 | p19 <--> p26 <--> D9 (M_/WORD_STOCK_CS) |
sigveseb | 0:7499fa0a8ecb | 29 | p20 <--> p0 <--> D10 (M_/EPD_CS) |
sigveseb | 0:7499fa0a8ecb | 30 | p21 <--> p27 <--> A1 (M_OE123) |
sigveseb | 0:7499fa0a8ecb | 31 | p22 <--> p28 <--> A2 (M_CKV) |
sigveseb | 0:7499fa0a8ecb | 32 | p23 <--> p29 <--> A3 (M_STV_IN) |
sigveseb | 0:7499fa0a8ecb | 33 | |
sigveseb | 0:7499fa0a8ecb | 34 | p5 <--> p20 <--> MOSI |
sigveseb | 0:7499fa0a8ecb | 35 | p6 <--> p22 <--> MISO |
sigveseb | 0:7499fa0a8ecb | 36 | p7 <--> p25 <--> SCK |
sigveseb | 0:7499fa0a8ecb | 37 | |
sigveseb | 0:7499fa0a8ecb | 38 | VCC <--> VCC |
sigveseb | 0:7499fa0a8ecb | 39 | GND <--> GND |
sigveseb | 0:7499fa0a8ecb | 40 | |
sigveseb | 0:7499fa0a8ecb | 41 | */ |
sigveseb | 0:7499fa0a8ecb | 42 | |
sigveseb | 0:7499fa0a8ecb | 43 | #define COMMAND_NOOP 0 |
sigveseb | 0:7499fa0a8ecb | 44 | #define COMMAND_CLEAR 1 |
sigveseb | 0:7499fa0a8ecb | 45 | #define COMMAND_IMAGE_UPPER 2 |
sigveseb | 0:7499fa0a8ecb | 46 | #define COMMAND_IMAGE_LOWER 3 |
sigveseb | 0:7499fa0a8ecb | 47 | #define COMMAND_BEGIN_UPPER 4 |
sigveseb | 0:7499fa0a8ecb | 48 | #define COMMAND_BEGIN_LOWER 5 |
sigveseb | 0:7499fa0a8ecb | 49 | |
sigveseb | 0:7499fa0a8ecb | 50 | //#define IMAGE_SIZE 5808 |
sigveseb | 0:7499fa0a8ecb | 51 | //#define Y_SIZE 176 |
sigveseb | 0:7499fa0a8ecb | 52 | //#define X_SIZE 264 |
sigveseb | 0:7499fa0a8ecb | 53 | #define IMAGE_SIZE 2904 |
sigveseb | 0:7499fa0a8ecb | 54 | #define Y_SIZE 88 |
sigveseb | 0:7499fa0a8ecb | 55 | #define X_SIZE 264 |
sigveseb | 1:42882ba4c901 | 56 | #define RECEIVE_BUFFER_SIZE 1000 |
sigveseb | 0:7499fa0a8ecb | 57 | uint8_t image[IMAGE_SIZE]; |
sigveseb | 1:42882ba4c901 | 58 | uint8_t receive_buffer[RECEIVE_BUFFER_SIZE]; |
sigveseb | 0:7499fa0a8ecb | 59 | |
sigveseb | 0:7499fa0a8ecb | 60 | extern GattService display_service; |
sigveseb | 0:7499fa0a8ecb | 61 | extern GattCharacteristic command, data; |
sigveseb | 0:7499fa0a8ecb | 62 | int current_command = COMMAND_NOOP; |
sigveseb | 0:7499fa0a8ecb | 63 | |
sigveseb | 1:42882ba4c901 | 64 | bool isConnected = false; |
sigveseb | 1:42882ba4c901 | 65 | bool isAdvertising = false; |
sigveseb | 1:42882ba4c901 | 66 | |
sigveseb | 0:7499fa0a8ecb | 67 | const static uint8_t beaconPayload[] = { |
sigveseb | 0:7499fa0a8ecb | 68 | 0x00, 0x4C, // Company identifier code (0x004C == Apple) |
sigveseb | 0:7499fa0a8ecb | 69 | 0x02, // ID |
sigveseb | 0:7499fa0a8ecb | 70 | 0x15, // length of the remaining payload |
sigveseb | 0:7499fa0a8ecb | 71 | 0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, // UUID |
sigveseb | 0:7499fa0a8ecb | 72 | 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61, |
sigveseb | 0:7499fa0a8ecb | 73 | 0x13, 0x37, // the major value to differenciate a location |
sigveseb | 0:7499fa0a8ecb | 74 | 0xFA, 0xCC, // the minor value to differenciate a location |
sigveseb | 0:7499fa0a8ecb | 75 | 0xC0 // 2's complement of the Tx power (-56dB) (now modified) |
sigveseb | 0:7499fa0a8ecb | 76 | }; |
sigveseb | 0:7499fa0a8ecb | 77 | |
sigveseb | 0:7499fa0a8ecb | 78 | void onDataWritten(uint16_t handle) |
sigveseb | 0:7499fa0a8ecb | 79 | { |
sigveseb | 0:7499fa0a8ecb | 80 | for (int i = 0; i < display_service.getCharacteristicCount(); i++) { |
sigveseb | 0:7499fa0a8ecb | 81 | GattCharacteristic* characteristic = display_service.getCharacteristic(i); |
sigveseb | 0:7499fa0a8ecb | 82 | characteristic->getMaxLength(); |
sigveseb | 0:7499fa0a8ecb | 83 | if (characteristic->getHandle() == handle) { |
sigveseb | 0:7499fa0a8ecb | 84 | uint16_t max_length = characteristic->getMaxLength(); |
sigveseb | 0:7499fa0a8ecb | 85 | ble.readCharacteristicValue(handle, characteristic->getValuePtr(), &max_length); |
sigveseb | 0:7499fa0a8ecb | 86 | break; |
sigveseb | 0:7499fa0a8ecb | 87 | } |
sigveseb | 0:7499fa0a8ecb | 88 | } |
sigveseb | 0:7499fa0a8ecb | 89 | |
sigveseb | 0:7499fa0a8ecb | 90 | if (command.getHandle() == handle) { |
sigveseb | 0:7499fa0a8ecb | 91 | current_command = command.getValuePtr()[0]; |
sigveseb | 0:7499fa0a8ecb | 92 | |
sigveseb | 0:7499fa0a8ecb | 93 | |
sigveseb | 1:42882ba4c901 | 94 | py.printf("cmd: %i\n", current_command); |
sigveseb | 0:7499fa0a8ecb | 95 | |
sigveseb | 0:7499fa0a8ecb | 96 | if(current_command == COMMAND_BEGIN_UPPER || current_command == COMMAND_BEGIN_LOWER) { |
sigveseb | 0:7499fa0a8ecb | 97 | receive_index = 0; |
sigveseb | 0:7499fa0a8ecb | 98 | } |
sigveseb | 0:7499fa0a8ecb | 99 | } |
sigveseb | 0:7499fa0a8ecb | 100 | |
sigveseb | 0:7499fa0a8ecb | 101 | if (data.getHandle() == handle) { |
sigveseb | 0:7499fa0a8ecb | 102 | uint8_t* value = data.getValuePtr(); |
sigveseb | 0:7499fa0a8ecb | 103 | for(int i = 0; i < 20 && receive_index < IMAGE_SIZE; i++) { |
sigveseb | 1:42882ba4c901 | 104 | receive_buffer[receive_index++] = value[i]; |
sigveseb | 0:7499fa0a8ecb | 105 | } |
sigveseb | 0:7499fa0a8ecb | 106 | if (receive_index == IMAGE_SIZE) { |
sigveseb | 0:7499fa0a8ecb | 107 | receive_index = 0; |
sigveseb | 0:7499fa0a8ecb | 108 | } |
sigveseb | 0:7499fa0a8ecb | 109 | } |
sigveseb | 0:7499fa0a8ecb | 110 | } |
sigveseb | 0:7499fa0a8ecb | 111 | |
sigveseb | 0:7499fa0a8ecb | 112 | void disconnectionCallback(void) |
sigveseb | 0:7499fa0a8ecb | 113 | { |
sigveseb | 0:7499fa0a8ecb | 114 | py.printf("Disconnected!\n"); |
sigveseb | 1:42882ba4c901 | 115 | isConnected = false; |
sigveseb | 0:7499fa0a8ecb | 116 | } |
sigveseb | 0:7499fa0a8ecb | 117 | |
sigveseb | 0:7499fa0a8ecb | 118 | void connectionCallback(void) |
sigveseb | 0:7499fa0a8ecb | 119 | { |
sigveseb | 0:7499fa0a8ecb | 120 | py.printf("Connected!\n"); |
sigveseb | 1:42882ba4c901 | 121 | isConnected = true; |
sigveseb | 1:42882ba4c901 | 122 | isAdvertising = false; |
sigveseb | 0:7499fa0a8ecb | 123 | } |
sigveseb | 0:7499fa0a8ecb | 124 | |
sigveseb | 1:42882ba4c901 | 125 | void uncompress_image() { |
sigveseb | 1:42882ba4c901 | 126 | LZ_Uncompress(receive_buffer, image, receive_index); |
sigveseb | 1:42882ba4c901 | 127 | } |
sigveseb | 0:7499fa0a8ecb | 128 | |
sigveseb | 0:7499fa0a8ecb | 129 | //uint8_t image[5808]; |
sigveseb | 0:7499fa0a8ecb | 130 | |
sigveseb | 0:7499fa0a8ecb | 131 | void clear(){ |
sigveseb | 0:7499fa0a8ecb | 132 | for(int i=0;i<IMAGE_SIZE;i++){ |
sigveseb | 0:7499fa0a8ecb | 133 | image[i] = 0; |
sigveseb | 0:7499fa0a8ecb | 134 | } |
sigveseb | 0:7499fa0a8ecb | 135 | } |
sigveseb | 0:7499fa0a8ecb | 136 | |
sigveseb | 0:7499fa0a8ecb | 137 | void set_pixel(int x, int y, int color) { |
sigveseb | 0:7499fa0a8ecb | 138 | int byte_x = x / 8; |
sigveseb | 0:7499fa0a8ecb | 139 | int byte_w = X_SIZE / 8; |
sigveseb | 0:7499fa0a8ecb | 140 | int byte_offset = x % 8; |
sigveseb | 0:7499fa0a8ecb | 141 | int byte = image[byte_x + byte_w * y]; |
sigveseb | 0:7499fa0a8ecb | 142 | if(color) { |
sigveseb | 0:7499fa0a8ecb | 143 | byte |= 1 << byte_offset; |
sigveseb | 0:7499fa0a8ecb | 144 | } else { |
sigveseb | 0:7499fa0a8ecb | 145 | byte &= ~(1 << byte_offset); |
sigveseb | 0:7499fa0a8ecb | 146 | } |
sigveseb | 0:7499fa0a8ecb | 147 | image[byte_x + byte_w * y] = byte; |
sigveseb | 0:7499fa0a8ecb | 148 | } |
sigveseb | 0:7499fa0a8ecb | 149 | |
sigveseb | 0:7499fa0a8ecb | 150 | int main() { |
sigveseb | 0:7499fa0a8ecb | 151 | DigitalOut SD_CS(p4); |
sigveseb | 0:7499fa0a8ecb | 152 | DigitalOut WORD_STOCK_CS(p26); |
sigveseb | 0:7499fa0a8ecb | 153 | |
sigveseb | 0:7499fa0a8ecb | 154 | SD_CS = 1; |
sigveseb | 0:7499fa0a8ecb | 155 | WORD_STOCK_CS = 1; |
sigveseb | 0:7499fa0a8ecb | 156 | |
sigveseb | 0:7499fa0a8ecb | 157 | clear(); |
sigveseb | 0:7499fa0a8ecb | 158 | |
sigveseb | 0:7499fa0a8ecb | 159 | EPD_Class EPD(p0, p2, p3, p8, p5, p6, p7); |
sigveseb | 0:7499fa0a8ecb | 160 | |
sigveseb | 0:7499fa0a8ecb | 161 | EPD.begin(EPD_2_7); |
sigveseb | 0:7499fa0a8ecb | 162 | EPD.start(); |
sigveseb | 0:7499fa0a8ecb | 163 | EPD.clear(); |
sigveseb | 0:7499fa0a8ecb | 164 | EPD.end(); |
sigveseb | 0:7499fa0a8ecb | 165 | |
sigveseb | 0:7499fa0a8ecb | 166 | ble.init(); |
sigveseb | 0:7499fa0a8ecb | 167 | ble.onDisconnection(disconnectionCallback); |
sigveseb | 0:7499fa0a8ecb | 168 | ble.onConnection(connectionCallback); |
sigveseb | 0:7499fa0a8ecb | 169 | ble.onDataWritten(onDataWritten); |
sigveseb | 0:7499fa0a8ecb | 170 | |
sigveseb | 0:7499fa0a8ecb | 171 | |
sigveseb | 0:7499fa0a8ecb | 172 | ble.addService(display_service); |
sigveseb | 0:7499fa0a8ecb | 173 | |
sigveseb | 0:7499fa0a8ecb | 174 | myled = 1; |
sigveseb | 0:7499fa0a8ecb | 175 | |
sigveseb | 0:7499fa0a8ecb | 176 | py.printf("Starting up.\n"); |
sigveseb | 0:7499fa0a8ecb | 177 | |
sigveseb | 0:7499fa0a8ecb | 178 | current_command = COMMAND_NOOP; |
sigveseb | 0:7499fa0a8ecb | 179 | |
sigveseb | 0:7499fa0a8ecb | 180 | while (true) { |
sigveseb | 0:7499fa0a8ecb | 181 | ble.waitForEvent(); |
sigveseb | 0:7499fa0a8ecb | 182 | myled = !myled; |
sigveseb | 0:7499fa0a8ecb | 183 | |
sigveseb | 0:7499fa0a8ecb | 184 | if(current_command == COMMAND_CLEAR) { |
sigveseb | 0:7499fa0a8ecb | 185 | |
sigveseb | 0:7499fa0a8ecb | 186 | py.printf("Clearing.\n"); |
sigveseb | 0:7499fa0a8ecb | 187 | EPD.begin(EPD_2_7); |
sigveseb | 0:7499fa0a8ecb | 188 | EPD.start(); |
sigveseb | 0:7499fa0a8ecb | 189 | EPD.clear(); |
sigveseb | 0:7499fa0a8ecb | 190 | EPD.end(); |
sigveseb | 0:7499fa0a8ecb | 191 | current_command = COMMAND_NOOP; |
sigveseb | 0:7499fa0a8ecb | 192 | } |
sigveseb | 0:7499fa0a8ecb | 193 | |
sigveseb | 0:7499fa0a8ecb | 194 | |
sigveseb | 0:7499fa0a8ecb | 195 | if(current_command == COMMAND_IMAGE_UPPER) { |
sigveseb | 0:7499fa0a8ecb | 196 | py.printf("Uppering.\n"); |
sigveseb | 1:42882ba4c901 | 197 | uncompress_image(); |
sigveseb | 0:7499fa0a8ecb | 198 | EPD.begin(EPD_2_7); |
sigveseb | 0:7499fa0a8ecb | 199 | EPD.start(); |
sigveseb | 0:7499fa0a8ecb | 200 | EPD.image(image, 0, EPD.lines_per_display / 2); |
sigveseb | 0:7499fa0a8ecb | 201 | EPD.end(); |
sigveseb | 0:7499fa0a8ecb | 202 | current_command = COMMAND_NOOP; |
sigveseb | 0:7499fa0a8ecb | 203 | } |
sigveseb | 0:7499fa0a8ecb | 204 | |
sigveseb | 0:7499fa0a8ecb | 205 | |
sigveseb | 0:7499fa0a8ecb | 206 | if(current_command == COMMAND_IMAGE_LOWER) { |
sigveseb | 0:7499fa0a8ecb | 207 | py.printf("Lowering.\n"); |
sigveseb | 1:42882ba4c901 | 208 | uncompress_image(); |
sigveseb | 0:7499fa0a8ecb | 209 | EPD.begin(EPD_2_7); |
sigveseb | 0:7499fa0a8ecb | 210 | EPD.start(); |
sigveseb | 1:42882ba4c901 | 211 | EPD.image(image, EPD.lines_per_display / 2, EPD.lines_per_display); |
sigveseb | 0:7499fa0a8ecb | 212 | EPD.end(); |
sigveseb | 0:7499fa0a8ecb | 213 | current_command = COMMAND_NOOP; |
sigveseb | 0:7499fa0a8ecb | 214 | } |
sigveseb | 0:7499fa0a8ecb | 215 | |
sigveseb | 1:42882ba4c901 | 216 | |
sigveseb | 1:42882ba4c901 | 217 | if(!isConnected && !isAdvertising) { |
sigveseb | 1:42882ba4c901 | 218 | ble.clearAdvertisingPayload(); |
sigveseb | 1:42882ba4c901 | 219 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
sigveseb | 1:42882ba4c901 | 220 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
sigveseb | 1:42882ba4c901 | 221 | ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ |
sigveseb | 1:42882ba4c901 | 222 | ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, |
sigveseb | 1:42882ba4c901 | 223 | beaconPayload, sizeof(beaconPayload)); |
sigveseb | 1:42882ba4c901 | 224 | ble.startAdvertising(); |
sigveseb | 1:42882ba4c901 | 225 | py.printf("Restarting the advertising process\n"); |
sigveseb | 1:42882ba4c901 | 226 | isAdvertising = true; |
sigveseb | 1:42882ba4c901 | 227 | } |
sigveseb | 0:7499fa0a8ecb | 228 | } |
sigveseb | 0:7499fa0a8ecb | 229 | } |