rpc_cli.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <cli/cli.h>
  2. #include <furi.h>
  3. #include <rpc/rpc.h>
  4. #include <furi-hal.h>
  5. typedef struct {
  6. Cli* cli;
  7. bool session_close_request;
  8. } CliRpc;
  9. #define CLI_READ_BUFFER_SIZE 64
  10. static void rpc_send_bytes_callback(void* context, uint8_t* bytes, size_t bytes_len) {
  11. furi_assert(context);
  12. furi_assert(bytes);
  13. furi_assert(bytes_len);
  14. CliRpc* cli_rpc = context;
  15. cli_write(cli_rpc->cli, bytes, bytes_len);
  16. }
  17. static void rpc_session_close_callback(void* context) {
  18. furi_assert(context);
  19. CliRpc* cli_rpc = context;
  20. cli_rpc->session_close_request = true;
  21. }
  22. void rpc_cli_command_start_session(Cli* cli, string_t args, void* context) {
  23. Rpc* rpc = context;
  24. RpcSession* rpc_session = rpc_session_open(rpc);
  25. if(rpc_session == NULL) {
  26. printf("Another session is in progress\r\n");
  27. return;
  28. }
  29. CliRpc cli_rpc = {.cli = cli, .session_close_request = false};
  30. rpc_session_set_context(rpc_session, &cli_rpc);
  31. rpc_session_set_send_bytes_callback(rpc_session, rpc_send_bytes_callback);
  32. rpc_session_set_close_callback(rpc_session, rpc_session_close_callback);
  33. uint8_t* buffer = furi_alloc(CLI_READ_BUFFER_SIZE);
  34. size_t size_received = 0;
  35. while(1) {
  36. size_received = furi_hal_vcp_rx_with_timeout(buffer, CLI_READ_BUFFER_SIZE, 50);
  37. if(!furi_hal_vcp_is_connected() || cli_rpc.session_close_request) {
  38. break;
  39. }
  40. if(size_received) {
  41. furi_assert(
  42. rpc_session_feed(rpc_session, buffer, size_received, 3000) == size_received);
  43. }
  44. }
  45. rpc_session_close(rpc_session);
  46. free(buffer);
  47. }