This repository has been archived on 2026-06-17. You can view files and clone it, but cannot push or open issues or pull requests.
FireWatchTower_2axis/host/Parser.h

102 lines
2.5 KiB
C++
Executable File

#pragma once
#include <mutex>
#include <string>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace qi = boost::spirit::qi;
enum InputCommands
{
no_cmd,
startcamera,
stopcamera,
setcamera,
setimagerate,
setgimbal,
setmotorcontrol,
setdebug
};
struct parser_data {
std::string command="";
std::string device = "";
std::string option = "";
double command_val=0.0;
};
struct Parser
{
parser_data p_data;
std::mutex mut;
void set_parser_data(parser_data& data) {
std::cout << "parser set data..." << std::endl;
std::lock_guard<std::mutex> lg(mut);
p_data = data;
}
void clear_parser_data() {
//std::cout << "parser clear data..." << std::endl;
std::lock_guard<std::mutex> lg(mut);
p_data.command = "";
}
parser_data get_parser_data() {
//std::cout << "parser get data..." << std::endl;
std::lock_guard<std::mutex> lg(mut);
parser_data temp= p_data;
//clear_parser_data();
return temp;
}
void parse_input(std::string input) {
parser_data temp_data;
qi::parse(
input.begin(), input.end(),
(*qi::char_("a-zA-Z") >> ' ' >> *qi::char_("a-zA-Z") >> ' ' >> *qi::char_("a-zA-Z") >> ' ' >> qi::double_),
temp_data.command, temp_data.device, temp_data.option, temp_data.command_val
);
std::cout << temp_data.command << " ... " << temp_data.device << " ... " << temp_data.option << " ... " << temp_data.command_val << std::endl;
set_parser_data(temp_data);
std::cout << "parser data set" << temp_data.command_val << std::endl;
}
};
struct CMD_eval {
InputCommands eval(Parser& parse) {
if (parse.p_data.command == "start") {
std::cout << "starting Camera" << std::endl;
parse.clear_parser_data();
return startcamera;
}
else if (parse.p_data.command == "stop") {
std::cout << "stopping Camera" << std::endl;
parse.clear_parser_data();
return stopcamera;
}
else if (parse.p_data.command == "debug") {
parse.clear_parser_data();
return setdebug;
}
else if (parse.p_data.command == "set") {
//std::cout << "setting" << std::endl;
if (parse.p_data.device == "camera") {
parse.clear_parser_data();
return setcamera;
}
else if (parse.p_data.device == "fps") {
parse.clear_parser_data();
return setimagerate;
}
else if (parse.p_data.device == "motorctl") {
parse.clear_parser_data();
return setmotorcontrol;
}
}
else {
return no_cmd;
}
}
};