etwmc / Personal-HomeKit-HAP

This project will provide source code to build a HomeKit support accessories.
MIT License
236 stars 85 forks source link

Trying to get the Light+Fan example running #72

Open esemwy opened 7 years ago

esemwy commented 7 years ago

I've made changes such that the example compiles, but I get a segmentation fault during the initial pairing. The changes consist of changing setValue calls to characteristics::setValue and adding connectionInfo* to the identify callbacks. I'm working on Raspbian. Can anyone out there enlighten me?

Pair Verify M1
Pair Verify M3
Verify success
Segmentation fault (core dumped)

I've determined that the fault happens sometime after connectionInfo::handleAccessoryRequest from this GDB back-trace, but I can't get any farther.

(gdb) bt
#0  0x00000000 in ?? ()
#1  0x000431d0 in connectionInfo::handleAccessoryRequest (this=0x69af8 <connection>) at PHKNetworkIP.cpp:881
#2  0x00040c50 in connectionLoop (threadInfo=0x69af8 <connection>) at PHKNetworkIP.cpp:308
#3  0x76ccbe90 in start_thread (arg=0x74dff450) at pthread_create.c:311
#4  0x76ab9598 in ?? () at ../ports/sysdeps/unix/sysv/linux/arm/nptl/../clone.S:92 from /lib/arm-linux-gnueabihf/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) 

Here's my version of the Accessory.cpp

/*
 * This accessory.cpp is configurated for light accessory + fan accessory
 */

#include "Accessory.h"

#include "PHKAccessory.h"

//Global Level of light strength
int lightStength = 0;
int fanSpeedVal = 0;

void lightIdentify(bool oldValue, bool newValue, connectionInfo *sender) {
    printf("Start Identify Light\n");
}

void fanIdentify(bool oldValue, bool newValue, connectionInfo *sender) {
    printf("Start Identify Fan\n");
}

AccessorySet *accSet;

void initAccessorySet() {
    currentDeviceType = deviceType_bridge;

    printf("Initial Accessory\n");

    Accessory *lightAcc = new Accessory();

    //Add Light
    accSet = &AccessorySet::getInstance();
    addInfoServiceToAccessory(lightAcc, "Light 1", "ET", "Light", "12345678", &lightIdentify);
    accSet->addAccessory(lightAcc);

    Service *lightService = new Service(serviceType_lightBulb);
    lightAcc->addService(lightService);

    stringCharacteristics *lightServiceName = new stringCharacteristics(charType_serviceName, premission_read, 0);
    lightServiceName->characteristics::setValue("Light");
    lightAcc->addCharacteristics(lightService, lightServiceName);

    boolCharacteristics *powerState = new boolCharacteristics(charType_on, premission_read|premission_write);
    powerState->characteristics::setValue("true");
    lightAcc->addCharacteristics(lightService, powerState);

    intCharacteristics *brightnessState = new intCharacteristics(charType_brightness, premission_read|premission_write, 0, 100, 1, unit_percentage);
    brightnessState->characteristics::setValue("50");
    lightAcc->addCharacteristics(lightService, brightnessState);

    //Add fan
    Accessory *fan = new Accessory();
    addInfoServiceToAccessory(fan, "Fan 1", "ET", "Fan", "12345678", &fanIdentify);
    accSet->addAccessory(fan);

    Service *fanService = new Service(serviceType_fan);
    fan->addService(fanService);

    stringCharacteristics *fanServiceName = new stringCharacteristics(charType_serviceName, premission_read, 0);
    fanServiceName->characteristics::setValue("Fan");
    fan->addCharacteristics(fanService, lightServiceName);

    boolCharacteristics *fanPower = new boolCharacteristics(charType_on, premission_read|premission_write);
    fanPower->characteristics::setValue("true");
    fan->addCharacteristics(fanService, fanPower);
};
esemwy commented 7 years ago

Ah, it was newConnection that was undefined in the accessory. Added it and deadConnection. It runs now, but the accessory is not supported. Will continue... Assistance still welcome. I'm just trying to produce a simple accessory that prints state changes on the console.