void CtrlrUpdateManager::run() { #ifdef LINUX return; #endif _INF("Running update check"); sendChangeMessage(); ScopedPointer <XmlElement> xml(getUpdateData()); if (xml) { _DBG("--------------------------------------------------------------"); _DBG(xml->createDocument(String::empty)); _DBG("--------------------------------------------------------------"); if (xml->getBoolAttribute("update")) { /* new version */ triggerAsyncUpdate(); return; } } sendChangeMessage(); }
IOUpdate *IOComponent::getUpdates() { //outputs_waiting = 0; // reset work indicator flag uint8_t *mask = ::generateUpdateMask(); if (!mask) { return 0; } //MEMCHECK(); IOUpdate *res = new IOUpdate; //MEMCHECK(); res->setSize(max_offset - min_offset + 1); res->setData(getUpdateData()); //MEMCHECK(); res->setMask(mask); //MEMCHECK(); #if VERBOSE_DEBUG std::cout << std::flush << "IOComponent::getUpdates preparing to send " << res->size() << " d:"; display(res->data(), process_data_size); std::cout << " m:"; display(res->mask(), process_data_size); std::cout << "\n" << std::flush; #endif //MEMCHECK(); return res; }
void IOComponent::markChange() { assert(io_process_data); if (!update_data) getUpdateData(); uint8_t *offset = update_data + address.io_offset; int bitpos = address.io_bitpos; offset += (bitpos / 8); bitpos = bitpos % 8; if (address.bitlen == 1) { int32_t value = (*offset & (1<< bitpos)) ? 1 : 0; // only outputs will have an e_on or e_off event queued, // if they do, set the bit accordingly, ignoring the previous value if (!value && last_event == e_on) { /* std::cout << "IOComponent::markChange setting bit " << (offset - update_data) << ":" << bitpos << " for " << io_name << "\n"; */ set_bit(offset, bitpos, 1); updatesSent(false); } else if (value &&last_event == e_off) { set_bit(offset, bitpos, 0); updatesSent(false); } last_event = e_none; } else { if (last_event == e_change) { /* std::cerr << " marking change to " << pending_value << " at offset " << (unsigned long)(offset - update_data) << " for " << io_name << "\n"; */ if (address.bitlen == 8) { *offset = (uint8_t)pending_value & 0xff; } else if (address.bitlen == 16) { uint16_t x = pending_value % 65536; toU16(offset, x); } else if (address.bitlen == 32) { toU32(offset, pending_value); } last_event = e_none; #if VERBOSE_DEBUG std::cout << "@"; display(update_data); std::cout << "\n"; #endif updatesSent(false); //address.value = pending_value; } } }