Ble for smart sOlutions

Dependencies:   Adafruit_WS2801

Committer:
kris@kris-X682X
Date:
Tue Jun 11 11:16:55 2019 +0200
Revision:
9:92d861703f96
Parent:
7:9cda1b0f25ae
Child:
10:d845189d146e
WS2812 working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kris@kris-X682X 6:ee9c86f06eae 1 //
kris@kris-X682X 6:ee9c86f06eae 2 // Created by kris on 7-5-19.
kris@kris-X682X 6:ee9c86f06eae 3 //
kris@kris-X682X 6:ee9c86f06eae 4
kris@kris-X682X 9:92d861703f96 5 #include <wait_api.h>
kris@kris-X682X 6:ee9c86f06eae 6 #include "InterestService.h"
kris@kris-X682X 6:ee9c86f06eae 7 #pragma pack(push,1)
kris@kris-X682X 6:ee9c86f06eae 8 struct packed_A {
kris@kris-X682X 6:ee9c86f06eae 9 uint32_t magic;
kris@kris-X682X 9:92d861703f96 10 int value[5];
kris@kris-X682X 6:ee9c86f06eae 11 };
kris@kris-X682X 6:ee9c86f06eae 12 #pragma pack(pop)
kris@kris-X682X 6:ee9c86f06eae 13
kris@kris-X682X 6:ee9c86f06eae 14 InterestService::InterestService(BLE& _ble) :
kris@kris-X682X 6:ee9c86f06eae 15 ble(_ble),
kris@kris-X682X 6:ee9c86f06eae 16 interestCharacteristic( (UUID)CustomUUIDs::UUID_INTEREST_CHAR,
kris@kris-X682X 6:ee9c86f06eae 17 &interests,
kris@kris-X682X 6:ee9c86f06eae 18 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NONE)
kris@kris-X682X 6:ee9c86f06eae 19 {
kris@kris-X682X 6:ee9c86f06eae 20
kris@kris-X682X 7:9cda1b0f25ae 21 // static bool serviceAdded = false; /* We should only ever need to add the information service once. */
kris@kris-X682X 7:9cda1b0f25ae 22 // if (serviceAdded) {
kris@kris-X682X 7:9cda1b0f25ae 23 // return;
kris@kris-X682X 7:9cda1b0f25ae 24 // }
kris@kris-X682X 6:ee9c86f06eae 25 printf("[PERIPHERAL] Adding interest service.. \r\n");
kris@kris-X682X 6:ee9c86f06eae 26 GattCharacteristic *charTable[] = { &interestCharacteristic };
kris@kris-X682X 6:ee9c86f06eae 27
kris@kris-X682X 9:92d861703f96 28 GattService interestService(
kris@kris-X682X 6:ee9c86f06eae 29 CustomUUIDs::UUID_INTEREST_SERVICE,
kris@kris-X682X 6:ee9c86f06eae 30 charTable,
kris@kris-X682X 6:ee9c86f06eae 31 sizeof(charTable) / sizeof(GattCharacteristic *));
kris@kris-X682X 9:92d861703f96 32 ble.gattServer().addService(interestService);
kris@kris-X682X 6:ee9c86f06eae 33 ble.gattServer().onDataWritten(this, &InterestService::onDataWritten);
kris@kris-X682X 6:ee9c86f06eae 34 readFromFs();
kris@kris-X682X 6:ee9c86f06eae 35
kris@kris-X682X 7:9cda1b0f25ae 36 // serviceAdded = true;
kris@kris-X682X 6:ee9c86f06eae 37 }
kris@kris-X682X 6:ee9c86f06eae 38
kris@kris-X682X 6:ee9c86f06eae 39 void InterestService::onDataWritten(const GattWriteCallbackParams *writeParams) {
kris@kris-X682X 6:ee9c86f06eae 40 //TODO: You gave me some data... Let's store it!
kris@kris-X682X 6:ee9c86f06eae 41 uint16_t handle = writeParams->handle;
kris@kris-X682X 6:ee9c86f06eae 42 printf("You wrote some data... But for which char? \r\n");
kris@kris-X682X 6:ee9c86f06eae 43 printf("%d == %d", handle, interestCharacteristic.getValueHandle());//colorCharacteristic.getValueHandle());
kris@kris-X682X 9:92d861703f96 44 if(handle == interestCharacteristic.getValueHandle()){
kris@kris-X682X 6:ee9c86f06eae 45 printf("You wrote interests!");
kris@kris-X682X 7:9cda1b0f25ae 46 printf("The value should be an array of 20 integers.");
kris@kris-X682X 6:ee9c86f06eae 47 // color = writeParams->data;
kris@kris-X682X 6:ee9c86f06eae 48 int index = 0;
kris@kris-X682X 7:9cda1b0f25ae 49 for (int i=0; i < 20; i++) {
kris@kris-X682X 7:9cda1b0f25ae 50 interests[i] = writeParams->data[i];
kris@kris-X682X 6:ee9c86f06eae 51 index++;
kris@kris-X682X 6:ee9c86f06eae 52 printf("Index: %d, val %08X \r\n", index, interests[i]);
kris@kris-X682X 6:ee9c86f06eae 53 }
kris@kris-X682X 9:92d861703f96 54 printf("[PERIPHERAL]\t Writing that to the FS..\r\n");
kris@kris-X682X 6:ee9c86f06eae 55 writeToFs();
kris@kris-X682X 9:92d861703f96 56 }
kris@kris-X682X 6:ee9c86f06eae 57 }
kris@kris-X682X 6:ee9c86f06eae 58
kris@kris-X682X 6:ee9c86f06eae 59 int InterestService::readFromFs() {
kris@kris-X682X 9:92d861703f96 60 enum { MAGIC_VALUE = 0xC0FFEE20 };
kris@kris-X682X 6:ee9c86f06eae 61 mbed::FlashIAP flash_device;
kris@kris-X682X 6:ee9c86f06eae 62 flash_device.init();
kris@kris-X682X 6:ee9c86f06eae 63 int sector_size = flash_device.get_sector_size(flash_device.get_flash_start() + flash_device.get_flash_size() - 1UL);
kris@kris-X682X 6:ee9c86f06eae 64 int page_size = flash_device.get_page_size();
kris@kris-X682X 6:ee9c86f06eae 65 int address = (flash_device.get_flash_start() + flash_device.get_flash_size()) - (sector_size);
kris@kris-X682X 6:ee9c86f06eae 66 printf("Sector size: %d \r\n", sector_size);
kris@kris-X682X 6:ee9c86f06eae 67 printf("Page size: %d \r\n", page_size);
kris@kris-X682X 6:ee9c86f06eae 68 printf("Address: %d \r\n", address);
kris@kris-X682X 6:ee9c86f06eae 69
kris@kris-X682X 9:92d861703f96 70 int buffer[5];
kris@kris-X682X 9:92d861703f96 71 flash_device.read(buffer, address, 5);
kris@kris-X682X 6:ee9c86f06eae 72 packed_A const *ptr = (packed_A const *) buffer;
kris@kris-X682X 6:ee9c86f06eae 73
kris@kris-X682X 6:ee9c86f06eae 74 if(ptr->magic == MAGIC_VALUE) {
kris@kris-X682X 6:ee9c86f06eae 75 printf("Address initialized, current list %d,%d,%d,%d,%d \r\n", ptr->value[0],
kris@kris-X682X 6:ee9c86f06eae 76 ptr->value[1],
kris@kris-X682X 6:ee9c86f06eae 77 ptr->value[2],
kris@kris-X682X 6:ee9c86f06eae 78 ptr->value[3],
kris@kris-X682X 6:ee9c86f06eae 79 ptr->value[4]);
kris@kris-X682X 7:9cda1b0f25ae 80
kris@kris-X682X 9:92d861703f96 81 for (int i=0; i < 20; i++) {
kris@kris-X682X 9:92d861703f96 82 interests[i] = int((unsigned char)(ptr->value[i] &0xff) << 24 |
kris@kris-X682X 9:92d861703f96 83 (unsigned char)(ptr->value[i+1]&0xff) << 16 |
kris@kris-X682X 9:92d861703f96 84 (unsigned char)(ptr->value[i+2]&0xff) << 8 |
kris@kris-X682X 9:92d861703f96 85 (unsigned char)(ptr->value[i+3]&0xff));//ptr->value[i] << 24 | (ptr->value[i+1] & 0xff) << 16 | (ptr->value[i+2] & 0xff) << 8| (ptr->value[i+3] & 0xff);
kris@kris-X682X 7:9cda1b0f25ae 86 }
kris@kris-X682X 7:9cda1b0f25ae 87
kris@kris-X682X 6:ee9c86f06eae 88 } else {
kris@kris-X682X 6:ee9c86f06eae 89 printf("Uninitialized, setting up first time");
kris@kris-X682X 6:ee9c86f06eae 90 packed_A newmemory;
kris@kris-X682X 6:ee9c86f06eae 91 newmemory.magic = MAGIC_VALUE;
kris@kris-X682X 7:9cda1b0f25ae 92 for (int i=0; i < 20; i++) {
kris@kris-X682X 9:92d861703f96 93 newmemory.value[i] = 2;
kris@kris-X682X 7:9cda1b0f25ae 94 }
kris@kris-X682X 6:ee9c86f06eae 95 flash_device.erase(address, flash_device.get_sector_size(address));
kris@kris-X682X 6:ee9c86f06eae 96 flash_device.program(&newmemory, address, sizeof(newmemory));
kris@kris-X682X 6:ee9c86f06eae 97 printf("Flashed");
kris@kris-X682X 6:ee9c86f06eae 98 }
kris@kris-X682X 6:ee9c86f06eae 99 return 0;
kris@kris-X682X 6:ee9c86f06eae 100 }
kris@kris-X682X 6:ee9c86f06eae 101
kris@kris-X682X 6:ee9c86f06eae 102
kris@kris-X682X 6:ee9c86f06eae 103 int InterestService::writeToFs() {
kris@kris-X682X 9:92d861703f96 104 enum { MAGIC_VALUE = 0xC0FFEE20 };
kris@kris-X682X 6:ee9c86f06eae 105 mbed::FlashIAP flash_device;
kris@kris-X682X 6:ee9c86f06eae 106 flash_device.init();
kris@kris-X682X 9:92d861703f96 107 printf("[PERIPHERAL]\t Inited FS.. \r\n");
kris@kris-X682X 6:ee9c86f06eae 108 packed_A newmemory;
kris@kris-X682X 6:ee9c86f06eae 109 int sector_size = flash_device.get_sector_size(flash_device.get_flash_start() + flash_device.get_flash_size() - 1UL);
kris@kris-X682X 6:ee9c86f06eae 110 int page_size = flash_device.get_page_size();
kris@kris-X682X 6:ee9c86f06eae 111 int address = (flash_device.get_flash_start() + flash_device.get_flash_size()) - (sector_size);
kris@kris-X682X 9:92d861703f96 112 printf("[PERIPHERAL]\t Ready?");
kris@kris-X682X 6:ee9c86f06eae 113
kris@kris-X682X 6:ee9c86f06eae 114 newmemory.magic = MAGIC_VALUE;
kris@kris-X682X 9:92d861703f96 115 for (int i=0; i < 5; i++) {
kris@kris-X682X 9:92d861703f96 116 printf("[PERIPHERAL]\t U wrote: %d", interests[i]);
kris@kris-X682X 7:9cda1b0f25ae 117 newmemory.value[i] = interests[i];
kris@kris-X682X 7:9cda1b0f25ae 118 }
kris@kris-X682X 7:9cda1b0f25ae 119
kris@kris-X682X 9:92d861703f96 120 printf("[PERIPHERAL]\t %d", sizeof(newmemory));
kris@kris-X682X 9:92d861703f96 121 printf("[PERIPHERAL]\t %d", address);
kris@kris-X682X 9:92d861703f96 122 printf("[PERIPHERAL]\t %d", sizeof(interests));
kris@kris-X682X 9:92d861703f96 123
kris@kris-X682X 9:92d861703f96 124
kris@kris-X682X 6:ee9c86f06eae 125 flash_device.erase(address, flash_device.get_sector_size(address));
kris@kris-X682X 9:92d861703f96 126 wait(0.2);
kris@kris-X682X 9:92d861703f96 127 // return 0;
kris@kris-X682X 6:ee9c86f06eae 128 flash_device.program(&newmemory, address, sizeof(newmemory));
kris@kris-X682X 6:ee9c86f06eae 129 printf("Flashed");
kris@kris-X682X 6:ee9c86f06eae 130 return 0;
kris@kris-X682X 6:ee9c86f06eae 131 }
kris@kris-X682X 6:ee9c86f06eae 132
kris@kris-X682X 6:ee9c86f06eae 133 int InterestService::createFs(){
kris@kris-X682X 6:ee9c86f06eae 134 return true;
kris@kris-X682X 6:ee9c86f06eae 135 }
kris@kris-X682X 6:ee9c86f06eae 136
kris@kris-X682X 6:ee9c86f06eae 137 InterestService::~InterestService() {
kris@kris-X682X 9:92d861703f96 138 printf("[PERIPHERAL]\t Destructing InterestService\r\n");
kris@kris-X682X 6:ee9c86f06eae 139 }