disconnect

Dependencies:   Puck lz mbed-src seeedstudio-epaper

Fork of display-puck by Nordic Pucks

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?

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