irda-cli.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "app-template.h"
  2. #include "cli/cli.h"
  3. #include "cmsis_os2.h"
  4. #include <furi.h>
  5. #include <api-hal-irda.h>
  6. #include "irda.h"
  7. #include <sstream>
  8. #include <string>
  9. #include <m-string.h>
  10. typedef struct IrdaCli {
  11. IrdaDecoderHandler* handler;
  12. osMessageQueueId_t message_queue;
  13. } IrdaCli;
  14. static void irda_rx_callback(void* ctx, bool level, uint32_t duration) {
  15. IrdaCli* irda_cli = (IrdaCli*)ctx;
  16. const IrdaMessage* message;
  17. message = irda_decode(irda_cli->handler, level, duration);
  18. if(message) {
  19. osMessageQueuePut(irda_cli->message_queue, message, 0, 0);
  20. }
  21. }
  22. static void irda_cli_start_ir_rx(Cli* cli, string_t args, void* context) {
  23. if(api_hal_irda_rx_irq_is_busy()) {
  24. printf("IRDA is busy. Exit.");
  25. return;
  26. }
  27. IrdaCli irda_cli;
  28. irda_cli.handler = irda_alloc_decoder();
  29. irda_cli.message_queue = osMessageQueueNew(2, sizeof(IrdaMessage), NULL);
  30. api_hal_irda_rx_irq_init();
  31. api_hal_irda_rx_irq_set_callback(irda_rx_callback, &irda_cli);
  32. printf("Receiving IRDA...\r\nPress Ctrl+C to abort\r\n");
  33. while(!cli_cmd_interrupt_received(cli)) {
  34. IrdaMessage message;
  35. if(osOK == osMessageQueueGet(irda_cli.message_queue, &message, NULL, 50)) {
  36. printf(
  37. "%s, A:0x%0*lX, C:0x%0*lX%s\r\n",
  38. irda_get_protocol_name(message.protocol),
  39. irda_get_protocol_address_length(message.protocol),
  40. message.address,
  41. irda_get_protocol_command_length(message.protocol),
  42. message.command,
  43. message.repeat ? " R" : "");
  44. }
  45. }
  46. api_hal_irda_rx_irq_deinit();
  47. irda_free_decoder(irda_cli.handler);
  48. osMessageQueueDelete(irda_cli.message_queue);
  49. }
  50. static void irda_cli_print_usage(void) {
  51. printf("Usage:\r\n\tir_tx <protocol> <address> <command>\r\n");
  52. printf("\t<command> and <address> are hex-formatted\r\n");
  53. printf("\tAvailable protocols:");
  54. for(int i = 0; irda_is_protocol_valid((IrdaProtocol)i); ++i) {
  55. printf(" %s", irda_get_protocol_name((IrdaProtocol)i));
  56. }
  57. printf("\r\n");
  58. }
  59. static void irda_cli_start_ir_tx(Cli* cli, string_t args, void* context) {
  60. if(api_hal_irda_rx_irq_is_busy()) {
  61. printf("IRDA is busy. Exit.");
  62. return;
  63. }
  64. uint32_t command = 0;
  65. uint32_t address = 0;
  66. char protocol_name[32];
  67. int parsed = sscanf(string_get_cstr(args), "%31s %lX %lX", protocol_name, &address, &command);
  68. if(parsed != 3) {
  69. printf("Wrong arguments.\r\n");
  70. irda_cli_print_usage();
  71. return;
  72. }
  73. IrdaProtocol protocol = irda_get_protocol_by_name(protocol_name);
  74. if(!irda_is_protocol_valid(protocol)) {
  75. printf("Unknown protocol.\r\n");
  76. irda_cli_print_usage();
  77. return;
  78. }
  79. IrdaMessage message = {
  80. .protocol = protocol,
  81. .address = address,
  82. .command = command,
  83. .repeat = false,
  84. };
  85. irda_send(&message, 1);
  86. }
  87. extern "C" void irda_cli_init() {
  88. Cli* cli = (Cli*)furi_record_open("cli");
  89. cli_add_command(cli, "ir_rx", irda_cli_start_ir_rx, NULL);
  90. cli_add_command(cli, "ir_tx", irda_cli_start_ir_tx, NULL);
  91. furi_record_close("cli");
  92. }