fwt_software/include/fgc/OperatingMode.h

59 lines
2.4 KiB
C++

#pragma once
// The tower's three modes of operation, and what each one accepts.
//
// auto - sweep the scan grid, a picture at every waypoint (the normal,
// unattended state; the boot service starts here with --start);
// pan - watch one direction: centred on a heading, walk left to right
// across a span, a picture at each position, then back to the left
// edge and again;
// manual - the gimbal does nothing by itself; a person drives it, over the
// MQTT Command topic or at the console.
//
// Modes change only by command (`mode auto|pan|manual`), and the tower reports
// its mode on StatusCode, as the numeric value of Mode.
#include <string>
#include <vector>
namespace fgc {
enum class Mode { Auto = 0, Pan = 1, Manual = 2 }; // values = StatusCode
const char* modeName(Mode m); // "auto" / "pan" / "manual"
// `mode pan <heading> <span> [<pitch>]`, all in degrees. Heading is a true
// bearing; the span is the full width covered, centred on it.
struct PanSpec {
double heading = 0.0;
double span = 0.0;
double pitch = 0.0;
};
// The bearings a pan visits, left to right. A span narrower than one picture
// (`step`, hardware.ini [Hardware] pan_step_deg) is a single heading, the
// centre. Otherwise the span is cut into ceil(span / step) equal intervals and
// both edges are included: 90 +/- 15 at 6 degrees is 75, 81, ..., 105 - six
// pictures, never more than `step` apart. Bearings are wrapped to [0, 360).
std::vector<double> panHeadings(const PanSpec& pan, double step);
// `mode ...` from its whitespace-separated tokens (tokens[0] == "mode").
// `valid` false with `error` set on a bad command; a bare `mode` is valid with
// `query` set - it asks for the mode rather than changing it.
struct ModeRequest {
bool valid = false;
bool query = false;
Mode mode = Mode::Manual;
PanSpec pan;
std::string error;
};
ModeRequest parseModeCommand(const std::vector<std::string>& tokens);
// May this console command line run in `mode`? Manual accepts everything. Auto
// and pan accept only what cannot move the gimbal or change the tower's
// settings: reading its state, the log's verbosity, changing mode, cancelling,
// and exit. The one list, used for every source - MQTT, console, dashboard keys.
bool allowedIn(Mode mode, const std::string& line);
} // namespace fgc