void oledRefresh(void) { /* Draw triangle in upper right corner */ oledInvertDebugLink(); const uint8_t *buffer = oledGetBuffer(); static uint32_t data[OLED_HEIGHT][OLED_WIDTH]; for (size_t i = 0; i < OLED_BUFSIZE; i++) { int x = (OLED_BUFSIZE - 1 - i) % OLED_WIDTH; int y = (OLED_BUFSIZE - 1 - i) / OLED_WIDTH * 8 + 7; for (uint8_t shift = 0; shift < 8; shift++, y--) { bool set = (buffer[i] >> shift) & 1; data[y][x] = set ? 0xFFFFFFFF : 0xFF000000; } } SDL_UpdateTexture(texture, NULL, data, OLED_WIDTH * sizeof(uint32_t)); SDL_RenderCopy(renderer, texture, NULL, NULL); SDL_RenderPresent(renderer); /* Return it back */ oledInvertDebugLink(); }
void fsm_msgDebugLinkGetState(DebugLinkGetState *msg) { (void)msg; RESP_INIT(DebugLinkState); resp->has_layout = true; resp->layout.size = OLED_BUFSIZE; memcpy(resp->layout.bytes, oledGetBuffer(), OLED_BUFSIZE); if (storage.has_pin) { resp->has_pin = true; strlcpy(resp->pin, storage.pin, sizeof(resp->pin)); } resp->has_matrix = true; strlcpy(resp->matrix, pinmatrix_get(), sizeof(resp->matrix)); resp->has_reset_entropy = true; resp->reset_entropy.size = reset_get_int_entropy(resp->reset_entropy.bytes); resp->has_reset_word = true; strlcpy(resp->reset_word, reset_get_word(), sizeof(resp->reset_word)); resp->has_recovery_fake_word = true; strlcpy(resp->recovery_fake_word, recovery_get_fake_word(), sizeof(resp->recovery_fake_word)); resp->has_recovery_word_pos = true; resp->recovery_word_pos = recovery_get_word_pos(); if (storage.has_mnemonic) { resp->has_mnemonic = true; strlcpy(resp->mnemonic, storage.mnemonic, sizeof(resp->mnemonic)); } if (storage.has_node) { resp->has_node = true; memcpy(&(resp->node), &(storage.node), sizeof(HDNode)); } resp->has_passphrase_protection = true; resp->passphrase_protection = storage.has_passphrase_protection && storage.passphrase_protection; msg_debug_write(MessageType_MessageType_DebugLinkState, resp); }