Kris Scholte Lubberink
/
SSS_Ble
Ble for smart sOlutions
source/InterestService.cpp@6:ee9c86f06eae, 2019-05-20 (annotated)
- Committer:
- kris@kris-X682X
- Date:
- Mon May 20 09:55:38 2019 +0200
- Revision:
- 6:ee9c86f06eae
- Child:
- 7:9cda1b0f25ae
WIP
Who changed what in which revision?
User | Revision | Line number | New 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 | 6:ee9c86f06eae | 9 | int value[5]; |
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 | 6:ee9c86f06eae | 20 | static bool serviceAdded = false; /* We should only ever need to add the information service once. */ |
kris@kris-X682X | 6:ee9c86f06eae | 21 | if (serviceAdded) { |
kris@kris-X682X | 6:ee9c86f06eae | 22 | return; |
kris@kris-X682X | 6:ee9c86f06eae | 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 | 6:ee9c86f06eae | 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 | 6:ee9c86f06eae | 43 | if(handle == interestCharacteristic.getValueHandle()){ |
kris@kris-X682X | 6:ee9c86f06eae | 44 | printf("You wrote interests!"); |
kris@kris-X682X | 6:ee9c86f06eae | 45 | printf("The value should be an array of 5 integers."); |
kris@kris-X682X | 6:ee9c86f06eae | 46 | // color = writeParams->data; |
kris@kris-X682X | 6:ee9c86f06eae | 47 | int index = 0; |
kris@kris-X682X | 6:ee9c86f06eae | 48 | for (int i=0; i < 5; i++) { |
kris@kris-X682X | 6:ee9c86f06eae | 49 | interests[i] = writeParams->data[i];//+3] << 24 | (writeParams->data[i+2] & 0xff) << 16 | (writeParams->data[i+1] & 0xff) << 8| (writeParams->data[i] & 0xff); |
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 | 6:ee9c86f06eae | 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 | 6:ee9c86f06eae | 78 | interests[0] = ptr->value[0]; |
kris@kris-X682X | 6:ee9c86f06eae | 79 | interests[1] = ptr->value[1]; |
kris@kris-X682X | 6:ee9c86f06eae | 80 | interests[2] = ptr->value[2]; |
kris@kris-X682X | 6:ee9c86f06eae | 81 | interests[3] = ptr->value[3]; |
kris@kris-X682X | 6:ee9c86f06eae | 82 | interests[4] = ptr->value[4]; |
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 | 6:ee9c86f06eae | 87 | newmemory.value[0] = 2; |
kris@kris-X682X | 6:ee9c86f06eae | 88 | newmemory.value[1] = 3; |
kris@kris-X682X | 6:ee9c86f06eae | 89 | newmemory.value[2] = 4; |
kris@kris-X682X | 6:ee9c86f06eae | 90 | newmemory.value[3] = 5; |
kris@kris-X682X | 6:ee9c86f06eae | 91 | newmemory.value[4] = 6; |
kris@kris-X682X | 6:ee9c86f06eae | 92 | flash_device.erase(address, flash_device.get_sector_size(address)); |
kris@kris-X682X | 6:ee9c86f06eae | 93 | flash_device.program(&newmemory, address, sizeof(newmemory)); |
kris@kris-X682X | 6:ee9c86f06eae | 94 | printf("Flashed"); |
kris@kris-X682X | 6:ee9c86f06eae | 95 | } |
kris@kris-X682X | 6:ee9c86f06eae | 96 | return 0; |
kris@kris-X682X | 6:ee9c86f06eae | 97 | } |
kris@kris-X682X | 6:ee9c86f06eae | 98 | |
kris@kris-X682X | 6:ee9c86f06eae | 99 | |
kris@kris-X682X | 6:ee9c86f06eae | 100 | int InterestService::writeToFs() { |
kris@kris-X682X | 6:ee9c86f06eae | 101 | enum { MAGIC_VALUE = 0xDEADBEEF }; |
kris@kris-X682X | 6:ee9c86f06eae | 102 | mbed::FlashIAP flash_device; |
kris@kris-X682X | 6:ee9c86f06eae | 103 | flash_device.init(); |
kris@kris-X682X | 6:ee9c86f06eae | 104 | packed_A newmemory; |
kris@kris-X682X | 6:ee9c86f06eae | 105 | int sector_size = flash_device.get_sector_size(flash_device.get_flash_start() + flash_device.get_flash_size() - 1UL); |
kris@kris-X682X | 6:ee9c86f06eae | 106 | int page_size = flash_device.get_page_size(); |
kris@kris-X682X | 6:ee9c86f06eae | 107 | int address = (flash_device.get_flash_start() + flash_device.get_flash_size()) - (sector_size); |
kris@kris-X682X | 6:ee9c86f06eae | 108 | |
kris@kris-X682X | 6:ee9c86f06eae | 109 | newmemory.magic = MAGIC_VALUE; |
kris@kris-X682X | 6:ee9c86f06eae | 110 | newmemory.value[0] = interests[0]; |
kris@kris-X682X | 6:ee9c86f06eae | 111 | newmemory.value[1] = interests[1]; |
kris@kris-X682X | 6:ee9c86f06eae | 112 | newmemory.value[2] = interests[2]; |
kris@kris-X682X | 6:ee9c86f06eae | 113 | newmemory.value[3] = interests[3]; |
kris@kris-X682X | 6:ee9c86f06eae | 114 | newmemory.value[4] = interests[4]; |
kris@kris-X682X | 6:ee9c86f06eae | 115 | flash_device.erase(address, flash_device.get_sector_size(address)); |
kris@kris-X682X | 6:ee9c86f06eae | 116 | flash_device.program(&newmemory, address, sizeof(newmemory)); |
kris@kris-X682X | 6:ee9c86f06eae | 117 | printf("Flashed"); |
kris@kris-X682X | 6:ee9c86f06eae | 118 | return 0; |
kris@kris-X682X | 6:ee9c86f06eae | 119 | } |
kris@kris-X682X | 6:ee9c86f06eae | 120 | |
kris@kris-X682X | 6:ee9c86f06eae | 121 | int InterestService::createFs(){ |
kris@kris-X682X | 6:ee9c86f06eae | 122 | return true; |
kris@kris-X682X | 6:ee9c86f06eae | 123 | } |
kris@kris-X682X | 6:ee9c86f06eae | 124 | |
kris@kris-X682X | 6:ee9c86f06eae | 125 | InterestService::~InterestService() { |
kris@kris-X682X | 6:ee9c86f06eae | 126 | printf("[PERIPHERAL]\t Destructing InterestService"); |
kris@kris-X682X | 6:ee9c86f06eae | 127 | } |