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);
}
}