ソースを参照

FIX - Keyboard LEDS

The main issue was I used a setup structure on the stack which turned into garbage.  Earlier I thought the data was copied, but it was not...

Found that fixing this resolved the earlier issue where I needed to defer the update.  So removed the defered code, plus use member variable for the one byte output instead of static variable.
main
Kurt Eckhardt 7年前
コミット
d3e21b04c0
2個のファイルの変更2行の追加24行の削除
  1. +0
    -2
      USBHost_t36.h
  2. +2
    -22
      keyboard.cpp

+ 0
- 2
USBHost_t36.h ファイルの表示

@@ -669,8 +669,6 @@ private:
uint8_t keyOEM;
uint8_t prev_report[8];
KBDLeds_t leds_ = {0};
bool update_leds_ = false;
bool processing_new_data_ = false;
Pipe_t mypipes[2] __attribute__ ((aligned(32)));
Transfer_t mytransfers[4] __attribute__ ((aligned(32)));
strbuf_t mystring_bufs[1];

+ 2
- 22
keyboard.cpp ファイルの表示

@@ -179,7 +179,6 @@ static bool contains(uint8_t b, const uint8_t *data)

void KeyboardController::new_data(const Transfer_t *transfer)
{
processing_new_data_ = true;
println("KeyboardController Callback (member)");
print(" KB Data: ");
print_hexbytes(transfer->buffer, 8);
@@ -197,12 +196,6 @@ void KeyboardController::new_data(const Transfer_t *transfer)
}
memcpy(prev_report, report, 8);
queue_Data_Transfer(datapipe, report, 8, this);
processing_new_data_ = false;

// See if we have any outstanding leds to update
if (update_leds_) {
updateLEDS();
}
}


@@ -328,22 +321,9 @@ void KeyboardController::LEDS(uint8_t leds) {
}

void KeyboardController::updateLEDS() {
println("KBD: Update LEDS", leds_.byte, HEX);
if (processing_new_data_) {
println(" Update defered");
update_leds_ = true;
return; // defer until later
}

// Now lets tell keyboard new state.
static uint8_t keyboard_keys_report[1] = {0};
setup_t keys_setup;
keyboard_keys_report[0] = leds_.byte;
queue_Data_Transfer(datapipe, report, 8, this);
mk_setup(keys_setup, 0x21, 9, 0x200, 0, sizeof(keyboard_keys_report)); // hopefully this sets leds
queue_Control_Transfer(device, &keys_setup, keyboard_keys_report, this);

update_leds_ = false;
mk_setup(setup, 0x21, 9, 0x200, 0, sizeof(leds_.byte)); // hopefully this sets leds
queue_Control_Transfer(device, &setup, &leds_.byte, this);
}



読み込み中…
キャンセル
保存