Ble for smart sOlutions

Dependencies:   Adafruit_WS2801

Committer:
kris@kris-X682X
Date:
Mon May 20 13:20:35 2019 +0200
Revision:
7:9cda1b0f25ae
Parent:
6:ee9c86f06eae
Child:
9:92d861703f96
Working broadcast & advertise

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