flipperzero-firmware/applications/irda/irda-app-file-parser.cpp
Albert Kharisov c583cce5bd
[FL-1401] Add Universal TV remote (#539)
* Remove excess headers
* Add ButtonPanel
* Add Popup
* Move FileReader to standalone object
* Universal remote (part 1)
* Universal remote (part 2)
* Global rename tranciever/file_parser
* Compile assets
* syntax fix
* English: rename tranceiver to transceiver.

Co-authored-by: あく <alleteam@gmail.com>
2021-06-25 16:52:27 +03:00

59 lines
1.5 KiB
C++

#include "irda-app-file-parser.hpp"
std::unique_ptr<IrdaAppFileParser::IrdaFileMessage> IrdaAppFileParser::read_message(File* file) {
while(1) {
auto str = getline(file);
if(str.empty()) return nullptr;
auto message = parse_message(str);
if(message) return message;
}
}
std::unique_ptr<IrdaAppFileParser::IrdaFileMessage>
IrdaAppFileParser::parse_message(const std::string& str) const {
char protocol_name[32];
uint32_t address;
uint32_t command;
auto irda_file_message = std::make_unique<IrdaFileMessage>();
int parsed = std::sscanf(
str.c_str(),
"%31s %31s A:%lX C:%lX",
irda_file_message->name,
protocol_name,
&address,
&command);
if(parsed != 4) {
return nullptr;
}
IrdaProtocol protocol = irda_get_protocol_by_name(protocol_name);
if(!irda_is_protocol_valid((IrdaProtocol)protocol)) {
return nullptr;
}
int address_length = irda_get_protocol_address_length(protocol);
uint32_t address_mask = (1LU << (4 * address_length)) - 1;
if(address != (address & address_mask)) {
return nullptr;
}
int command_length = irda_get_protocol_command_length(protocol);
uint32_t command_mask = (1LU << (4 * command_length)) - 1;
if(command != (command & command_mask)) {
return nullptr;
}
irda_file_message->message = {
.protocol = protocol,
.address = address,
.command = command,
.repeat = false,
};
return irda_file_message;
}