[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>
This commit is contained in:
58
applications/irda/irda-app-file-parser.cpp
Normal file
58
applications/irda/irda-app-file-parser.cpp
Normal file
@@ -0,0 +1,58 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user