disconnect

Dependencies:   Puck lz mbed-src seeedstudio-epaper

Fork of display-puck by Nordic Pucks

Committer:
sigveseb
Date:
Thu Jul 17 14:16:16 2014 +0000
Revision:
0:7499fa0a8ecb
Child:
1:42882ba4c901
-

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 0:7499fa0a8ecb 56
sigveseb 0:7499fa0a8ecb 57 uint8_t image[IMAGE_SIZE];
sigveseb 0:7499fa0a8ecb 58
sigveseb 0:7499fa0a8ecb 59 extern GattService display_service;
sigveseb 0:7499fa0a8ecb 60 extern GattCharacteristic command, data;
sigveseb 0:7499fa0a8ecb 61 int current_command = COMMAND_NOOP;
sigveseb 0:7499fa0a8ecb 62
sigveseb 0:7499fa0a8ecb 63 const static uint8_t beaconPayload[] = {
sigveseb 0:7499fa0a8ecb 64 0x00, 0x4C, // Company identifier code (0x004C == Apple)
sigveseb 0:7499fa0a8ecb 65 0x02, // ID
sigveseb 0:7499fa0a8ecb 66 0x15, // length of the remaining payload
sigveseb 0:7499fa0a8ecb 67 0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, // UUID
sigveseb 0:7499fa0a8ecb 68 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61,
sigveseb 0:7499fa0a8ecb 69 0x13, 0x37, // the major value to differenciate a location
sigveseb 0:7499fa0a8ecb 70 0xFA, 0xCC, // the minor value to differenciate a location
sigveseb 0:7499fa0a8ecb 71 0xC0 // 2's complement of the Tx power (-56dB) (now modified)
sigveseb 0:7499fa0a8ecb 72 };
sigveseb 0:7499fa0a8ecb 73
sigveseb 0:7499fa0a8ecb 74 void onDataWritten(uint16_t handle)
sigveseb 0:7499fa0a8ecb 75 {
sigveseb 0:7499fa0a8ecb 76 for (int i = 0; i < display_service.getCharacteristicCount(); i++) {
sigveseb 0:7499fa0a8ecb 77 GattCharacteristic* characteristic = display_service.getCharacteristic(i);
sigveseb 0:7499fa0a8ecb 78 characteristic->getMaxLength();
sigveseb 0:7499fa0a8ecb 79 if (characteristic->getHandle() == handle) {
sigveseb 0:7499fa0a8ecb 80 uint16_t max_length = characteristic->getMaxLength();
sigveseb 0:7499fa0a8ecb 81 ble.readCharacteristicValue(handle, characteristic->getValuePtr(), &max_length);
sigveseb 0:7499fa0a8ecb 82 break;
sigveseb 0:7499fa0a8ecb 83 }
sigveseb 0:7499fa0a8ecb 84 }
sigveseb 0:7499fa0a8ecb 85
sigveseb 0:7499fa0a8ecb 86 if (command.getHandle() == handle) {
sigveseb 0:7499fa0a8ecb 87 current_command = command.getValuePtr()[0];
sigveseb 0:7499fa0a8ecb 88
sigveseb 0:7499fa0a8ecb 89
sigveseb 0:7499fa0a8ecb 90 py.printf("%i\n", current_command);
sigveseb 0:7499fa0a8ecb 91
sigveseb 0:7499fa0a8ecb 92 if(current_command == COMMAND_BEGIN_UPPER || current_command == COMMAND_BEGIN_LOWER) {
sigveseb 0:7499fa0a8ecb 93 receive_index = 0;
sigveseb 0:7499fa0a8ecb 94 }
sigveseb 0:7499fa0a8ecb 95 }
sigveseb 0:7499fa0a8ecb 96
sigveseb 0:7499fa0a8ecb 97 if (data.getHandle() == handle) {
sigveseb 0:7499fa0a8ecb 98 uint8_t* value = data.getValuePtr();
sigveseb 0:7499fa0a8ecb 99 for(int i = 0; i < 20 && receive_index < IMAGE_SIZE; i++) {
sigveseb 0:7499fa0a8ecb 100 image[receive_index++] = value[i];
sigveseb 0:7499fa0a8ecb 101 }
sigveseb 0:7499fa0a8ecb 102 if (receive_index == IMAGE_SIZE) {
sigveseb 0:7499fa0a8ecb 103 receive_index = 0;
sigveseb 0:7499fa0a8ecb 104 if(current_command == COMMAND_BEGIN_UPPER) { current_command = COMMAND_IMAGE_UPPER; }
sigveseb 0:7499fa0a8ecb 105 if(current_command == COMMAND_BEGIN_LOWER) { current_command = COMMAND_IMAGE_LOWER; }
sigveseb 0:7499fa0a8ecb 106 }
sigveseb 0:7499fa0a8ecb 107 }
sigveseb 0:7499fa0a8ecb 108 }
sigveseb 0:7499fa0a8ecb 109
sigveseb 0:7499fa0a8ecb 110 void disconnectionCallback(void)
sigveseb 0:7499fa0a8ecb 111 {
sigveseb 0:7499fa0a8ecb 112 py.printf("Disconnected!\n");
sigveseb 0:7499fa0a8ecb 113 py.printf("Restarting the advertising process\n");
sigveseb 0:7499fa0a8ecb 114 ble.startAdvertising();
sigveseb 0:7499fa0a8ecb 115 }
sigveseb 0:7499fa0a8ecb 116
sigveseb 0:7499fa0a8ecb 117 void connectionCallback(void)
sigveseb 0:7499fa0a8ecb 118 {
sigveseb 0:7499fa0a8ecb 119 py.printf("Connected!\n");
sigveseb 0:7499fa0a8ecb 120 }
sigveseb 0:7499fa0a8ecb 121
sigveseb 0:7499fa0a8ecb 122
sigveseb 0:7499fa0a8ecb 123
sigveseb 0:7499fa0a8ecb 124 //uint8_t image[5808];
sigveseb 0:7499fa0a8ecb 125
sigveseb 0:7499fa0a8ecb 126 void clear(){
sigveseb 0:7499fa0a8ecb 127 for(int i=0;i<IMAGE_SIZE;i++){
sigveseb 0:7499fa0a8ecb 128 image[i] = 0;
sigveseb 0:7499fa0a8ecb 129 }
sigveseb 0:7499fa0a8ecb 130 }
sigveseb 0:7499fa0a8ecb 131
sigveseb 0:7499fa0a8ecb 132 void set_pixel(int x, int y, int color) {
sigveseb 0:7499fa0a8ecb 133 int byte_x = x / 8;
sigveseb 0:7499fa0a8ecb 134 int byte_w = X_SIZE / 8;
sigveseb 0:7499fa0a8ecb 135 int byte_offset = x % 8;
sigveseb 0:7499fa0a8ecb 136 int byte = image[byte_x + byte_w * y];
sigveseb 0:7499fa0a8ecb 137 if(color) {
sigveseb 0:7499fa0a8ecb 138 byte |= 1 << byte_offset;
sigveseb 0:7499fa0a8ecb 139 } else {
sigveseb 0:7499fa0a8ecb 140 byte &= ~(1 << byte_offset);
sigveseb 0:7499fa0a8ecb 141 }
sigveseb 0:7499fa0a8ecb 142 image[byte_x + byte_w * y] = byte;
sigveseb 0:7499fa0a8ecb 143 }
sigveseb 0:7499fa0a8ecb 144
sigveseb 0:7499fa0a8ecb 145 int main() {
sigveseb 0:7499fa0a8ecb 146 DigitalOut SD_CS(p4);
sigveseb 0:7499fa0a8ecb 147 DigitalOut WORD_STOCK_CS(p26);
sigveseb 0:7499fa0a8ecb 148
sigveseb 0:7499fa0a8ecb 149 SD_CS = 1;
sigveseb 0:7499fa0a8ecb 150 WORD_STOCK_CS = 1;
sigveseb 0:7499fa0a8ecb 151
sigveseb 0:7499fa0a8ecb 152 clear();
sigveseb 0:7499fa0a8ecb 153
sigveseb 0:7499fa0a8ecb 154 EPD_Class EPD(p0, p2, p3, p8, p5, p6, p7);
sigveseb 0:7499fa0a8ecb 155
sigveseb 0:7499fa0a8ecb 156 EPD.begin(EPD_2_7);
sigveseb 0:7499fa0a8ecb 157 EPD.start();
sigveseb 0:7499fa0a8ecb 158 EPD.clear();
sigveseb 0:7499fa0a8ecb 159 EPD.end();
sigveseb 0:7499fa0a8ecb 160
sigveseb 0:7499fa0a8ecb 161 ble.init();
sigveseb 0:7499fa0a8ecb 162 ble.onDisconnection(disconnectionCallback);
sigveseb 0:7499fa0a8ecb 163 ble.onConnection(connectionCallback);
sigveseb 0:7499fa0a8ecb 164 ble.onDataWritten(onDataWritten);
sigveseb 0:7499fa0a8ecb 165 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
sigveseb 0:7499fa0a8ecb 166 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
sigveseb 0:7499fa0a8ecb 167 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
sigveseb 0:7499fa0a8ecb 168
sigveseb 0:7499fa0a8ecb 169
sigveseb 0:7499fa0a8ecb 170 ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA,
sigveseb 0:7499fa0a8ecb 171 beaconPayload, sizeof(beaconPayload));
sigveseb 0:7499fa0a8ecb 172
sigveseb 0:7499fa0a8ecb 173 ble.startAdvertising();
sigveseb 0:7499fa0a8ecb 174
sigveseb 0:7499fa0a8ecb 175 ble.addService(display_service);
sigveseb 0:7499fa0a8ecb 176
sigveseb 0:7499fa0a8ecb 177 myled = 1;
sigveseb 0:7499fa0a8ecb 178
sigveseb 0:7499fa0a8ecb 179 py.printf("Starting up.\n");
sigveseb 0:7499fa0a8ecb 180
sigveseb 0:7499fa0a8ecb 181 current_command = COMMAND_NOOP;
sigveseb 0:7499fa0a8ecb 182
sigveseb 0:7499fa0a8ecb 183 while (true) {
sigveseb 0:7499fa0a8ecb 184 ble.waitForEvent();
sigveseb 0:7499fa0a8ecb 185 myled = !myled;
sigveseb 0:7499fa0a8ecb 186
sigveseb 0:7499fa0a8ecb 187 if(current_command == COMMAND_CLEAR) {
sigveseb 0:7499fa0a8ecb 188
sigveseb 0:7499fa0a8ecb 189 py.printf("Clearing.\n");
sigveseb 0:7499fa0a8ecb 190 EPD.begin(EPD_2_7);
sigveseb 0:7499fa0a8ecb 191 EPD.start();
sigveseb 0:7499fa0a8ecb 192 EPD.clear();
sigveseb 0:7499fa0a8ecb 193 EPD.end();
sigveseb 0:7499fa0a8ecb 194 current_command = COMMAND_NOOP;
sigveseb 0:7499fa0a8ecb 195 }
sigveseb 0:7499fa0a8ecb 196
sigveseb 0:7499fa0a8ecb 197
sigveseb 0:7499fa0a8ecb 198 if(current_command == COMMAND_IMAGE_UPPER) {
sigveseb 0:7499fa0a8ecb 199 py.printf("Uppering.\n");
sigveseb 0:7499fa0a8ecb 200 EPD.begin(EPD_2_7);
sigveseb 0:7499fa0a8ecb 201 EPD.start();
sigveseb 0:7499fa0a8ecb 202 EPD.image(image, 0, EPD.lines_per_display / 2);
sigveseb 0:7499fa0a8ecb 203 EPD.end();
sigveseb 0:7499fa0a8ecb 204 current_command = COMMAND_NOOP;
sigveseb 0:7499fa0a8ecb 205 }
sigveseb 0:7499fa0a8ecb 206
sigveseb 0:7499fa0a8ecb 207
sigveseb 0:7499fa0a8ecb 208 if(current_command == COMMAND_IMAGE_LOWER) {
sigveseb 0:7499fa0a8ecb 209 py.printf("Lowering.\n");
sigveseb 0:7499fa0a8ecb 210 EPD.begin(EPD_2_7);
sigveseb 0:7499fa0a8ecb 211 EPD.start();
sigveseb 0:7499fa0a8ecb 212 EPD.image(image, EPD.lines_per_display / 2);
sigveseb 0:7499fa0a8ecb 213 EPD.end();
sigveseb 0:7499fa0a8ecb 214 current_command = COMMAND_NOOP;
sigveseb 0:7499fa0a8ecb 215 }
sigveseb 0:7499fa0a8ecb 216
sigveseb 0:7499fa0a8ecb 217 }
sigveseb 0:7499fa0a8ecb 218 }