void JDDisplay::handleIncoming()

in libs/screen---st7735/jddisplay.cpp [132:218]


void JDDisplay::handleIncoming(jd_packet_t *pkt) {
    if (pkt->service_number == JD_SERVICE_NUMBER_CTRL &&
        pkt->service_command == JD_CMD_ADVERTISEMENT_DATA) {
        uint32_t *servptr = (uint32_t *)pkt->data;
        int numServ = pkt->service_size >> 2;
        for (uint8_t servIdx = 1; servIdx < numServ; ++servIdx) {
            uint32_t service_class = servptr[servIdx];
            if (service_class == JD_SERVICE_CLASS_INDEXED_SCREEN) {
                displayServiceNum = servIdx;
                VLOG("JDA: found screen, serv=%d", servIdx);
            } else if (service_class == JD_SERVICE_CLASS_ARCADE_GAMEPAD) {
                if (!controlsStartServiceNum)
                    controlsStartServiceNum = servIdx;
                controlsEndServiceNum = servIdx;
                VLOG("JDA: found controls, serv=%d", servIdx);
            } else if (service_class == JD_SERVICE_CLASS_ARCADE_SOUND) {
                soundServiceNum = servIdx;
                VLOG("JDA: found sound, serv=%d", servIdx);
            } else {
                VLOG("JDA: unknown service: %x", service_class);
            }
        }
    } else if (pkt->service_number == JD_SERVICE_NUMBER_CTRL &&
               pkt->service_command == JD_CMD_CTRL_NOOP) {
        // do nothing
    } else if (pkt->service_number == soundServiceNum) {
        switch (pkt->service_command) {
        case JD_GET(JD_ARCADE_SOUND_REG_BUFFER_PENDING):
            soundBufferPending = *(uint32_t *)pkt->data;
            break;
        case JD_GET(JD_ARCADE_SOUND_REG_SAMPLE_RATE):
            soundSampleRate = *(uint32_t *)pkt->data >> 10;
            break;
        }
    } else if (pkt->service_number == displayServiceNum) {
        switch (pkt->service_command) {
        case JD_GET(JD_INDEXED_SCREEN_REG_HEIGHT):
            screenHeight = *(uint16_t *)pkt->data;
            break;
        case JD_GET(JD_INDEXED_SCREEN_REG_WIDTH):
            screenWidth = *(uint16_t *)pkt->data;
            break;
        }
    } else if (controlsStartServiceNum <= pkt->service_number &&
               pkt->service_number <= controlsEndServiceNum &&
               pkt->service_command == (JD_CMD_GET_REG | JD_REG_READING)) {
        auto report = (jd_arcade_gamepad_buttons_t *)pkt->data;
        auto endp = pkt->data + pkt->service_size;
        uint32_t state = 0;

        while ((uint8_t *)report < endp) {
            int idx = 0;
            int b = report->button;

            if (report->pressure < 0x20)
                continue;

            if (b == JD_ARCADE_GAMEPAD_BUTTON_SELECT)
                b = JD_ARCADE_GAMEPAD_BUTTON_MENU;

            if (b == JD_ARCADE_GAMEPAD_BUTTON_RESET || b == JD_ARCADE_GAMEPAD_BUTTON_EXIT)
                target_reset();

            if (1 <= b && b <= 7) {
                idx = b + 7 * (pkt->service_number - controlsStartServiceNum);
            }

            if (idx > 0)
                state |= 1 << idx;

            report++;
        }

        if (state != buttonState) {
            for (int i = 0; i < 32; ++i) {
                if ((state & (1 << i)) && !(buttonState & (1 << i)))
                    Event(PXT_INTERNAL_KEY_DOWN, i);
                if (!(state & (1 << i)) && (buttonState & (1 << i)))
                    Event(PXT_INTERNAL_KEY_UP, i);
            }
            buttonState = state;
        }
    } else {
        // TODO remove later
        VLOG("JDA: unknown packet for %d (cmd=%x)", pkt->service_number, pkt->service_command);
    }
}