+ double val;
+ for (unsigned int i = 0; i < _out_message.size(); i++) {
+
+ switch (_out_message[i].type) {
+ case FG_INT:
+ val = _out_message[i].offset +
+ _out_message[i].prop->getIntValue() * _out_message[i].factor;
+
+ if (binary_byte_order == BYTE_ORDER_MATCHES_NETWORK_ORDER) {
+ *((int32_t*)&buf[length]) = (int32_t)val;
+ } else {
+ *((uint32_t*)&buf[length]) = sg_bswap_32((uint32_t)val);
+ }
+ length += sizeof(int32_t);
+ break;
+
+ case FG_BOOL:
+ *((int8_t*)&buf[length])
+ = _out_message[i].prop->getBoolValue() ? true : false;
+ length += 1;
+ break;
+
+ case FG_FIXED:
+ {
+ val = _out_message[i].offset +
+ _out_message[i].prop->getFloatValue() * _out_message[i].factor;
+
+ int fixed = (int)(val * 65536.0f);
+ if (binary_byte_order == BYTE_ORDER_MATCHES_NETWORK_ORDER) {
+ *((int32_t*)&buf[length]) = (int32_t)fixed;
+ } else {
+ *((uint32_t*)&buf[length]) = sg_bswap_32((uint32_t)fixed);
+ }
+ length += sizeof(int32_t);
+ break;
+ }
+ case FG_FLOAT:
+ val = _out_message[i].offset +
+ _out_message[i].prop->getFloatValue() * _out_message[i].factor;
+
+ if (binary_byte_order == BYTE_ORDER_MATCHES_NETWORK_ORDER) {
+ *((float*)&buf[length]) = val;
+ } else {
+ u32 tmpun32;
+ tmpun32.floatVal = static_cast<float>(val);
+ *((uint32_t*)&buf[length]) = sg_bswap_32(tmpun32.intVal);
+ }
+ length += sizeof(uint32_t);
+ break;
+
+ case FG_DOUBLE:
+ val = _out_message[i].offset +
+ _out_message[i].prop->getFloatValue() * _out_message[i].factor;
+
+ if (binary_byte_order == BYTE_ORDER_MATCHES_NETWORK_ORDER) {
+ *((double*)&buf[length]) = val;
+ } else {
+ u64 tmpun64;
+ tmpun64.doubleVal = val;
+ *((uint64_t*)&buf[length]) = sg_bswap_64(tmpun64.longVal);
+ }
+ length += sizeof(int64_t);
+ break;
+
+ default: // SG_STRING
+ const char *strdata = _out_message[i].prop->getStringValue();
+ int strlength = strlen(strdata);
+
+ if (binary_byte_order == BYTE_ORDER_NEEDS_CONVERSION) {
+ SG_LOG( SG_IO, SG_ALERT, "Generic protocol: "
+ "FG_STRING will be written in host byte order.");
+ }
+ /* Format for strings is
+ * [length as int, 4 bytes][ASCII data, length bytes]
+ */
+ if (binary_byte_order == BYTE_ORDER_MATCHES_NETWORK_ORDER) {
+ *((int32_t*)&buf[length]) = strlength;
+ } else {
+ *((int32_t*)&buf[length]) = sg_bswap_32(strlength);
+ }
+ length += sizeof(int32_t);
+ strncpy(&buf[length], strdata, strlength);
+ length += strlength;
+ /* FIXME padding for alignment? Something like:
+ * length += (strlength % 4 > 0 ? sizeof(int32_t) - strlength % 4 : 0;
+ */
+ }
+ }
+
+ // add the footer to the packet ("line")
+ switch (binary_footer_type) {
+ case FOOTER_LENGTH:
+ binary_footer_value = length;
+ break;
+
+ case FOOTER_MAGIC:
+ case FOOTER_NONE:
+ break;
+ }
+
+ if (binary_footer_type != FOOTER_NONE) {
+ if (binary_byte_order == BYTE_ORDER_MATCHES_NETWORK_ORDER) {
+ *((int32_t*)&buf[length]) = binary_footer_value;
+ } else {
+ *((int32_t*)&buf[length]) = sg_bswap_32(binary_footer_value);
+ }
+ length += sizeof(int32_t);
+ }
+
+ return true;
+}
+
+bool FGGeneric::gen_message_ascii() {