void Bot::one_step () { if (_page == NULL) { qDebug("initial load for base url"); GoTo(_baseurl, true); return; } if (_gpage == NULL && _page->pagekind != page_Login) { qWarning("we're not on game page. [re]login"); GoTo(_baseurl); return; } QDateTime ts = QDateTime::currentDateTime(); if (_workq.empty()) { // нет никакой работы // ищем сперва основную работу // qDebug(u8("ищем основную работу")); if (_nextq.empty()) { fillNextQ(); } while (!_nextq.empty()) { Work *p = _nextq.front(); _nextq.pop_front(); if (pushWork(p)) { return; // вернёмся в следующем цикле } // if (p->isEnabled() && (p->isActive() || p->isMyWork())) { // if (_workcycle_debug2) { // qDebug(u8("пробуем начать работу: %1").arg(p->getWorkName())); // } // if (p->processQuery(Work::CanStartWork)) { // if (_workcycle_debug2) { // qDebug(u8("%1 startable").arg(p->getWorkName())); // } // p->wearOnBegin(); // if (p->processCommand(Work::StartWork)) { // if (_workcycle_debug) { // qWarning(u8("наша текущая работа: %1").arg(p->getWorkName())); // } // _workq.push_front(p); // //break; // return; // лучше в следующем цикле придём // } else { // p->wearOnEnd(); // if (_workcycle_debug) { // qDebug(u8("работа %1 почему-то не запустилась") // .arg(p->getWorkName())); // } // } // } else { // if (_workcycle_debug2) { // qDebug(u8("%1 is not startable").arg(p->getWorkName())); // } // } // } else { // if (_workcycle_debug2) { // qDebug(u8("%1 is not enabled").arg(p->getWorkName())); // } // } } } if (_workq.empty() || ( _workq.front()->isPrimaryWork() && _workq.front()->processQuery(Work::CanStartSecondaryWork))) { // qDebug(u8("ищем дополнительную работу")); WorkListIterator i(_secworklist); while (i.hasNext()) { Work *p = i.next(); if (p->isEnabled() && p->isActive()) { if (_workcycle_debug2) { qDebug(u8("пробуем начать подработку: ") + p->getWorkName()); } if (p->processQuery(Work::CanStartWork)) { if (_workcycle_debug2) { qDebug(u8("%1 startable").arg(p->getWorkName())); } if (p->processCommand(Work::StartWork)) { qWarning(u8("запустили подработку: %1").arg(p->getWorkName())); _workq.push_front(p); // break; return; // лучше в следующем цикле придём } else { if (_workcycle_debug) { qDebug(u8("допработа %1 почему-то не запустилась") .arg(p->getWorkName())); } } } else { if (_workcycle_debug2) { qDebug(u8("%1 is not startable").arg(p->getWorkName())); } } } else { if (_workcycle_debug2) { qDebug(u8("%1 is not enabled").arg(p->getWorkName())); } } } } if (_workq.empty()) { // работы у нас нет, а добавляли мы её кодом ранее. // значит делать нам пока нечего, значит идём отсюда return; } if (_workq.front()->nextStep() == true) { return; // отработали нормально. } // завершили работу или подработку Work *p = _workq.front(); _workq.pop_front(); if (p->isPrimaryWork()) { if (_workcycle_debug) { p->wearOnEnd(); qWarning(u8("закончена работа ") + p->getWorkName()); } } else { if (_workcycle_debug) { qWarning(u8("закончена подработка ") + p->getWorkName()); } } popWork(); }
//------------------------------------------------------------------------------ static uint8_t serialProcess(Application *app) { uint16_t count = RingBuffer_GetCount(&app->buffer_); if(count == 0) return true; uint8_t cmd = RingBuffer_Peek(&app->buffer_); switch(cmd) { case 'L': RingBuffer_Remove(&app->buffer_); LEDs_ToggleLEDs(LEDS_LED1); break; case 'R': RingBuffer_Remove(&app->buffer_); asicReset(); asicResetSpi(); app->state.state = STATE_RESET; sendCmdReply(app, cmd, (uint8_t *)&app->state, sizeof(State)); break; case 'I': RingBuffer_Remove(&app->buffer_); sendCmdReply(app, cmd, (uint8_t *)&ID, sizeof(ID)); break; case 'A': RingBuffer_Remove(&app->buffer_); app->state.state = STATE_RESET; asicStop(); sendCmdReply(app, cmd, (uint8_t *)&app->state, sizeof(State)); break; case 'S': RingBuffer_Remove(&app->buffer_); sendCmdReply(app, cmd, (uint8_t *)&app->state, sizeof(State)); break; case 'W': if(count > 44) // 32 bytes midstate + 12 bytes data { RingBuffer_Remove(&app->buffer_); uint8_t i = 0; uint8_t *midstate = (uint8_t *)app->worktask.midstate; uint8_t *data = (uint8_t *)app->worktask.data; for(i=0; i<32; i++) { midstate[i] = RingBuffer_Remove(&app->buffer_); } for(i=0; i<12; i++) { data[i] = RingBuffer_Remove(&app->buffer_); } asicPrecalc(app->worktask.midstate, app->worktask.data, app->worktask.precalc); app->state.state = STATE_WORKING; app->state.nonce_valid = 0; app->state.nonce = 0; asicReset(); asicResetSpi(); pushWork(app, &app->worktask); timerSet(&app->work_timer, 16000); sendCmdReply(app, cmd, (uint8_t *)&app->state, sizeof(State)); } break; default: RingBuffer_Remove(&app->buffer_); break; } return true; }