disconnect

Dependencies:   Puck lz mbed-src seeedstudio-epaper

Fork of display-puck by Nordic Pucks

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?

UserRevisionLine numberNew 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 }