| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  | #ifndef NETWORK_MESSAGE_HPP__
 | 
					
						
							|  |  |  | #define NETWORK_MESSAGE_HPP__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * WSJT-X Message Formats | 
					
						
							|  |  |  |  * ====================== | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * All messages are written or  read using the QDataStream derivatives | 
					
						
							| 
									
										
										
										
											2015-04-16 22:17:14 +00:00
										 |  |  |  * defined below, note that we are using the default for floating | 
					
						
							|  |  |  |  * point precision which means all are double precision i.e. 64-bit | 
					
						
							|  |  |  |  * IEEE format. | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  *  Message is big endian format | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *   Header format: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *      32-bit unsigned integer magic number 0xadbccbda | 
					
						
							|  |  |  |  *      32-bit unsigned integer schema number | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *   Payload format: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *      As per  the QDataStream format,  see below for version  used and | 
					
						
							|  |  |  |  *      here: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *        http://doc.qt.io/qt-5/datastreamformat.html
 | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-04-16 22:17:14 +00:00
										 |  |  |  *      for the serialization details for each type, at the time of | 
					
						
							|  |  |  |  *      writing the above document is for Qt_5_0 format which is buggy | 
					
						
							| 
									
										
										
										
											2015-10-21 18:56:29 +00:00
										 |  |  |  *      so we use Qt_5_4 format, differences are: | 
					
						
							| 
									
										
										
										
											2015-04-16 22:17:14 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  *      QDateTime: | 
					
						
							|  |  |  |  *           QDate      qint64    Julian day number | 
					
						
							|  |  |  |  *           QTime      quint32   Milli-seconds since midnight | 
					
						
							|  |  |  |  *           timespec   quint8    0=local, 1=UTC, 2=Offset from UTC | 
					
						
							|  |  |  |  *                                                 (seconds) | 
					
						
							|  |  |  |  *                                3=time zone | 
					
						
							|  |  |  |  *           offset     qint32    only present if timespec=2 | 
					
						
							|  |  |  |  *           timezone   several-fields only present if timespec=3 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *      we will avoid using QDateTime fields with time zones for simplicity. | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Type utf8  is a  utf-8 byte  string formatted  as a  QByteArray for | 
					
						
							|  |  |  |  * serialization purposes  (currently a quint32 size  followed by size | 
					
						
							|  |  |  |  * bytes, no terminator is present or counted). | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-05-06 20:30:29 +00:00
										 |  |  |  * The QDataStream format document linked above is not complete for | 
					
						
							|  |  |  |  * the QByteArray serialization format, it is similar to the QString | 
					
						
							|  |  |  |  * serialization format in that it differentiates between empty | 
					
						
							|  |  |  |  * strings and null strings. Empty strings have a length of zero | 
					
						
							|  |  |  |  * whereas null strings have a length field of 0xffffffff. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-10-21 18:56:29 +00:00
										 |  |  |  * Schema Negotiation | 
					
						
							|  |  |  |  * ------------------ | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The NetworkMessage::Builder  class specifies a schema  number which | 
					
						
							|  |  |  |  * may be  incremented from time to  time. It represents a  version of | 
					
						
							|  |  |  |  * the underlying encoding schemes used to store data items. Since the | 
					
						
							|  |  |  |  * underlying  encoding  is   defined  by  the  Qt   project  in  it's | 
					
						
							|  |  |  |  * QDataStream  stream operators,  it  is essential  that clients  and | 
					
						
							|  |  |  |  * servers  of  this protocol  can  agree  on  a common  scheme.   The | 
					
						
							|  |  |  |  * NetworkMessage  utility classes  below exchange  the schema  number | 
					
						
							|  |  |  |  * actually used.  The handling of  the schema is backwards compatible | 
					
						
							|  |  |  |  * to  an  extent,  so  long   as  clients  and  servers  are  written | 
					
						
							|  |  |  |  * correctly. For  example a server  written to any  particular schema | 
					
						
							|  |  |  |  * version can communicate with a client written to a later schema. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Schema Version 1:- this schema used the QDataStream::Qt_5_0 version | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *  which is broken. | 
					
						
							| 
									
										
										
										
											2015-10-21 18:56:29 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Schema Version 2:- this schema uses the QDataStream::Qt_5_2 version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Schema Version 3:- this schema uses the QDataStream::Qt_5_4 version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Message       Direction Value                  Type | 
					
						
							|  |  |  |  * ------------- --------- ---------------------- ----------- | 
					
						
							| 
									
										
										
										
											2015-10-21 18:56:29 +00:00
										 |  |  |  * Heartbeat     Out/In    0                      quint32 | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  *                         Id (unique key)        utf8 | 
					
						
							| 
									
										
										
										
											2015-10-21 18:56:29 +00:00
										 |  |  |  *                         Maximum schema number  quint32 | 
					
						
							| 
									
										
										
										
											2016-12-04 00:55:15 +00:00
										 |  |  |  *                         version                utf8 | 
					
						
							|  |  |  |  *                         revision               utf8 | 
					
						
							| 
									
										
										
										
											2015-10-21 18:56:29 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *    The heartbeat  message shall be  sent on a periodic  basis every | 
					
						
							|  |  |  |  *    NetworkMessage::pulse   seconds   (see    below),   the   WSJT-X | 
					
						
							|  |  |  |  *    application  does  that  using the  MessageClient  class.   This | 
					
						
							|  |  |  |  *    message is intended to be used by servers to detect the presence | 
					
						
							|  |  |  |  *    of a  client and also  the unexpected disappearance of  a client | 
					
						
							|  |  |  |  *    and  by clients  to learn  the schema  negotiated by  the server | 
					
						
							|  |  |  |  *    after it receives  the initial heartbeat message  from a client. | 
					
						
							|  |  |  |  *    The message_aggregator reference server does just that using the | 
					
						
							|  |  |  |  *    MessageServer class. Upon  initial startup a client  must send a | 
					
						
							|  |  |  |  *    heartbeat message as soon as  is practical, this message is used | 
					
						
							|  |  |  |  *    to negotiate the maximum schema  number common to the client and | 
					
						
							|  |  |  |  *    server. Note  that the  server may  not be  able to  support the | 
					
						
							|  |  |  |  *    client's  requested maximum  schema  number, in  which case  the | 
					
						
							|  |  |  |  *    first  message received  from the  server will  specify a  lower | 
					
						
							|  |  |  |  *    schema number (never a higher one  as that is not allowed). If a | 
					
						
							|  |  |  |  *    server replies  with a lower  schema number then no  higher than | 
					
						
							|  |  |  |  *    that number shall be used for all further outgoing messages from | 
					
						
							|  |  |  |  *    either clients or the server itself. | 
					
						
							| 
									
										
										
										
											2015-05-10 12:02:14 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2016-01-31 00:07:42 +00:00
										 |  |  |  *    Note: the  "Maximum schema number"  field was introduced  at the | 
					
						
							|  |  |  |  *    same time as schema 3, therefore servers and clients must assume | 
					
						
							|  |  |  |  *    schema 2 is the highest schema number supported if the Heartbeat | 
					
						
							|  |  |  |  *    message does not contain the "Maximum schema number" field. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-05-10 12:02:14 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * Status        Out       1                      quint32 | 
					
						
							|  |  |  |  *                         Id (unique key)        utf8 | 
					
						
							|  |  |  |  *                         Dial Frequency (Hz)    quint64 | 
					
						
							|  |  |  |  *                         Mode                   utf8 | 
					
						
							|  |  |  |  *                         DX call                utf8 | 
					
						
							|  |  |  |  *                         Report                 utf8 | 
					
						
							|  |  |  |  *                         Tx Mode                utf8 | 
					
						
							| 
									
										
										
										
											2015-05-06 22:25:56 +00:00
										 |  |  |  *                         Tx Enabled             bool | 
					
						
							| 
									
										
										
										
											2015-05-06 20:30:29 +00:00
										 |  |  |  *                         Transmitting           bool | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *                         Decoding               bool | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  |  *                         Rx DF                  qint32 | 
					
						
							|  |  |  |  *                         Tx DF                  qint32 | 
					
						
							|  |  |  |  *                         DE call                utf8 | 
					
						
							|  |  |  |  *                         DE grid                utf8 | 
					
						
							|  |  |  |  *                         DX grid                utf8 | 
					
						
							| 
									
										
										
										
											2016-07-08 10:59:06 +00:00
										 |  |  |  *                         Tx Watchdog            bool | 
					
						
							| 
									
										
										
										
											2016-12-16 19:36:21 +00:00
										 |  |  |  *                         Sub-mode               utf8 | 
					
						
							|  |  |  |  *                         Fast mode              bool | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *    WSJT-X  sends this  status message  when various  internal state | 
					
						
							|  |  |  |  *    changes to allow the server to  track the relevant state of each | 
					
						
							|  |  |  |  *    client without the need for  polling commands. The current state | 
					
						
							|  |  |  |  *    changes that generate status messages are: | 
					
						
							| 
									
										
										
										
											2015-05-10 12:02:14 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *      Application start up, | 
					
						
							|  |  |  |  *      "Enable Tx" button status changes, | 
					
						
							|  |  |  |  *      Dial frequency changes, | 
					
						
							|  |  |  |  *      Changes to the "DX Call" field, | 
					
						
							| 
									
										
										
										
											2016-12-16 19:36:21 +00:00
										 |  |  |  *      Operating mode, sub-mode or fast mode changes, | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *      Transmit mode changed (in dual JT9+JT65 mode), | 
					
						
							|  |  |  |  *      Changes to the "Rpt" spinner, | 
					
						
							|  |  |  |  *      After an old decodes replay sequence (see Replay below), | 
					
						
							|  |  |  |  *      When switching between Tx and Rx mode, | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  |  *      At the start and end of decoding, | 
					
						
							|  |  |  |  *      When the Rx DF changes, | 
					
						
							|  |  |  |  *      When the Tx DF changes, | 
					
						
							|  |  |  |  *      When the DE call or grid changes (currently when settings are exited), | 
					
						
							| 
									
										
										
										
											2016-07-08 10:59:06 +00:00
										 |  |  |  *      When the DX call or grid changes, | 
					
						
							| 
									
										
										
										
											2016-07-09 02:27:57 +00:00
										 |  |  |  *      When the Tx watchdog is set or reset. | 
					
						
							| 
									
										
										
										
											2015-05-10 12:02:14 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * Decode        Out       2                      quint32 | 
					
						
							|  |  |  |  *                         Id (unique key)        utf8 | 
					
						
							|  |  |  |  *                         New                    bool | 
					
						
							|  |  |  |  *                         Time                   QTime | 
					
						
							|  |  |  |  *                         snr                    qint32 | 
					
						
							| 
									
										
										
										
											2015-04-16 22:17:14 +00:00
										 |  |  |  *                         Delta time (S)         float (serialized as double) | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  *                         Delta frequency (Hz)   quint32 | 
					
						
							|  |  |  |  *                         Mode                   utf8 | 
					
						
							|  |  |  |  *                         Message                utf8 | 
					
						
							| 
									
										
										
										
											2017-07-26 21:18:59 +00:00
										 |  |  |  *                         Low confidence         bool | 
					
						
							| 
									
										
										
										
											2017-09-22 15:36:24 +00:00
										 |  |  |  *                         Off air                bool | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-11-15 23:03:11 +00:00
										 |  |  |  *      The decode message is sent when  a new decode is completed, in | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *      this case the 'New' field is true. It is also used in response | 
					
						
							|  |  |  |  *      to  a "Replay"  message where  each  old decode  in the  "Band | 
					
						
							|  |  |  |  *      activity" window, that  has not been erased, is  sent in order | 
					
						
							| 
									
										
										
										
											2017-07-26 21:18:59 +00:00
										 |  |  |  *      as a one of these messages  with the 'New' field set to false. | 
					
						
							|  |  |  |  *      See  the "Replay"  message below  for details  of usage.   Low | 
					
						
							|  |  |  |  *      confidence decodes are flagged  in protocols where the decoder | 
					
						
							|  |  |  |  *      has knows that  a decode has a higher  than normal probability | 
					
						
							|  |  |  |  *      of  being  false, they  should  not  be reported  on  publicly | 
					
						
							|  |  |  |  *      accessible services  without some attached warning  or further | 
					
						
							| 
									
										
										
										
											2017-09-16 22:20:59 +00:00
										 |  |  |  *      validation. Off air decodes are those that result from playing | 
					
						
							|  |  |  |  *      back a .WAV file. | 
					
						
							| 
									
										
										
										
											2015-05-10 12:02:14 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * Clear         Out       3                      quint32 | 
					
						
							|  |  |  |  *                         Id (unique key)        utf8 | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *      This message is  send when all prior "Decode"  messages in the | 
					
						
							|  |  |  |  *      "Band activity"  window have been discarded  and therefore are | 
					
						
							|  |  |  |  *      no long available for actioning  with a "Reply" message. It is | 
					
						
							|  |  |  |  *      sent when the user erases  the "Band activity" window and when | 
					
						
							|  |  |  |  *      WSJT-X  closes down  normally. The  server should  discard all | 
					
						
							|  |  |  |  *      decode messages upon receipt of this message. | 
					
						
							| 
									
										
										
										
											2015-05-10 12:02:14 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * Reply         In        4                      quint32 | 
					
						
							|  |  |  |  *                         Id (target unique key) utf8 | 
					
						
							|  |  |  |  *                         Time                   QTime | 
					
						
							|  |  |  |  *                         snr                    qint32 | 
					
						
							| 
									
										
										
										
											2015-05-06 22:25:56 +00:00
										 |  |  |  *                         Delta time (S)         float (serialized as double) | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  *                         Delta frequency (Hz)   quint32 | 
					
						
							|  |  |  |  *                         Mode                   utf8 | 
					
						
							|  |  |  |  *                         Message                utf8 | 
					
						
							| 
									
										
										
										
											2017-07-26 21:18:59 +00:00
										 |  |  |  *                         Low confidence         bool | 
					
						
							| 
									
										
										
										
											2017-09-22 15:36:24 +00:00
										 |  |  |  *                         Modifiers              quint8 | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *      In order for a server  to provide a useful cooperative service | 
					
						
							|  |  |  |  *      to WSJT-X it  is possible for it to initiate  a QSO by sending | 
					
						
							|  |  |  |  *      this message to a client. WSJT-X filters this message and only | 
					
						
							|  |  |  |  *      acts upon it  if the message exactly describes  a prior decode | 
					
						
							|  |  |  |  *      and that decode  is a CQ or QRZ message.   The action taken is | 
					
						
							|  |  |  |  *      exactly equivalent to the user  double clicking the message in | 
					
						
							|  |  |  |  *      the "Band activity" window. The  intent of this message is for | 
					
						
							|  |  |  |  *      servers to be able to provide an advanced look up of potential | 
					
						
							|  |  |  |  *      QSO partners, for example determining if they have been worked | 
					
						
							|  |  |  |  *      before  or if  working them  may advance  some objective  like | 
					
						
							|  |  |  |  *      award progress.  The  intention is not to  provide a secondary | 
					
						
							|  |  |  |  *      user  interface for  WSJT-X,  it is  expected  that after  QSO | 
					
						
							|  |  |  |  *      initiation the rest  of the QSO is carried  out manually using | 
					
						
							|  |  |  |  *      the normal WSJT-X user interface. | 
					
						
							| 
									
										
										
										
											2015-05-10 12:02:14 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2017-09-22 15:36:24 +00:00
										 |  |  |  *      The  Modifiers   field  allows  the  equivalent   of  keyboard | 
					
						
							|  |  |  |  *      modifiers to be sent "as if" those modifier keys where pressed | 
					
						
							|  |  |  |  *      while  double-clicking  the  specified  decoded  message.  The | 
					
						
							|  |  |  |  *      modifier values (hexadecimal) are as follows: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *          no modifier     0x00 | 
					
						
							|  |  |  |  *          SHIFT           0x02 | 
					
						
							|  |  |  |  *          CTRL            0x04  CMD on Mac | 
					
						
							|  |  |  |  *          ALT             0x08 | 
					
						
							|  |  |  |  *          META            0x10  Windows key on MS Windows | 
					
						
							|  |  |  |  *          KEYPAD          0x20  Keypad or arrows | 
					
						
							|  |  |  |  *          Group switch    0x40  X11 only | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-05-10 12:02:14 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * QSO Logged    Out       5                      quint32 | 
					
						
							|  |  |  |  *                         Id (unique key)        utf8 | 
					
						
							| 
									
										
										
										
											2016-12-30 15:45:31 +00:00
										 |  |  |  *                         Date & Time Off        QDateTime | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  *                         DX call                utf8 | 
					
						
							|  |  |  |  *                         DX grid                utf8 | 
					
						
							|  |  |  |  *                         Dial frequency (Hz)    quint64 | 
					
						
							|  |  |  |  *                         Mode                   utf8 | 
					
						
							|  |  |  |  *                         Report send            utf8 | 
					
						
							|  |  |  |  *                         Report received        utf8 | 
					
						
							|  |  |  |  *                         Tx power               utf8 | 
					
						
							|  |  |  |  *                         Comments               utf8 | 
					
						
							|  |  |  |  *                         Name                   utf8 | 
					
						
							| 
									
										
										
										
											2016-12-30 15:45:31 +00:00
										 |  |  |  *                         Date & Time On         QDateTime | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *      The  QSO logged  message is  sent  to the  server(s) when  the | 
					
						
							|  |  |  |  *      WSJT-X user accepts the "Log  QSO" dialog by clicking the "OK" | 
					
						
							|  |  |  |  *      button. | 
					
						
							| 
									
										
										
										
											2015-05-10 12:02:14 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * Close         Out       6                      quint32 | 
					
						
							|  |  |  |  *                         Id (unique key)        utf8 | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *      Close is sent by a client immediately prior to it shutting | 
					
						
							|  |  |  |  *      down gracefully. | 
					
						
							| 
									
										
										
										
											2015-05-10 12:02:14 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  * Replay        In        7                      quint32 | 
					
						
							|  |  |  |  *                         Id (unique key)        utf8 | 
					
						
							| 
									
										
										
										
											2015-05-06 20:30:29 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *      When a server starts it may  be useful for it to determine the | 
					
						
							|  |  |  |  *      state  of preexisting  clients. Sending  this message  to each | 
					
						
							|  |  |  |  *      client as it is discovered  will cause that client (WSJT-X) to | 
					
						
							|  |  |  |  *      send a "Decode" message for each decode currently in its "Band | 
					
						
							|  |  |  |  *      activity"  window. Each  "Decode" message  sent will  have the | 
					
						
							|  |  |  |  *      "New" flag set to false so that they can be distinguished from | 
					
						
							|  |  |  |  *      new decodes. After  all the old decodes have  been broadcast a | 
					
						
							|  |  |  |  *      "Status" message  is also broadcast.  If the server  wishes to | 
					
						
							|  |  |  |  *      determine  the  status  of  a newly  discovered  client;  this | 
					
						
							|  |  |  |  *      message should be used. | 
					
						
							| 
									
										
										
										
											2015-05-10 12:02:14 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-05-06 20:30:29 +00:00
										 |  |  |  * Halt Tx       In        8 | 
					
						
							|  |  |  |  *                         Id (unique key)        utf8 | 
					
						
							| 
									
										
										
										
											2015-05-06 22:25:56 +00:00
										 |  |  |  *                         Auto Tx Only           bool | 
					
						
							| 
									
										
										
										
											2015-05-06 20:30:29 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *      The server may stop a client from transmitting messages either | 
					
						
							|  |  |  |  *      immediately or at  the end of the  current transmission period | 
					
						
							|  |  |  |  *      using this message. | 
					
						
							| 
									
										
										
										
											2015-05-10 12:02:14 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-05-06 20:30:29 +00:00
										 |  |  |  * Free Text     In        9 | 
					
						
							|  |  |  |  *                         Id (unique key)        utf8 | 
					
						
							|  |  |  |  *                         Text                   utf8 | 
					
						
							| 
									
										
										
										
											2015-05-28 17:33:39 +00:00
										 |  |  |  *                         Send                   bool | 
					
						
							| 
									
										
										
										
											2015-05-10 12:02:14 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-11-13 15:44:11 +00:00
										 |  |  |  *      This message  allows the server  to set the current  free text | 
					
						
							|  |  |  |  *      message content. Sending this  message with a non-empty "Text" | 
					
						
							|  |  |  |  *      field is equivalent to typing  a new message (old contents are | 
					
						
							|  |  |  |  *      discarded) in to  the WSJT-X free text message  field or "Tx5" | 
					
						
							|  |  |  |  *      field (both  are updated) and if  the "Send" flag is  set then | 
					
						
							|  |  |  |  *      clicking the "Now" radio button for the "Tx5" field if tab one | 
					
						
							|  |  |  |  *      is current or clicking the "Free  msg" radio button if tab two | 
					
						
							|  |  |  |  *      is current. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *      It is the responsibility of the  sender to limit the length of | 
					
						
							|  |  |  |  *      the  message   text  and   to  limit   it  to   legal  message | 
					
						
							|  |  |  |  *      characters. Despite this,  it may be difficult  for the sender | 
					
						
							|  |  |  |  *      to determine the maximum message length without reimplementing | 
					
						
							|  |  |  |  *      the complete message encoding protocol. Because of this is may | 
					
						
							|  |  |  |  *      be better  to allow any  reasonable message length and  to let | 
					
						
							|  |  |  |  *      the WSJT-X application encode and possibly truncate the actual | 
					
						
							|  |  |  |  *      on-air message. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *      If the  message text is  empty the  meaning of the  message is | 
					
						
							|  |  |  |  *      refined  to send  the  current free  text  unchanged when  the | 
					
						
							|  |  |  |  *      "Send" flag is set or to  clear the current free text when the | 
					
						
							|  |  |  |  *      "Send" flag is  unset.  Note that this API does  not include a | 
					
						
							|  |  |  |  *      command to  determine the  contents of  the current  free text | 
					
						
							|  |  |  |  *      message. | 
					
						
							| 
									
										
										
										
											2015-10-21 18:56:29 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-11-15 23:03:11 +00:00
										 |  |  |  * WSPRDecode    Out       10                     quint32 | 
					
						
							|  |  |  |  *                         Id (unique key)        utf8 | 
					
						
							|  |  |  |  *                         New                    bool | 
					
						
							|  |  |  |  *                         Time                   QTime | 
					
						
							|  |  |  |  *                         snr                    qint32 | 
					
						
							|  |  |  |  *                         Delta time (S)         float (serialized as double) | 
					
						
							|  |  |  |  *                         Frequency (Hz)         quint64 | 
					
						
							|  |  |  |  *                         Drift (Hz)             qint32 | 
					
						
							|  |  |  |  *                         Callsign               utf8 | 
					
						
							|  |  |  |  *                         Grid                   utf8 | 
					
						
							|  |  |  |  *                         Power (dBm)            qint32 | 
					
						
							| 
									
										
										
										
											2017-09-16 22:20:59 +00:00
										 |  |  |  *                         Off air                bool | 
					
						
							| 
									
										
										
										
											2015-11-15 23:03:11 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  *      The decode message is sent when  a new decode is completed, in | 
					
						
							|  |  |  |  *      this case the 'New' field is true. It is also used in response | 
					
						
							|  |  |  |  *      to  a "Replay"  message where  each  old decode  in the  "Band | 
					
						
							|  |  |  |  *      activity" window, that  has not been erased, is  sent in order | 
					
						
							|  |  |  |  *      as  a one  of  these  messages with  the  'New'  field set  to | 
					
						
							| 
									
										
										
										
											2017-09-16 22:20:59 +00:00
										 |  |  |  *      false.  See   the  "Replay"  message  below   for  details  of | 
					
						
							|  |  |  |  *      usage. The off air field indicates that the decode was decoded | 
					
						
							|  |  |  |  *      from a played back recording. | 
					
						
							| 
									
										
										
										
											2015-11-15 23:03:11 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QDataStream>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "pimpl_h.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class QIODevice; | 
					
						
							|  |  |  | class QByteArray; | 
					
						
							|  |  |  | class QString; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace NetworkMessage | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   // NEVER DELETE MESSAGE TYPES
 | 
					
						
							|  |  |  |   enum Type | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       Heartbeat, | 
					
						
							|  |  |  |       Status, | 
					
						
							|  |  |  |       Decode, | 
					
						
							|  |  |  |       Clear, | 
					
						
							|  |  |  |       Reply, | 
					
						
							|  |  |  |       QSOLogged, | 
					
						
							|  |  |  |       Close, | 
					
						
							|  |  |  |       Replay, | 
					
						
							| 
									
										
										
										
											2015-05-06 20:30:29 +00:00
										 |  |  |       HaltTx, | 
					
						
							|  |  |  |       FreeText, | 
					
						
							| 
									
										
										
										
											2015-11-15 23:03:11 +00:00
										 |  |  |       WSPRDecode, | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |       maximum_message_type_     // ONLY add new message types
 | 
					
						
							|  |  |  |                                 // immediately before here
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   quint32 constexpr pulse {15}; // seconds
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //
 | 
					
						
							| 
									
										
										
										
											2015-10-21 18:56:29 +00:00
										 |  |  |   // NetworkMessage::Builder - build a message containing serialized Qt types
 | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |   //
 | 
					
						
							|  |  |  |   class Builder | 
					
						
							|  |  |  |     : public QDataStream | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |   public: | 
					
						
							|  |  |  |     static quint32 constexpr magic {0xadbccbda}; // never change this
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // increment this if a newer Qt schema is required and add decode
 | 
					
						
							| 
									
										
										
										
											2015-10-21 18:56:29 +00:00
										 |  |  |     // logic to the Builder and Reader class implementations
 | 
					
						
							|  |  |  | #if QT_VERSION >= 0x050400
 | 
					
						
							|  |  |  |     static quint32 constexpr schema_number {3}; | 
					
						
							|  |  |  | #elif QT_VERSION >= 0x050200
 | 
					
						
							| 
									
										
										
										
											2015-04-16 22:17:14 +00:00
										 |  |  |     static quint32 constexpr schema_number {2}; | 
					
						
							| 
									
										
										
										
											2015-10-21 18:56:29 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  |     // Schema 1 (Qt_5_0) is broken
 | 
					
						
							|  |  |  | #error "Qt version 5.2 or greater required"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-21 18:56:29 +00:00
										 |  |  |     explicit Builder (QIODevice *, Type, QString const& id, quint32 schema); | 
					
						
							|  |  |  |     explicit Builder (QByteArray *, Type, QString const& id, quint32 schema); | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |     Builder (Builder const&) = delete; | 
					
						
							|  |  |  |     Builder& operator = (Builder const&) = delete; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private: | 
					
						
							| 
									
										
										
										
											2015-10-21 18:56:29 +00:00
										 |  |  |     void common_initialization (Type type, QString const& id, quint32 schema); | 
					
						
							| 
									
										
										
										
											2015-04-15 16:40:49 +00:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // NetworkMessage::Reader - read a message containing serialized Qt types
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // Message  is as  per NetworkMessage::Builder  above, the  schema()
 | 
					
						
							|  |  |  |   // member  may be  used  to  determine the  schema  of the  original
 | 
					
						
							|  |  |  |   // message.
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   class Reader | 
					
						
							|  |  |  |     : public QDataStream | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |   public: | 
					
						
							|  |  |  |     explicit Reader (QIODevice *); | 
					
						
							|  |  |  |     explicit Reader (QByteArray const&); | 
					
						
							|  |  |  |     Reader (Reader const&) = delete; | 
					
						
							|  |  |  |     Reader& operator = (Reader const&) = delete; | 
					
						
							|  |  |  |     ~Reader (); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     quint32 schema () const; | 
					
						
							|  |  |  |     Type type () const; | 
					
						
							|  |  |  |     QString id () const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private: | 
					
						
							|  |  |  |     class impl; | 
					
						
							|  |  |  |     pimpl<impl> m_; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |