cli_control.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "cli_control.h"
  2. #include <cli/cli.h>
  3. #include <cli/cli_i.h>
  4. #include <cli/cli_vcp.h>
  5. #include "cligui_main_i.h"
  6. volatile bool gotCallbackSet = false;
  7. FuriStreamBuffer* tx_stream;
  8. FuriStreamBuffer* rx_stream;
  9. static size_t real_rx_handler(uint8_t* buffer, size_t size, uint32_t timeout) {
  10. size_t rx_cnt = 0;
  11. while(size > 0) {
  12. size_t batch_size = size;
  13. if(batch_size > 128) batch_size = 128;
  14. size_t len = furi_stream_buffer_receive(rx_stream, buffer, batch_size, timeout);
  15. if(len == 0) break;
  16. size -= len;
  17. buffer += len;
  18. rx_cnt += len;
  19. }
  20. return rx_cnt;
  21. }
  22. static void tx_handler_stdout(const char* buffer, size_t size) {
  23. furi_stream_buffer_send(tx_stream, buffer, size, FuriWaitForever);
  24. }
  25. static void tx_handler(const uint8_t* buffer, size_t size) {
  26. furi_thread_set_stdout_callback(tx_handler_stdout);
  27. furi_stream_buffer_send(tx_stream, buffer, size, FuriWaitForever);
  28. }
  29. static void session_init(void) {}
  30. static void session_deinit(void) {}
  31. static bool session_connected(void) {return true;}
  32. static CliSession session;
  33. void latch_tx_handler() {
  34. Cli* global_cli = furi_record_open(RECORD_CLI);
  35. furi_thread_set_stdout_callback(tx_handler_stdout);
  36. rx_stream = furi_stream_buffer_alloc(128, 1);
  37. tx_stream = furi_stream_buffer_alloc(128, 1);
  38. session.tx = &tx_handler;
  39. session.rx = &real_rx_handler;
  40. session.tx_stdout = &tx_handler_stdout;
  41. session.init = &session_init;
  42. session.deinit = &session_deinit;
  43. session.is_connected = &session_connected;
  44. cli_session_close(global_cli);
  45. cli_session_open(global_cli, &session);
  46. // furi_stream_buffer_send(rx_stream, "help\r\n", 6, FuriWaitForever);
  47. // Unlock loader-lock
  48. Loader* loader = furi_record_open(RECORD_LOADER);
  49. Loader_internal* loader_i = (Loader_internal*)loader;
  50. loader_i->lock_count = 0;
  51. furi_record_close(RECORD_CLI);
  52. furi_record_close(RECORD_LOADER);
  53. }
  54. void unlatch_tx_handler() {
  55. Cli* global_cli = furi_record_open(RECORD_CLI);
  56. cli_session_close(global_cli);
  57. cli_session_open(global_cli, &cli_vcp);
  58. furi_stream_buffer_free(rx_stream);
  59. furi_stream_buffer_free(tx_stream);
  60. furi_record_close(RECORD_CLI);
  61. }