/** * Controls all the inner workings of the PID functionality * Should be called by _timer * * Controls the heating element Relays manually, overriding the standard relay * functionality * * The pid is designed to Output an analog value, but the relay can only be On/Off. * * "time proportioning control" it's essentially a really slow version of PWM. * first we decide on a window size. Then set the pid to adjust its output between 0 and that window size. * lastly, we add some logic that translates the PID output into "Relay On Time" with the remainder of the * window being "Relay Off Time" * * PID Adaptive Tuning * You can change the tuning parameters. this can be * helpful if we want the controller to be agressive at some * times, and conservative at others. * */ void Ohmbrewer::Thermostat::doPID(){ getSensor()->work(); setPoint = getTargetTemp()->c(); //targetTemp input = getSensor()->getTemp()->c();//currentTemp double gap = abs(setPoint-input); //distance away from target temp //SET TUNING PARAMETERS if (gap<10) { //we're close to targetTemp, use conservative tuning parameters _thermPID->SetTunings(cons.kP(), cons.kI(), cons.kD()); }else {//we're far from targetTemp, use aggressive tuning parameters _thermPID->SetTunings(agg.kP(), agg.kI(), agg.kD()); } //COMPUTATIONS _thermPID->Compute(); if (millis() - windowStartTime>windowSize) { //time to shift the Relay Window windowStartTime += windowSize; } //TURN ON if (getState() && gap!=0) {//if we want to turn on the element (thermostat is ON) //TURN ON state and powerPin if (!(getElement()->getState())) {//if heating element is off getElement()->setState(true);//turn it on if (getElement()->getPowerPin() != -1) { // if powerPin enabled digitalWrite(getElement()->getPowerPin(), HIGH); //turn it on (only once each time you switch state) } } //RELAY MODULATION if (output < millis() - windowStartTime) { digitalWrite(getElement()->getControlPin(), HIGH); } else { digitalWrite(getElement()->getControlPin(), LOW); } } //TURN OFF if (gap == 0 || getTargetTemp()->c() <= getSensor()->getTemp()->c() ) {//once reached target temp getElement()->setState(false); //turn off element getElement()->work(); // if (getElement()->getPowerPin() != -1) { // if powerPin enabled // digitalWrite(getElement()->getPowerPin(), LOW); //turn it off too TODO check this // } // Notify Ohmbrewer that the target temperature has been reached. Publisher pub = Publisher(new String(getStream()), String("msg"), String("Target Temperature Reached.")); pub.add(String("last_read_time"), String(getSensor()->getLastReadTime())); pub.add(String("temperature"), String(getSensor()->getTemp()->c())); pub.publish(); } }
void RTPPublisher::removed(const SubscriberStub& sub, const NodeStub& node) { RScopeLock lock(_mutex); int status; std::string ip = sub.getIP(); uint16_t port = sub.getPort(); if (!ip.length()) //only use separate subscriber ip (for multicast support etc.), if specified ip = node.getIP(); // do we now about this sub via this node? bool subscriptionFound = false; std::pair<_domainSubs_t::iterator, _domainSubs_t::iterator> subIter = _domainSubs.equal_range(sub.getUUID()); while(subIter.first != subIter.second) { if (subIter.first->second.first.getUUID() == node.getUUID()) { subscriptionFound = true; break; } subIter.first++; } if (!subscriptionFound) return; UM_LOG_INFO("%s: lost a %s subscriber (%s:%u) for channel %s", SHORT_UUID(_uuid).c_str(), sub.isMulticast() ? "multicast" : "unicast", ip.c_str(), port, _channelName.c_str()); struct libre::sa addr; libre::sa_init(&addr, AF_INET); if ((status = libre::sa_set_str(&addr, ip.c_str(), port))) UM_LOG_WARN("%s: error %d in libre::sa_set_str(%s:%u): %s", SHORT_UUID(_uuid).c_str(), status, ip.c_str(), port, strerror(status)); else _destinations.erase(ip+":"+toStr(port)); if (_domainSubs.count(sub.getUUID()) == 1) { // about to vanish if (_greeter != NULL) { Publisher pub(Publisher(StaticPtrCast<PublisherImpl>(shared_from_this()))); _greeter->farewell(pub, sub); } _subs.erase(sub.getUUID()); } _domainSubs.erase(subIter.first); UMUNDO_SIGNAL(_pubLock); }
void RomInfo::SaveToDatabase() { MSqlQuery query(MSqlQuery::InitCon()); bool inserting = false; if (m_id == 0) inserting = true; if (inserting) { LOG(VB_GENERAL, LOG_INFO, LOC + QString("Adding %1 - %2").arg(Rompath()) .arg(Romname())); query.prepare("INSERT INTO gamemetadata " "(system, romname, gamename, genre, year, gametype, " "rompath, country, crc_value, diskcount, display, plot, " "publisher, version, fanart, boxart, screenshot) " "VALUES (:SYSTEM, :ROMNAME, :GAMENAME, :GENRE, :YEAR, " ":GAMETYPE, :ROMPATH, :COUNTRY, :CRC32, '1', '1', :PLOT, " ":PUBLISHER, :VERSION, :FANART, :BOXART, :SCREENSHOT)"); query.bindValue(":SYSTEM",System()); query.bindValue(":ROMNAME",Romname()); query.bindValue(":GAMENAME",Gamename()); query.bindValue(":GENRE",Genre()); query.bindValue(":YEAR",Year()); query.bindValue(":GAMETYPE",GameType()); query.bindValue(":ROMPATH",Rompath()); query.bindValue(":COUNTRY",Country()); query.bindValue(":CRC32", QString()); query.bindValue(":PLOT", Plot()); query.bindValue(":PUBLISHER", Publisher()); query.bindValue(":VERSION", Version()); query.bindValue(":FANART", Fanart()); query.bindValue(":BOXART", Boxart()); query.bindValue(":SCREENSHOT", Screenshot()); } else { query.prepare("UPDATE gamemetadata " "SET version = 'CUSTOM', " " gamename = :GAMENAME," " genre = :GENRE," " year = :YEAR," " country = :COUNTRY," " plot = :PLOT," " publisher = :PUBLISHER," " favorite = :FAVORITE," " screenshot = :SCREENSHOT," " fanart = :FANART," " boxart = :BOXART, " " inetref = :INETREF " "WHERE gametype = :GAMETYPE AND " " romname = :ROMNAME"); query.bindValue(":GAMENAME", Gamename()); query.bindValue(":GENRE", Genre()); query.bindValue(":YEAR", Year()); query.bindValue(":COUNTRY", Country()); query.bindValue(":PLOT", Plot()); query.bindValue(":PUBLISHER", Publisher()); query.bindValue(":FAVORITE", Favorite()); query.bindValue(":SCREENSHOT", Screenshot()); query.bindValue(":FANART", Fanart()); query.bindValue(":BOXART", Boxart()); query.bindValue(":INETREF", Inetref()); query.bindValue(":GAMETYPE", GameType()); query.bindValue(":ROMNAME", Romname()); } if (!query.exec()) { MythDB::DBError("RomInfo::SaveToDatabase", query); return; } }
void RomInfo::UpdateDatabase() { MSqlQuery query(MSqlQuery::InitCon()); query.prepare("SELECT gamename,genre,year,country,plot,publisher, " "favorite,screenshot,fanart,boxart,inetref " "FROM gamemetadata " "WHERE gametype = :GAMETYPE " "AND romname = :ROMNAME"); query.bindValue(":GAMETYPE", GameType()); query.bindValue(":ROMNAME", Romname()); if (!query.exec()) { MythDB::DBError("RomInfo::UpdateDatabase", query); return; } if (!query.next()) return; QString t_gamename = query.value(0).toString(); QString t_genre = query.value(1).toString(); QString t_year = query.value(2).toString(); QString t_country = query.value(3).toString(); QString t_plot = query.value(4).toString(); QString t_publisher = query.value(5).toString(); bool t_favourite = query.value(6).toBool(); QString t_screenshot = query.value(7).toString(); QString t_fanart = query.value(8).toString(); QString t_boxart = query.value(9).toString(); QString t_inetref = query.value(10).toString(); if ((t_gamename != Gamename()) || (t_genre != Genre()) || (t_year != Year()) || (t_country != Country()) || (t_plot != Plot()) || (t_publisher != Publisher()) || (t_favourite != Favorite()) || (t_screenshot != Screenshot()) || (t_fanart != Fanart()) || (t_boxart != Boxart()) || (t_inetref != Inetref())) { query.prepare("UPDATE gamemetadata " "SET version = 'CUSTOM', " " gamename = :GAMENAME," " genre = :GENRE," " year = :YEAR," " country = :COUNTRY," " plot = :PLOT," " publisher = :PUBLISHER," " favorite = :FAVORITE," " screenshot = :SCREENSHOT," " fanart = :FANART," " boxart = :BOXART, " " inetref = :INETREF " "WHERE gametype = :GAMETYPE AND " " romname = :ROMNAME"); query.bindValue(":GAMENAME", Gamename()); query.bindValue(":GENRE", Genre()); query.bindValue(":YEAR", Year()); query.bindValue(":COUNTRY", Country()); query.bindValue(":PLOT", Plot()); query.bindValue(":PUBLISHER", Publisher()); query.bindValue(":FAVORITE", Favorite()); query.bindValue(":SCREENSHOT", Screenshot()); query.bindValue(":FANART", Fanart()); query.bindValue(":BOXART", Boxart()); query.bindValue(":INETREF", Inetref()); query.bindValue(":GAMETYPE", GameType()); query.bindValue(":ROMNAME", Romname()); if (!query.exec()) { MythDB::DBError("RomInfo::UpdateDatabase", query); return; } } }