X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNetwork%2Fgeneric.hxx;h=fbc146d5c2adfbec68b1cbb0bce1d6fe544c93ea;hb=b0dcb657e77579ecc79798ff365737095f96f9e2;hp=c5657f764184ca8e717c19b46073605752365c06;hpb=d05121ef4689d2b50b3fe1848cbb0d1f5a1db877;p=flightgear.git diff --git a/src/Network/generic.hxx b/src/Network/generic.hxx index c5657f764..fbc146d5c 100644 --- a/src/Network/generic.hxx +++ b/src/Network/generic.hxx @@ -16,7 +16,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -27,35 +27,39 @@ #include -#include STL_STRING +#include #include "protocol.hxx" -SG_USING_STD(string); - +using std::string; class FGGeneric : public FGProtocol { public: - FGGeneric(string&); + FGGeneric(vector); ~FGGeneric(); bool gen_message(); - bool parse_message(); + bool parse_message_len(int length); // open hailing frequencies bool open(); + void reinit(); + // process work for this port bool process(); // close the channel bool close(); + void setExitOnError(bool val) { exitOnError = val; } + bool getExitOnError() { return exitOnError; } + bool getInitOk(void) { return initOk; } protected: - enum e_type { FG_BOOL=0, FG_INT, FG_DOUBLE, FG_STRING }; + enum e_type { FG_BOOL=0, FG_INT, FG_FLOAT, FG_DOUBLE, FG_STRING, FG_FIXED, FG_BYTE, FG_WORD }; typedef struct { // string name; @@ -63,14 +67,22 @@ protected: e_type type; double offset; double factor; - SGPropertyNode *prop; + double min, max; + bool wrap; + bool rel; + SGPropertyNode_ptr prop; } _serial_prot; private: + string file_name; + string direction; + int length; char buf[ FG_MAX_MSG_SIZE ]; + string preamble; + string postamble; string var_separator; string line_separator; string var_sep_string; @@ -78,8 +90,42 @@ private: vector<_serial_prot> _out_message; vector<_serial_prot> _in_message; - void read_config(SGPropertyNode *root, vector<_serial_prot> &msg); - + bool binary_mode; + enum {FOOTER_NONE, FOOTER_LENGTH, FOOTER_MAGIC} binary_footer_type; + int binary_footer_value; + int binary_record_length; + enum {BYTE_ORDER_NEEDS_CONVERSION, BYTE_ORDER_MATCHES_NETWORK_ORDER} binary_byte_order; + + bool gen_message_ascii(); + bool gen_message_binary(); + bool parse_message_ascii(int length); + bool parse_message_binary(int length); + bool read_config(SGPropertyNode *root, vector<_serial_prot> &msg); + bool exitOnError; + bool initOk; + + class FGProtocolWrapper * wrapper; + + template + static void updateValue(_serial_prot& prot, const T& val) + { + T new_val = (prot.rel ? getValue(prot.prop) : 0) + + prot.offset + + prot.factor * val; + + if( prot.max > prot.min ) + { + if( prot.wrap ) + new_val = SGMisc::normalizePeriodic(prot.min, prot.max, new_val); + else + new_val = SGMisc::clip(new_val, prot.min, prot.max); + } + + setValue(prot.prop, new_val); + } + + // Special handling for bool (relative change = toggle, no min/max, no wrap) + static void updateValue(_serial_prot& prot, bool val); };