String ProxyObject::physics() const { PROXY_SERIALIZED(); if (!isPresence()) return SequencedPresenceProperties::physics(); SequencedPresencePropertiesPtr req = mParent->parent()->presenceRequestedLocation(getObjectReference()); uint64 latest_epoch = mParent->parent()->presenceLatestEpoch(getObjectReference()); if (!req || latest_epoch >= req->getUpdateSeqNo(LOC_PHYSICS_PART)) return SequencedPresenceProperties::physics(); return req->physics(); }
bool ProxyObject::isAggregate() const { PROXY_SERIALIZED(); if (!isPresence()) return SequencedPresenceProperties::isAggregate(); SequencedPresencePropertiesPtr req = mParent->parent()->presenceRequestedLocation(getObjectReference()); uint64 latest_epoch = mParent->parent()->presenceLatestEpoch(getObjectReference()); if (!req || latest_epoch >= req->getUpdateSeqNo(LOC_IS_AGG_PART)) return SequencedPresenceProperties::isAggregate(); return req->isAggregate(); }
Transfer::URI ProxyObject::mesh() const { PROXY_SERIALIZED(); if (!isPresence()) return SequencedPresenceProperties::mesh(); SequencedPresencePropertiesPtr req = mParent->parent()->presenceRequestedLocation(getObjectReference()); uint64 latest_epoch = mParent->parent()->presenceLatestEpoch(getObjectReference()); if (!req || latest_epoch >= req->getUpdateSeqNo(LOC_MESH_PART)) return SequencedPresenceProperties::mesh(); return req->mesh(); }
TimedMotionQuaternion ProxyObject::orientation() const { PROXY_SERIALIZED(); if (!isPresence()) return SequencedPresenceProperties::orientation(); SequencedPresencePropertiesPtr req = mParent->parent()->presenceRequestedLocation(getObjectReference()); uint64 latest_epoch = mParent->parent()->presenceLatestEpoch(getObjectReference()); if (!req || latest_epoch >= req->getUpdateSeqNo(LOC_ORIENT_PART)) return SequencedPresenceProperties::orientation(); return req->orientation(); }
/* * Sauna floor control procedure. */ int controlSaunaFloor(float currentFloorTemp, float targetFloorTemp) { if (isPresence()) { int floorHeatingON = currentFloorTemp < targetFloorTemp; setSaunaFloor(floorHeatingON); return floorHeatingON; } return OFF; }
/** Current target temperature, controlled by configuration */ float getTargetTemp() { // -- Check precence time if (isPresence()) { /* TMP solution for comfort sleep. Once per room valves are installed, this code should be gone to controlRoom() function. */ if (checkIfNowWithinInterval(configuration.sleepModeStartHour, 0, configuration.sleepModeEndHour, 0)) return configuration.sleepTargetTemp; else return configuration.presenceTargetTemp; } // -- If in standby, check day/night targets to save power if (isSaving()) { return configuration.standbyTargetNightTemp; } return configuration.standbyTargetTemp; }
int main(int argc, const char** args) { // -- Set confguration.ini & others directories setDirectories(); // -- Check for previous fatal errors if (wasOverheated()) { printf("Previous heater failure detected. Cannot run.\n\r"); return EXIT_FAIL; } // -- Load settings from .ini file loadSettings(); initRoomDescriptors(); // debug stuff // printf("%s", asctime(&configuration.arrive)); // printf("%s", asctime(&configuration.dep)); // time_t tt = getHeatingStartTime(); // // printf("%s", ctime(&tt)); // printf("%f\n", getTargetTemp()); // // printf("%f\n", configuration.tempDelta); // printf("%f\n", configuration.fluidPumpOffTemp); // return; // end of debug stuff // -- Measure current temperatures and set out the target float controlTemp = getControlTemperature(); float outgoingFluidTemp = getT(outputSensor); float ingoingFluidTemp = getT(inputSensor); float electricHeaterTemp = getT(heaterSensor); float kitchenTemp = getT(kitchenSensor); float bathroomTemp = getT(bathRoomSensor); float sashaBedroomTemp = getT(childrenSmallSensor); float targetTemp = getTargetTemp(); // -- Control heater and pump int heaterState = controlHeater(controlTemp, electricHeaterTemp, outgoingFluidTemp); // -- Control sauna floor temp float saunaFloorTemp = getT(saunaFloorSensor); float saunaFloorTargetTemp = configuration.saunaFloorTemp; int saunaFloorHeatingState = controlSaunaFloor(saunaFloorTemp, saunaFloorTargetTemp); // -- Initizlize temp vector (no paritcular order) float tv[10]; int tvc = 0; tv[tvc++] = controlTemp; tv[tvc++] = electricHeaterTemp; tv[tvc++] = ingoingFluidTemp; tv[tvc++] = outgoingFluidTemp; tv[tvc++] = bathroomTemp; tv[tvc++] = kitchenTemp; tv[tvc++] = sashaBedroomTemp; int pumpState = controlPump(tv, tvc); // -- Individual rooms control /* Not tested yet */ int i; for (i=0; i<ROOMS_COUNT; i++) controlRoom(&roomControlDescriptors[i], targetTemp); // -- Dates: now and when to start heating next time by our arrival char nowStr[TBL], onStr[TBL]; getDateTimeStr(nowStr, TBL, time(NULL)); getDateTimeStr(onStr, TBL, getHeatingStartTime()); printf("%s|%4.2f|%4.2f|%4.2f| %4.2f |%4.2f|%4.2f|%4.2f|%4.2f| %4.2f|%4.2f |%4.2f|%d|%d|%4.2f|%d|%c|%c|%4.1f|%4.1f|%s\r\n", nowStr, electricHeaterTemp, ingoingFluidTemp, outgoingFluidTemp, getT(externalSensor), getT(amSensor), getT(bedroomSensor), getT(cabinetSensor), sashaBedroomTemp, kitchenTemp, bathroomTemp, controlTemp, heaterState, pumpState, saunaFloorTemp, saunaFloorHeatingState, (isPresence() ? 'P' : 'S'), (isSaving() ? 'N' : 'D'), targetTemp, saunaFloorTargetTemp, onStr ); return EXIT_OK; }