Ble for smart sOlutions

Dependencies:   Adafruit_WS2801

Committer:
kris@kris-X682X
Date:
Thu Jun 20 13:20:24 2019 +0200
Revision:
11:d6ed1437c2ee
Parent:
10:d845189d146e
Refactored

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 10:d845189d146e 7
kris@kris-X682X 10:d845189d146e 8 #include "FlashIAP.h"
kris@kris-X682X 10:d845189d146e 9 #include "MyStripSingleton.h"
kris@kris-X682X 10:d845189d146e 10
kris@kris-X682X 10:d845189d146e 11 uint32_t sector_size;
kris@kris-X682X 10:d845189d146e 12 uint32_t page_size;
kris@kris-X682X 10:d845189d146e 13 uint32_t prog_size;
kris@kris-X682X 10:d845189d146e 14 uint32_t address;
kris@kris-X682X 10:d845189d146e 15 mbed::FlashIAP flash_device;
kris@kris-X682X 10:d845189d146e 16
kris@kris-X682X 6:ee9c86f06eae 17 #pragma pack(push,1)
kris@kris-X682X 6:ee9c86f06eae 18 struct packed_A {
kris@kris-X682X 6:ee9c86f06eae 19 uint32_t magic;
kris@kris-X682X 10:d845189d146e 20 uint32_t interest1;
kris@kris-X682X 10:d845189d146e 21 uint32_t interest2;
kris@kris-X682X 10:d845189d146e 22 uint32_t interest3;
kris@kris-X682X 10:d845189d146e 23 uint32_t interest4;
kris@kris-X682X 10:d845189d146e 24 uint32_t interest5;
kris@kris-X682X 10:d845189d146e 25
kris@kris-X682X 6:ee9c86f06eae 26 };
kris@kris-X682X 6:ee9c86f06eae 27 #pragma pack(pop)
kris@kris-X682X 10:d845189d146e 28 enum { MAGIC_VALUE = 0xC0FFEE };
kris@kris-X682X 6:ee9c86f06eae 29
kris@kris-X682X 6:ee9c86f06eae 30 InterestService::InterestService(BLE& _ble) :
kris@kris-X682X 6:ee9c86f06eae 31 ble(_ble),
kris@kris-X682X 6:ee9c86f06eae 32 interestCharacteristic( (UUID)CustomUUIDs::UUID_INTEREST_CHAR,
kris@kris-X682X 6:ee9c86f06eae 33 &interests,
kris@kris-X682X 6:ee9c86f06eae 34 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NONE)
kris@kris-X682X 6:ee9c86f06eae 35 {
kris@kris-X682X 6:ee9c86f06eae 36 printf("[PERIPHERAL] Adding interest service.. \r\n");
kris@kris-X682X 6:ee9c86f06eae 37 GattCharacteristic *charTable[] = { &interestCharacteristic };
kris@kris-X682X 6:ee9c86f06eae 38
kris@kris-X682X 9:92d861703f96 39 GattService interestService(
kris@kris-X682X 6:ee9c86f06eae 40 CustomUUIDs::UUID_INTEREST_SERVICE,
kris@kris-X682X 6:ee9c86f06eae 41 charTable,
kris@kris-X682X 6:ee9c86f06eae 42 sizeof(charTable) / sizeof(GattCharacteristic *));
kris@kris-X682X 9:92d861703f96 43 ble.gattServer().addService(interestService);
kris@kris-X682X 6:ee9c86f06eae 44 ble.gattServer().onDataWritten(this, &InterestService::onDataWritten);
kris@kris-X682X 6:ee9c86f06eae 45 readFromFs();
kris@kris-X682X 10:d845189d146e 46 }
kris@kris-X682X 6:ee9c86f06eae 47
kris@kris-X682X 10:d845189d146e 48 bool initializeDevice()
kris@kris-X682X 10:d845189d146e 49 {
kris@kris-X682X 10:d845189d146e 50 return flash_device.init() == 0;
kris@kris-X682X 6:ee9c86f06eae 51 }
kris@kris-X682X 6:ee9c86f06eae 52
kris@kris-X682X 10:d845189d146e 53 void determineValues()
kris@kris-X682X 10:d845189d146e 54 {
kris@kris-X682X 10:d845189d146e 55 sector_size = flash_device.get_sector_size(flash_device.get_flash_start() + flash_device.get_flash_size() - 1UL);
kris@kris-X682X 10:d845189d146e 56 page_size = flash_device.get_page_size();
kris@kris-X682X 10:d845189d146e 57 address = (flash_device.get_flash_start() + flash_device.get_flash_size()) - (sector_size);
kris@kris-X682X 10:d845189d146e 58 printf("[PERIPHERAL]\t Sector size: %d \r\n", sector_size);
kris@kris-X682X 10:d845189d146e 59 printf("[PERIPHERAL]\t Page size: %d \r\n", page_size);
kris@kris-X682X 10:d845189d146e 60 printf("[PERIPHERAL]\t Address: %d \r\n", address);
kris@kris-X682X 10:d845189d146e 61 }
kris@kris-X682X 6:ee9c86f06eae 62 void InterestService::onDataWritten(const GattWriteCallbackParams *writeParams) {
kris@kris-X682X 6:ee9c86f06eae 63 //TODO: You gave me some data... Let's store it!
kris@kris-X682X 6:ee9c86f06eae 64 uint16_t handle = writeParams->handle;
kris@kris-X682X 10:d845189d146e 65 printf("[PERIPHERAL]\t You wrote some data... But for which char? \r\n");
kris@kris-X682X 6:ee9c86f06eae 66 printf("%d == %d", handle, interestCharacteristic.getValueHandle());//colorCharacteristic.getValueHandle());
kris@kris-X682X 10:d845189d146e 67 if(handle == 6 || handle == 16 || handle == interestCharacteristic.getValueHandle()){
kris@kris-X682X 10:d845189d146e 68 printf("[PERIPHERAL]\t You wrote interests!");
kris@kris-X682X 10:d845189d146e 69 printf("[PERIPHERAL]\t The value should be an array of 5 integers.");
kris@kris-X682X 6:ee9c86f06eae 70 // color = writeParams->data;
kris@kris-X682X 6:ee9c86f06eae 71 int index = 0;
kris@kris-X682X 7:9cda1b0f25ae 72 for (int i=0; i < 20; i++) {
kris@kris-X682X 7:9cda1b0f25ae 73 interests[i] = writeParams->data[i];
kris@kris-X682X 6:ee9c86f06eae 74 index++;
kris@kris-X682X 10:d845189d146e 75 printf("[PERIPHERAL]\t Index: %d, val %08X \r\n", index, interests[i]);
kris@kris-X682X 6:ee9c86f06eae 76 }
kris@kris-X682X 9:92d861703f96 77 printf("[PERIPHERAL]\t Writing that to the FS..\r\n");
kris@kris-X682X 6:ee9c86f06eae 78 writeToFs();
kris@kris-X682X 9:92d861703f96 79 }
kris@kris-X682X 6:ee9c86f06eae 80 }
kris@kris-X682X 6:ee9c86f06eae 81
kris@kris-X682X 10:d845189d146e 82
kris@kris-X682X 6:ee9c86f06eae 83 int InterestService::readFromFs() {
kris@kris-X682X 10:d845189d146e 84 if(initializeDevice()){
kris@kris-X682X 10:d845189d146e 85 determineValues();
kris@kris-X682X 10:d845189d146e 86
kris@kris-X682X 10:d845189d146e 87
kris@kris-X682X 10:d845189d146e 88 uint8_t *data_flashed = new uint8_t[24];
kris@kris-X682X 10:d845189d146e 89 uint8_t buffer[24];
kris@kris-X682X 10:d845189d146e 90 flash_device.read(buffer, address, 24);
kris@kris-X682X 10:d845189d146e 91 packed_A const *ptr = (packed_A const *) buffer;
kris@kris-X682X 10:d845189d146e 92 // printf("%d", ptr->magic);
kris@kris-X682X 6:ee9c86f06eae 93
kris@kris-X682X 10:d845189d146e 94 if(ptr->magic == MAGIC_VALUE) {
kris@kris-X682X 10:d845189d146e 95 printf("[PERIPHERAL]\t Address initialized, current magic %6x \r\n", ptr->magic);
kris@kris-X682X 10:d845189d146e 96 printf("[PERIPHERAL]\t Address initialized, current list %lx,%lx,%lx,%lx,%lx \r\n",
kris@kris-X682X 10:d845189d146e 97 ptr->interest1,
kris@kris-X682X 10:d845189d146e 98 ptr->interest2,
kris@kris-X682X 10:d845189d146e 99 ptr->interest3,
kris@kris-X682X 10:d845189d146e 100 ptr->interest4,
kris@kris-X682X 10:d845189d146e 101 ptr->interest5);
kris@kris-X682X 10:d845189d146e 102
kris@kris-X682X 10:d845189d146e 103 interests[0] = ptr->interest1;
kris@kris-X682X 10:d845189d146e 104 interests[1] = ptr->interest2;
kris@kris-X682X 10:d845189d146e 105 interests[2] = ptr->interest3;
kris@kris-X682X 10:d845189d146e 106 interests[3] = ptr->interest4;
kris@kris-X682X 10:d845189d146e 107 interests[4] = ptr->interest5;
kris@kris-X682X 10:d845189d146e 108 ble.gattServer().write(interestCharacteristic.getValueHandle(), (uint8_t *) &interests, sizeof(interests_T));
kris@kris-X682X 6:ee9c86f06eae 109
kris@kris-X682X 10:d845189d146e 110 printf("[PERIPHERAL]\t Interests should now be set to: %8x,%8x,%8x,%8x,%8x \r\n",
kris@kris-X682X 10:d845189d146e 111 interests[0],
kris@kris-X682X 10:d845189d146e 112 interests[1],
kris@kris-X682X 10:d845189d146e 113 interests[2],
kris@kris-X682X 10:d845189d146e 114 interests[3],
kris@kris-X682X 10:d845189d146e 115 interests[4]
kris@kris-X682X 10:d845189d146e 116 ) ;
kris@kris-X682X 10:d845189d146e 117 MyStripSingleton::getInstance()->ints.interest1 = ptr->interest1;
kris@kris-X682X 10:d845189d146e 118 MyStripSingleton::getInstance()->ints.interest2 = ptr->interest2;
kris@kris-X682X 10:d845189d146e 119 MyStripSingleton::getInstance()->ints.interest3 = ptr->interest3;
kris@kris-X682X 10:d845189d146e 120 MyStripSingleton::getInstance()->ints.interest4 = ptr->interest4;
kris@kris-X682X 10:d845189d146e 121 MyStripSingleton::getInstance()->ints.interest5 = ptr->interest5;
kris@kris-X682X 10:d845189d146e 122
kris@kris-X682X 7:9cda1b0f25ae 123
kris@kris-X682X 10:d845189d146e 124 printf("[PERIPHERAL]\t Interest 1: %d %6x \r\n", MyStripSingleton::getInstance()->ints.interest1 >> 24, MyStripSingleton::getInstance()->ints.interest1);
kris@kris-X682X 10:d845189d146e 125 printf("[PERIPHERAL]\t Interest 2: %d %8x \r\n", MyStripSingleton::getInstance()->ints.interest2 >> 24, MyStripSingleton::getInstance()->ints.interest2 );
kris@kris-X682X 10:d845189d146e 126 printf("[PERIPHERAL]\t Interest 3: %d %8x \r\n", MyStripSingleton::getInstance()->ints.interest3 >> 24, MyStripSingleton::getInstance()->ints.interest3 );
kris@kris-X682X 10:d845189d146e 127 printf("[PERIPHERAL]\t Interest 4: %d %8x \r\n", MyStripSingleton::getInstance()->ints.interest4 >> 24, MyStripSingleton::getInstance()->ints.interest4 );
kris@kris-X682X 10:d845189d146e 128 printf("[PERIPHERAL]\t Interest 5: %d %8x \r\n", MyStripSingleton::getInstance()->ints.interest5 >> 24, MyStripSingleton::getInstance()->ints.interest5 );
kris@kris-X682X 10:d845189d146e 129 } else {
kris@kris-X682X 10:d845189d146e 130 printf("[PERIPHERAL]\t Uninitialized, setting up first time");
kris@kris-X682X 10:d845189d146e 131 packed_A newmemory;
kris@kris-X682X 10:d845189d146e 132 newmemory.magic = MAGIC_VALUE;
kris@kris-X682X 10:d845189d146e 133 newmemory.interest1 = 0UL;
kris@kris-X682X 10:d845189d146e 134 newmemory.interest2 = 0UL;
kris@kris-X682X 10:d845189d146e 135 newmemory.interest3 = 0UL;
kris@kris-X682X 10:d845189d146e 136 newmemory.interest4 = 0UL;
kris@kris-X682X 10:d845189d146e 137 newmemory.interest5 = 0UL;
kris@kris-X682X 10:d845189d146e 138 interests[0] = 0;
kris@kris-X682X 10:d845189d146e 139 interests[1] = 0;
kris@kris-X682X 10:d845189d146e 140 interests[2] = 0;
kris@kris-X682X 10:d845189d146e 141 interests[3] = 0;
kris@kris-X682X 10:d845189d146e 142 interests[4] = 0;
kris@kris-X682X 10:d845189d146e 143 ble.gattServer().write(interestCharacteristic.getValueHandle(), (uint8_t *) &interests, sizeof(interests_T));
kris@kris-X682X 10:d845189d146e 144
kris@kris-X682X 10:d845189d146e 145 flash_device.erase(address, flash_device.get_sector_size(address));
kris@kris-X682X 10:d845189d146e 146 flash_device.program(&newmemory, address, flash_device.get_sector_size(address));
kris@kris-X682X 10:d845189d146e 147 printf("[PERIPHERAL]\t Flashed for the first time.");
kris@kris-X682X 7:9cda1b0f25ae 148 }
kris@kris-X682X 10:d845189d146e 149 return 0;
kris@kris-X682X 6:ee9c86f06eae 150 } else {
kris@kris-X682X 10:d845189d146e 151 printf("[PERIPHERAL]\t Couldn't init fs. \r\n");
kris@kris-X682X 10:d845189d146e 152 return -1;
kris@kris-X682X 6:ee9c86f06eae 153 }
kris@kris-X682X 6:ee9c86f06eae 154 }
kris@kris-X682X 6:ee9c86f06eae 155
kris@kris-X682X 6:ee9c86f06eae 156
kris@kris-X682X 6:ee9c86f06eae 157 int InterestService::writeToFs() {
kris@kris-X682X 6:ee9c86f06eae 158 mbed::FlashIAP flash_device;
kris@kris-X682X 6:ee9c86f06eae 159 flash_device.init();
kris@kris-X682X 9:92d861703f96 160 printf("[PERIPHERAL]\t Inited FS.. \r\n");
kris@kris-X682X 6:ee9c86f06eae 161 packed_A newmemory;
kris@kris-X682X 6:ee9c86f06eae 162 int sector_size = flash_device.get_sector_size(flash_device.get_flash_start() + flash_device.get_flash_size() - 1UL);
kris@kris-X682X 6:ee9c86f06eae 163 int page_size = flash_device.get_page_size();
kris@kris-X682X 6:ee9c86f06eae 164 int address = (flash_device.get_flash_start() + flash_device.get_flash_size()) - (sector_size);
kris@kris-X682X 10:d845189d146e 165 printf("[PERIPHERAL]\t Ready?\r\n");
kris@kris-X682X 6:ee9c86f06eae 166
kris@kris-X682X 6:ee9c86f06eae 167 newmemory.magic = MAGIC_VALUE;
kris@kris-X682X 10:d845189d146e 168 newmemory.interest1 = int((unsigned char)( interests[0]) << 24|
kris@kris-X682X 10:d845189d146e 169 (unsigned char)( interests[1]) << 16 |
kris@kris-X682X 10:d845189d146e 170 (unsigned char)( interests[2]) << 8 |
kris@kris-X682X 10:d845189d146e 171 (unsigned char)( interests[3]));
kris@kris-X682X 10:d845189d146e 172 newmemory.interest2 = int((unsigned char)( interests[4]) << 24|
kris@kris-X682X 10:d845189d146e 173 (unsigned char)( interests[5]) << 16 |
kris@kris-X682X 10:d845189d146e 174 (unsigned char)( interests[6]) << 8 |
kris@kris-X682X 10:d845189d146e 175 (unsigned char)( interests[7]));
kris@kris-X682X 10:d845189d146e 176 newmemory.interest3 = int((unsigned char)( interests[8]) << 24|
kris@kris-X682X 10:d845189d146e 177 (unsigned char)( interests[9]) << 16 |
kris@kris-X682X 10:d845189d146e 178 (unsigned char)( interests[10]) << 8 |
kris@kris-X682X 10:d845189d146e 179 (unsigned char)( interests[11]));
kris@kris-X682X 10:d845189d146e 180 newmemory.interest4 = int((unsigned char)( interests[12]) << 24|
kris@kris-X682X 10:d845189d146e 181 (unsigned char)( interests[13]) << 16 |
kris@kris-X682X 10:d845189d146e 182 (unsigned char)( interests[14]) << 8 |
kris@kris-X682X 10:d845189d146e 183 (unsigned char)( interests[15]));
kris@kris-X682X 10:d845189d146e 184 newmemory.interest5 = int((unsigned char)( interests[16]) << 24|
kris@kris-X682X 10:d845189d146e 185 (unsigned char)( interests[17]) << 16 |
kris@kris-X682X 10:d845189d146e 186 (unsigned char)( interests[18]) << 8 |
kris@kris-X682X 10:d845189d146e 187 (unsigned char)( interests[19]));
kris@kris-X682X 10:d845189d146e 188 printf("[PERIPHERAL]\t Mem is now: %d \r\n", newmemory.interest1 );//interests[i]);
kris@kris-X682X 10:d845189d146e 189 printf("[PERIPHERAL]\t Mem is now: %d \r\n", newmemory.interest2 );//interests[i]);
kris@kris-X682X 10:d845189d146e 190 printf("[PERIPHERAL]\t Mem is now: %d \r\n", newmemory.interest3 );//interests[i]);
kris@kris-X682X 10:d845189d146e 191 printf("[PERIPHERAL]\t Mem is now: %d \r\n", newmemory.interest4 );//interests[i]);
kris@kris-X682X 10:d845189d146e 192 printf("[PERIPHERAL]\t Mem is now: %d \r\n", newmemory.interest5 );//interests[i]);
kris@kris-X682X 7:9cda1b0f25ae 193
kris@kris-X682X 9:92d861703f96 194
kris@kris-X682X 10:d845189d146e 195 printf("[PERIPHERAL]\t %d\r\n", sizeof(newmemory));
kris@kris-X682X 10:d845189d146e 196 printf("[PERIPHERAL]\t %d\r\n", address);
kris@kris-X682X 10:d845189d146e 197 printf("[PERIPHERAL]\t %d\r\n", sizeof(interests));
kris@kris-X682X 9:92d861703f96 198
kris@kris-X682X 6:ee9c86f06eae 199 flash_device.erase(address, flash_device.get_sector_size(address));
kris@kris-X682X 9:92d861703f96 200 wait(0.2);
kris@kris-X682X 10:d845189d146e 201 int result = flash_device.program(&newmemory, address, flash_device.get_sector_size(address));
kris@kris-X682X 10:d845189d146e 202 printf("[PERIPHERAL]\t Flashed with result %d \r\n", result);
kris@kris-X682X 10:d845189d146e 203 readFromFs();
kris@kris-X682X 10:d845189d146e 204
kris@kris-X682X 6:ee9c86f06eae 205 return 0;
kris@kris-X682X 6:ee9c86f06eae 206 }
kris@kris-X682X 6:ee9c86f06eae 207
kris@kris-X682X 6:ee9c86f06eae 208 int InterestService::createFs(){
kris@kris-X682X 6:ee9c86f06eae 209 return true;
kris@kris-X682X 6:ee9c86f06eae 210 }
kris@kris-X682X 6:ee9c86f06eae 211
kris@kris-X682X 6:ee9c86f06eae 212 InterestService::~InterestService() {
kris@kris-X682X 9:92d861703f96 213 printf("[PERIPHERAL]\t Destructing InterestService\r\n");
kris@kris-X682X 10:d845189d146e 214 }