disconnect
Dependencies: Puck lz mbed-src seeedstudio-epaper
Fork of display-puck by
main.cpp@9:f90c326604c3, 2014-08-05 (annotated)
- Committer:
- cristea
- Date:
- Tue Aug 05 08:53:42 2014 +0000
- Revision:
- 9:f90c326604c3
- Parent:
- 8:30de292d57fd
Add license
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cristea | 9:f90c326604c3 | 1 | /** |
cristea | 9:f90c326604c3 | 2 | * Copyright 2014 Nordic Semiconductor |
cristea | 9:f90c326604c3 | 3 | * |
cristea | 9:f90c326604c3 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
cristea | 9:f90c326604c3 | 5 | * you may not use this file except in compliance with the License. |
cristea | 9:f90c326604c3 | 6 | * You may obtain a copy of the License at |
cristea | 9:f90c326604c3 | 7 | * |
cristea | 9:f90c326604c3 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
cristea | 9:f90c326604c3 | 9 | * |
cristea | 9:f90c326604c3 | 10 | * Unless required by applicable law or agreed to in writing, software |
cristea | 9:f90c326604c3 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
cristea | 9:f90c326604c3 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
cristea | 9:f90c326604c3 | 13 | * See the License for the specific language governing permissions and |
cristea | 9:f90c326604c3 | 14 | * limitations under the License |
cristea | 9:f90c326604c3 | 15 | */ |
cristea | 9:f90c326604c3 | 16 | |
sigveseb | 0:7499fa0a8ecb | 17 | #include <mbed.h> |
sigveseb | 3:4ff226c4fe2a | 18 | #include "EPD.h" |
sigveseb | 0:7499fa0a8ecb | 19 | #include "lz.h" |
sigveseb | 0:7499fa0a8ecb | 20 | |
sigveseb | 3:4ff226c4fe2a | 21 | |
sigveseb | 3:4ff226c4fe2a | 22 | #define LOG_LEVEL_VERBOSE |
sigveseb | 3:4ff226c4fe2a | 23 | #include "Puck.h" |
sigveseb | 3:4ff226c4fe2a | 24 | |
sigveseb | 3:4ff226c4fe2a | 25 | int receiveIndex = 0; |
sigveseb | 3:4ff226c4fe2a | 26 | |
sigveseb | 3:4ff226c4fe2a | 27 | Puck* puck = &Puck::getPuck(); |
sigveseb | 0:7499fa0a8ecb | 28 | |
sigveseb | 3:4ff226c4fe2a | 29 | |
sigveseb | 3:4ff226c4fe2a | 30 | EPD_Class EPD(p0, p2, p3, p8, p5, p6, p7); |
sigveseb | 3:4ff226c4fe2a | 31 | |
sigveseb | 3:4ff226c4fe2a | 32 | |
stiaje | 5:5491fb58107e | 33 | const UUID DISPLAY_SERVICE_UUID = stringToUUID("bftj display "); |
stiaje | 5:5491fb58107e | 34 | const UUID COMMAND_UUID = stringToUUID("bftj display com"); |
stiaje | 5:5491fb58107e | 35 | const UUID DATA_UUID = stringToUUID("bftj display dat"); |
sigveseb | 0:7499fa0a8ecb | 36 | |
sigveseb | 0:7499fa0a8ecb | 37 | |
sigveseb | 0:7499fa0a8ecb | 38 | /* |
sigveseb | 0:7499fa0a8ecb | 39 | |
sigveseb | 0:7499fa0a8ecb | 40 | connections: |
sigveseb | 0:7499fa0a8ecb | 41 | |
sigveseb | 0:7499fa0a8ecb | 42 | |
sigveseb | 0:7499fa0a8ecb | 43 | LPC1768 <--> nRF51822 <--> Shield |
sigveseb | 0:7499fa0a8ecb | 44 | ---------||------------||-------- |
sigveseb | 0:7499fa0a8ecb | 45 | p12 <--> p2 <--> D2 (M_EPD_PANEL_ON) |
sigveseb | 0:7499fa0a8ecb | 46 | p13 <--> p3 <--> D3 (M_EPD_BORDER) |
sigveseb | 0:7499fa0a8ecb | 47 | p14 <--> p4 <--> D4 (M_/SD_CS) |
sigveseb | 0:7499fa0a8ecb | 48 | p25 <--> p5 <--> D5 (M_EPD_PWM) |
sigveseb | 0:7499fa0a8ecb | 49 | p16 <--> p6 <--> D6 (M_EPD_/RESET) |
sigveseb | 0:7499fa0a8ecb | 50 | p17 <--> p7 <--> D7 (M_EPD_BUSY) |
sigveseb | 0:7499fa0a8ecb | 51 | p18 <--> p8 <--> D8 (M_EPD_DISCHARGE) |
sigveseb | 0:7499fa0a8ecb | 52 | p19 <--> p26 <--> D9 (M_/WORD_STOCK_CS) |
sigveseb | 0:7499fa0a8ecb | 53 | p20 <--> p0 <--> D10 (M_/EPD_CS) |
sigveseb | 0:7499fa0a8ecb | 54 | p21 <--> p27 <--> A1 (M_OE123) |
sigveseb | 0:7499fa0a8ecb | 55 | p22 <--> p28 <--> A2 (M_CKV) |
sigveseb | 0:7499fa0a8ecb | 56 | p23 <--> p29 <--> A3 (M_STV_IN) |
sigveseb | 0:7499fa0a8ecb | 57 | |
sigveseb | 0:7499fa0a8ecb | 58 | p5 <--> p20 <--> MOSI |
sigveseb | 0:7499fa0a8ecb | 59 | p6 <--> p22 <--> MISO |
sigveseb | 0:7499fa0a8ecb | 60 | p7 <--> p25 <--> SCK |
sigveseb | 0:7499fa0a8ecb | 61 | |
sigveseb | 0:7499fa0a8ecb | 62 | VCC <--> VCC |
sigveseb | 0:7499fa0a8ecb | 63 | GND <--> GND |
sigveseb | 0:7499fa0a8ecb | 64 | |
sigveseb | 0:7499fa0a8ecb | 65 | */ |
sigveseb | 0:7499fa0a8ecb | 66 | |
sigveseb | 0:7499fa0a8ecb | 67 | #define COMMAND_NOOP 0 |
sigveseb | 0:7499fa0a8ecb | 68 | #define COMMAND_CLEAR 1 |
sigveseb | 0:7499fa0a8ecb | 69 | #define COMMAND_IMAGE_UPPER 2 |
sigveseb | 0:7499fa0a8ecb | 70 | #define COMMAND_IMAGE_LOWER 3 |
sigveseb | 0:7499fa0a8ecb | 71 | #define COMMAND_BEGIN_UPPER 4 |
sigveseb | 0:7499fa0a8ecb | 72 | #define COMMAND_BEGIN_LOWER 5 |
sigveseb | 0:7499fa0a8ecb | 73 | |
sigveseb | 0:7499fa0a8ecb | 74 | #define IMAGE_SIZE 2904 |
sigveseb | 3:4ff226c4fe2a | 75 | #define BUFFER_SIZE 2917 |
sigveseb | 0:7499fa0a8ecb | 76 | #define Y_SIZE 88 |
sigveseb | 0:7499fa0a8ecb | 77 | #define X_SIZE 264 |
sigveseb | 3:4ff226c4fe2a | 78 | uint8_t buffer[BUFFER_SIZE]; |
sigveseb | 3:4ff226c4fe2a | 79 | |
sigveseb | 3:4ff226c4fe2a | 80 | int currentCommand = COMMAND_NOOP; |
sigveseb | 3:4ff226c4fe2a | 81 | |
sigveseb | 3:4ff226c4fe2a | 82 | |
sigveseb | 3:4ff226c4fe2a | 83 | void reverseBufferSegment(int from, int to) { |
sigveseb | 3:4ff226c4fe2a | 84 | for(int i = from; i < (to + from + 1) / 2; i++) { |
sigveseb | 3:4ff226c4fe2a | 85 | int i2 = to + from - i - 1; |
sigveseb | 3:4ff226c4fe2a | 86 | int temp = buffer[i]; |
sigveseb | 3:4ff226c4fe2a | 87 | buffer[i] = buffer[i2]; |
sigveseb | 3:4ff226c4fe2a | 88 | buffer[i2] = temp; |
sigveseb | 3:4ff226c4fe2a | 89 | } |
sigveseb | 3:4ff226c4fe2a | 90 | LOG_DEBUG("Reversed buffer from index %i to index %i.\n", from, to); |
sigveseb | 3:4ff226c4fe2a | 91 | } |
sigveseb | 3:4ff226c4fe2a | 92 | |
sigveseb | 0:7499fa0a8ecb | 93 | |
sigveseb | 3:4ff226c4fe2a | 94 | void onCommandWritten(uint8_t* value) { |
sigveseb | 3:4ff226c4fe2a | 95 | currentCommand = value[0]; |
sigveseb | 3:4ff226c4fe2a | 96 | LOG_DEBUG("Received command: %i.\n", currentCommand); |
sigveseb | 3:4ff226c4fe2a | 97 | |
sigveseb | 3:4ff226c4fe2a | 98 | switch(currentCommand) { |
sigveseb | 3:4ff226c4fe2a | 99 | |
sigveseb | 3:4ff226c4fe2a | 100 | case COMMAND_BEGIN_UPPER: |
sigveseb | 3:4ff226c4fe2a | 101 | case COMMAND_BEGIN_LOWER: |
sigveseb | 3:4ff226c4fe2a | 102 | receiveIndex = BUFFER_SIZE; |
sigveseb | 3:4ff226c4fe2a | 103 | break; |
sigveseb | 3:4ff226c4fe2a | 104 | |
sigveseb | 3:4ff226c4fe2a | 105 | case COMMAND_CLEAR: |
sigveseb | 3:4ff226c4fe2a | 106 | LOG_INFO("Clearing display.\n"); |
sigveseb | 3:4ff226c4fe2a | 107 | EPD.begin(EPD_2_7); |
sigveseb | 3:4ff226c4fe2a | 108 | EPD.start(); |
sigveseb | 3:4ff226c4fe2a | 109 | EPD.clear(); |
sigveseb | 3:4ff226c4fe2a | 110 | EPD.end(); |
sigveseb | 0:7499fa0a8ecb | 111 | break; |
sigveseb | 3:4ff226c4fe2a | 112 | |
sigveseb | 3:4ff226c4fe2a | 113 | case COMMAND_IMAGE_UPPER: |
cristea | 8:30de292d57fd | 114 | puck->disconnect(); |
sigveseb | 3:4ff226c4fe2a | 115 | LOG_INFO("Writing image to top half of display.\n"); |
sigveseb | 3:4ff226c4fe2a | 116 | reverseBufferSegment(receiveIndex, BUFFER_SIZE); |
sigveseb | 3:4ff226c4fe2a | 117 | LOG_DEBUG("LZ_Uncompress(in: 0x%x, out 0x%x, insize: %i)\n", buffer + receiveIndex, buffer, BUFFER_SIZE - receiveIndex); |
sigveseb | 3:4ff226c4fe2a | 118 | LZ_Uncompress(buffer + receiveIndex, buffer, BUFFER_SIZE - receiveIndex); |
sigveseb | 3:4ff226c4fe2a | 119 | LOG_INFO("Uncompressed %i bytes of data.\n", BUFFER_SIZE - receiveIndex); |
sigveseb | 3:4ff226c4fe2a | 120 | EPD.begin(EPD_2_7); |
sigveseb | 3:4ff226c4fe2a | 121 | EPD.start(); |
sigveseb | 3:4ff226c4fe2a | 122 | EPD.image(buffer, 0, EPD.lines_per_display / 2); |
sigveseb | 3:4ff226c4fe2a | 123 | EPD.end(); |
sigveseb | 3:4ff226c4fe2a | 124 | break; |
sigveseb | 3:4ff226c4fe2a | 125 | |
sigveseb | 3:4ff226c4fe2a | 126 | case COMMAND_IMAGE_LOWER: |
cristea | 8:30de292d57fd | 127 | puck->disconnect(); |
sigveseb | 3:4ff226c4fe2a | 128 | LOG_INFO("Writing image to bottom half of display.\n"); |
sigveseb | 3:4ff226c4fe2a | 129 | reverseBufferSegment(receiveIndex, BUFFER_SIZE); |
sigveseb | 3:4ff226c4fe2a | 130 | LZ_Uncompress(buffer + receiveIndex, buffer, BUFFER_SIZE - receiveIndex); |
sigveseb | 3:4ff226c4fe2a | 131 | LOG_INFO("Uncompressed %i bytes of data.\n", BUFFER_SIZE - receiveIndex); |
sigveseb | 3:4ff226c4fe2a | 132 | EPD.begin(EPD_2_7); |
sigveseb | 3:4ff226c4fe2a | 133 | EPD.start(); |
sigveseb | 3:4ff226c4fe2a | 134 | EPD.image(buffer, EPD.lines_per_display / 2, EPD.lines_per_display); |
sigveseb | 3:4ff226c4fe2a | 135 | EPD.end(); |
sigveseb | 3:4ff226c4fe2a | 136 | break; |
sigveseb | 3:4ff226c4fe2a | 137 | |
sigveseb | 0:7499fa0a8ecb | 138 | } |
sigveseb | 0:7499fa0a8ecb | 139 | |
sigveseb | 3:4ff226c4fe2a | 140 | currentCommand = COMMAND_NOOP; |
sigveseb | 3:4ff226c4fe2a | 141 | } |
sigveseb | 3:4ff226c4fe2a | 142 | |
sigveseb | 3:4ff226c4fe2a | 143 | void onDataWritten(uint8_t* value) { |
sigveseb | 3:4ff226c4fe2a | 144 | LOG_VERBOSE("Data written, receiveIndex: %i\n", receiveIndex); |
sigveseb | 3:4ff226c4fe2a | 145 | for(int i = 0; i < 20 && receiveIndex > 0; i++) { |
sigveseb | 3:4ff226c4fe2a | 146 | buffer[--receiveIndex] = value[i]; |
sigveseb | 0:7499fa0a8ecb | 147 | } |
sigveseb | 0:7499fa0a8ecb | 148 | } |
sigveseb | 0:7499fa0a8ecb | 149 | |
sigveseb | 0:7499fa0a8ecb | 150 | |
sigveseb | 0:7499fa0a8ecb | 151 | int main() { |
sigveseb | 3:4ff226c4fe2a | 152 | LOG_INFO("Starting puck.\n"); |
sigveseb | 3:4ff226c4fe2a | 153 | |
sigveseb | 0:7499fa0a8ecb | 154 | DigitalOut SD_CS(p4); |
sigveseb | 0:7499fa0a8ecb | 155 | DigitalOut WORD_STOCK_CS(p26); |
sigveseb | 0:7499fa0a8ecb | 156 | |
sigveseb | 0:7499fa0a8ecb | 157 | SD_CS = 1; |
sigveseb | 0:7499fa0a8ecb | 158 | WORD_STOCK_CS = 1; |
sigveseb | 0:7499fa0a8ecb | 159 | |
sigveseb | 3:4ff226c4fe2a | 160 | puck->addCharacteristic(DISPLAY_SERVICE_UUID, COMMAND_UUID, 1); |
sigveseb | 3:4ff226c4fe2a | 161 | puck->addCharacteristic(DISPLAY_SERVICE_UUID, DATA_UUID, 20); |
sigveseb | 0:7499fa0a8ecb | 162 | |
sigveseb | 0:7499fa0a8ecb | 163 | |
sigveseb | 3:4ff226c4fe2a | 164 | puck->onCharacteristicWrite(&COMMAND_UUID, onCommandWritten); |
sigveseb | 3:4ff226c4fe2a | 165 | puck->onCharacteristicWrite(&DATA_UUID, onDataWritten); |
sigveseb | 0:7499fa0a8ecb | 166 | |
sigveseb | 3:4ff226c4fe2a | 167 | puck->init(0x5EED); |
sigveseb | 0:7499fa0a8ecb | 168 | |
sigveseb | 3:4ff226c4fe2a | 169 | puck->countFreeMemory(); |
sigveseb | 0:7499fa0a8ecb | 170 | |
sigveseb | 3:4ff226c4fe2a | 171 | currentCommand = COMMAND_NOOP; |
sigveseb | 0:7499fa0a8ecb | 172 | |
sigveseb | 3:4ff226c4fe2a | 173 | while (puck->drive()); |
sigveseb | 0:7499fa0a8ecb | 174 | } |