Ble for smart sOlutions

Dependencies:   Adafruit_WS2801

source/InterestService.cpp

Committer:
kris@kris-X682X
Date:
2019-05-20
Revision:
6:ee9c86f06eae
Child:
7:9cda1b0f25ae

File content as of revision 6:ee9c86f06eae:

//
// Created by kris on 7-5-19.
//

#include "InterestService.h"
#pragma pack(push,1)
struct packed_A {
    uint32_t magic;
    int value[5];
};
#pragma pack(pop)

InterestService::InterestService(BLE& _ble) :
        ble(_ble),
        interestCharacteristic( (UUID)CustomUUIDs::UUID_INTEREST_CHAR,
                                &interests,
                                GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NONE)
{

    static bool serviceAdded = false; /* We should only ever need to add the information service once. */
    if (serviceAdded) {
        return;
    }
    printf("[PERIPHERAL] Adding interest service.. \r\n");
    GattCharacteristic *charTable[] = { &interestCharacteristic };

    GattService colorService(
            CustomUUIDs::UUID_INTEREST_SERVICE,
            charTable,
            sizeof(charTable) / sizeof(GattCharacteristic *));
    ble.gattServer().addService(colorService);
    ble.gattServer().onDataWritten(this, &InterestService::onDataWritten);
    readFromFs();

    serviceAdded = true;
}

void InterestService::onDataWritten(const GattWriteCallbackParams *writeParams) {
    //TODO: You gave me some data... Let's store it!
    uint16_t handle = writeParams->handle;
    printf("You wrote some data... But for which char? \r\n");
    printf("%d == %d", handle, interestCharacteristic.getValueHandle());//colorCharacteristic.getValueHandle());
    if(handle == interestCharacteristic.getValueHandle()){
        printf("You wrote interests!");
        printf("The value should be an array of 5 integers.");
//            color = writeParams->data;
        int index = 0;
        for (int i=0; i < 5;  i++) {
            interests[i] = writeParams->data[i];//+3] << 24 | (writeParams->data[i+2] & 0xff) << 16 | (writeParams->data[i+1] & 0xff) << 8| (writeParams->data[i] & 0xff);
            index++;
            printf("Index: %d, val %08X \r\n", index, interests[i]);
        }
        writeToFs();
    }
}

int InterestService::readFromFs() {
    enum { MAGIC_VALUE = 0xDEADBEEF };
    mbed::FlashIAP flash_device;
    flash_device.init();
    int sector_size = flash_device.get_sector_size(flash_device.get_flash_start() + flash_device.get_flash_size() - 1UL);
    int page_size = flash_device.get_page_size();
    int address = (flash_device.get_flash_start() + flash_device.get_flash_size()) - (sector_size);
    printf("Sector size: %d \r\n", sector_size);
    printf("Page size: %d \r\n", page_size);
    printf("Address: %d \r\n", address);

    int buffer[24];
    flash_device.read(buffer, address, 24);
    packed_A const *ptr = (packed_A const *) buffer;

    if(ptr->magic == MAGIC_VALUE) {
        printf("Address initialized, current list %d,%d,%d,%d,%d \r\n", ptr->value[0],
               ptr->value[1],
               ptr->value[2],
               ptr->value[3],
               ptr->value[4]);
        interests[0] = ptr->value[0];
        interests[1] = ptr->value[1];
        interests[2] = ptr->value[2];
        interests[3] = ptr->value[3];
        interests[4] = ptr->value[4];
    } else {
        printf("Uninitialized, setting up first time");
        packed_A newmemory;
        newmemory.magic = MAGIC_VALUE;
        newmemory.value[0] = 2;
        newmemory.value[1] = 3;
        newmemory.value[2] = 4;
        newmemory.value[3] = 5;
        newmemory.value[4] = 6;
        flash_device.erase(address, flash_device.get_sector_size(address));
        flash_device.program(&newmemory, address, sizeof(newmemory));
        printf("Flashed");
    }
    return 0;
}


int InterestService::writeToFs() {
    enum { MAGIC_VALUE = 0xDEADBEEF };
    mbed::FlashIAP flash_device;
    flash_device.init();
    packed_A newmemory;
    int sector_size = flash_device.get_sector_size(flash_device.get_flash_start() + flash_device.get_flash_size() - 1UL);
    int page_size = flash_device.get_page_size();
    int address = (flash_device.get_flash_start() + flash_device.get_flash_size()) - (sector_size);

    newmemory.magic = MAGIC_VALUE;
    newmemory.value[0] = interests[0];
    newmemory.value[1] = interests[1];
    newmemory.value[2] = interests[2];
    newmemory.value[3] = interests[3];
    newmemory.value[4] = interests[4];
    flash_device.erase(address, flash_device.get_sector_size(address));
    flash_device.program(&newmemory, address, sizeof(newmemory));
    printf("Flashed");
    return 0;
}

int InterestService::createFs(){
    return true;
}

InterestService::~InterestService() {
    printf("[PERIPHERAL]\t Destructing InterestService");
}