Exemplo n.º 1
0
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();
}
Exemplo n.º 2
0
//------------------------------------------------------------------------------
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;
}