void emitString(const uint8_t s[])
{
    uint8_t i = 0;
    uint8_t c;
    for (c = s[i]; c; c = s[++i])
        emitKey(c);
}
void emitStringN(const uint8_t s[], uint8_t len)
{
    uint8_t i = 0;
    uint8_t c;
    for (c = s[i]; i < len && c; c = s[++i])
        emitKey(c);
}
void emitNumber(uint16_t n)
{
    int8_t zero = 0;

    for (uint16_t i = 10000;;) {
        uint8_t d = n / i;
        if (d || zero) {
            zero = 1;
            emitKey(getNumKeycode(d));
        }
        n %= i;
        i /= 10;
        if (i == 1)
            zero = 1;
        else if (i == 0)
            break;
    }
}
static void about(void)
{
    emitString(about_title);

    // REV.
    emitString(about_rev);
    emitKey(getNumKeycode(BOARD_REV_VALUE));
    emitKey(KEY_ENTER);

    // VER.
    emitString(about_ver);
    emitKey(getNumKeycode((APP_VERSION_VALUE >> 8) & 0xf));
    emitKey(KEY_PERIOD);
    emitKey(getNumKeycode((APP_VERSION_VALUE >> 4) & 0xf));
    emitKey(getNumKeycode(APP_VERSION_VALUE & 0xf));
    emitKey(KEY_ENTER);

#ifdef WITH_HOS
    emitString(about_ble);
    emitString(about_rev);
    emitKey(getNumKeycode(HosGetRevision() & 0xf));
    emitKey(KEY_ENTER);

    emitString(about_ver);
    emitKey(getNumKeycode((HosGetVersion() >> 8) & 0xf));
    emitKey(KEY_PERIOD);
    emitKey(getNumKeycode((HosGetVersion() >> 4) & 0xf));
    emitKey(getNumKeycode(HosGetVersion() & 0xf));
    emitKey(KEY_ENTER);

    emitString(about_copyright);

    emitString(about_kvm);
    emitKey(getNumKeycode(CurrentProfile()));
    emitKey(KEY_ENTER);

    if (!isUSBMode()) {
        emitString(about_lesc);
        emitKey(getNumKeycode(HosGetLESC()));
        emitKey(KEY_ENTER);
    }
#else
    emitString(about_copyright);
#endif

    // F2 OS
    emitString(about_f2);
    emitOSName();

    // F3 Layout
    emitString(about_f3);
    emitBaseName();

    // F4 Kana Layout
    emitString(about_f4);
    emitKanaName();

    // F5 Delay
    emitString(about_f5);
    emitDelayName();

    // F6 Modifiers
    emitString(about_f6);
    emitModName();

    // F7 IME
    emitString(about_f7);
    emitIMEName();

    // F8 LED
    emitString(about_f8);
    emitLEDName();

    // F9 Prefix Shift
    emitString(about_f9);
    emitPrefixShift();

#ifdef ENABLE_MOUSE
    emitMouse();
#endif

#ifdef WITH_HOS
    if (!isBusPowered()) {
        uint16_t voltage = HosGetBatteryVoltage();
        uint8_t level = HosGetBatteryLevel();
        if (HOS_BATTERY_VOLTAGE_OFFSET < voltage) {
            emitKey(getNumKeycode(voltage / 100));
            emitKey(KEY_PERIOD);
            voltage %= 100;
            emitKey(getNumKeycode(voltage / 10));
            emitKey(getNumKeycode(voltage % 10));
            emitKey(KEY_V);
            emitKey(KEY_SPACEBAR);
            emitNumber(level);
            emitKey(KEYPAD_PERCENT);
            emitKey(KEY_ENTER);
        }
    }
#endif
}
Exemple #5
0
void ControlBodyTranslator::processApply(const P4::ApplyMethod* method) {
    builder->emitIndent();
    auto table = control->getTable(method->object->getName().name);
    BUG_CHECK(table != nullptr, "No table for %1%", method->expr);

    P4::ParameterSubstitution binding;
    cstring actionVariableName;
    if (!saveAction.empty()) {
        actionVariableName = saveAction.at(saveAction.size() - 1);
        if (!actionVariableName.isNullOrEmpty()) {
            builder->appendFormat("enum %s %s;\n",
                                  table->actionEnumName.c_str(), actionVariableName.c_str());
            builder->emitIndent();
        }
    }
    builder->blockStart();

    BUG_CHECK(method->expr->arguments->size() == 0, "%1%: table apply with arguments", method);
    cstring keyname = "key";
    if (table->keyGenerator != nullptr) {
        builder->emitIndent();
        builder->appendLine("/* construct key */");
        builder->emitIndent();
        builder->appendFormat("struct %s %s = {}", table->keyTypeName.c_str(), keyname.c_str());
        builder->endOfStatement(true);
        table->emitKey(builder, keyname);
    }
    builder->emitIndent();
    builder->appendLine("/* value */");
    builder->emitIndent();
    cstring valueName = "value";
    builder->appendFormat("struct %s *%s = NULL", table->valueTypeName.c_str(), valueName.c_str());
    builder->endOfStatement(true);

    if (table->keyGenerator != nullptr) {
        builder->emitIndent();
        builder->appendLine("/* perform lookup */");
        builder->emitIndent();
        builder->target->emitTableLookup(builder, table->dataMapName, keyname, valueName);
        builder->endOfStatement(true);
    }

    builder->emitIndent();
    builder->appendFormat("if (%s == NULL) ", valueName.c_str());
    builder->blockStart();

    builder->emitIndent();
    builder->appendLine("/* miss; find default action */");
    builder->emitIndent();
    builder->appendFormat("%s = 0", control->hitVariable.c_str());
    builder->endOfStatement(true);

    builder->emitIndent();
    builder->target->emitTableLookup(builder, table->defaultActionMapName,
                                     control->program->zeroKey, valueName);
    builder->endOfStatement(true);
    builder->blockEnd(false);
    builder->append(" else ");
    builder->blockStart();
    builder->emitIndent();
    builder->appendFormat("%s = 1", control->hitVariable.c_str());
    builder->endOfStatement(true);
    builder->blockEnd(true);

    builder->emitIndent();
    builder->appendFormat("if (%s != NULL) ", valueName.c_str());
    builder->blockStart();
    builder->emitIndent();
    builder->appendLine("/* run action */");
    table->emitAction(builder, valueName);
    if (!actionVariableName.isNullOrEmpty()) {
        builder->emitIndent();
        builder->appendFormat("%s = %s->action",
                              actionVariableName.c_str(), valueName.c_str());
        builder->endOfStatement(true);
    }
    toDereference.clear();

    builder->blockEnd(true);
    builder->emitIndent();
    builder->appendFormat("else return %s", builder->target->abortReturnCode().c_str());
    builder->endOfStatement(true);

    builder->blockEnd(true);
}