logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

djinn_split_sync.c (1712B)


  1. // Copyright 2018-2023 Nick Brassel (@tzarc)
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "transactions.h"
  4. #include "split_util.h"
  5. #include "djinn.h"
  6. kb_runtime_config kb_state;
  7. uint32_t last_slave_sync_time = 0;
  8. void kb_state_update(void) {
  9. if (is_keyboard_master()) {
  10. // Modify allowed current limits
  11. usbpd_update();
  12. }
  13. }
  14. void kb_state_sync(void) {
  15. if (!is_transport_connected()) return;
  16. if (is_keyboard_master()) {
  17. // Keep track of the last state, so that we can tell if we need to propagate to slave
  18. static kb_runtime_config last_kb_state;
  19. static uint32_t last_sync;
  20. bool needs_sync = false;
  21. // Check if the state values are different
  22. if (memcmp(&kb_state, &last_kb_state, sizeof(kb_runtime_config))) {
  23. needs_sync = true;
  24. memcpy(&last_kb_state, &kb_state, sizeof(kb_runtime_config));
  25. }
  26. // Send to slave every 500ms regardless of state change
  27. if (timer_elapsed32(last_sync) > 500) {
  28. needs_sync = true;
  29. }
  30. // Perform the sync if requested
  31. if (needs_sync) {
  32. if (transaction_rpc_send(RPC_ID_SYNC_STATE_KB, sizeof(kb_runtime_config), &kb_state)) {
  33. last_sync = timer_read32();
  34. } else {
  35. dprint("Failed to perform data transaction\n");
  36. }
  37. }
  38. }
  39. }
  40. void kb_state_sync_slave(uint8_t m2s_size, const void* m2s_buffer, uint8_t s2m_size, void* s2m_buffer) {
  41. if (m2s_size == sizeof(kb_runtime_config)) {
  42. memcpy(&kb_state, m2s_buffer, sizeof(kb_runtime_config));
  43. last_slave_sync_time = timer_read32();
  44. }
  45. }