1 //======================================================================
2 //	transmit_camp.cxx
3 //
4 //  Author(s):
5 //	Dave Freese, W1HKJ, Copyright (C) 2010, 2011, 2012, 2013
6 //	Robert Stiles, KK5VD, Copyright (C) 2013
7 //
8 // This file is part of FLAMP.
9 //
10 // This is free software; you can redistribute it and/or modify
11 // it under the terms of the GNU General Public License as published by
12 // the Free Software Foundation; either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // This software is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 // GNU General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
22 //
23 // =====================================================================
24 
25 #ifndef __flamp_transmit_camp__
26 #define __flamp_transmit_camp__
27 
28 #define TX_CONTINIOUS   0x01  //!< @brief No breaks in the transmitted data.
29 #define TX_MODEM_SAME   0x02  //!< @brief Header modem not used.
30 #define TX_MULTI_MODEM  0x04  //!< @brief Create a time table for all modems.
31 #define TX_SEGMENTED    0x08  //!< @brief Interval Timer
32 #define TX_SINGLE_MODEM 0x10  //!< @brief Create a time table for a single modem.
33 
34 #define TX_ALL_BUTTON   1     //!< @brief Flag indicating transmit all queued file.
35 #define TX_BUTTON       2     //!< @brief Flag indicating transmit a single file.
36 
37 #define DATA_MODEM      1     //!< @brief Indicate this data is for data modem.
38 #define HEADER_MODEM    2     //!< @brief Indicate this data is for header modem.
39 
40 #define CALLSIGN_PREAMBLE    0x01
41 #define CALLSIGN_POSTAMBLE   0x02
42 
43 #define BROADCAST_MAX_MODEMS 4  //!< @brief Maximum number of modems (hamcast).
44 
45 #define THREAD_ERR_MSG_SIZE  256
46 
47 //! @struct _tx_fldigi_thread
48 //! Structure information used to transmit cAmp data (threaded) and the creation of a character time table.
49 
50 //! @typedef TX_FLDIGI_THREAD
51 //! @see _tx_fldigi_thread
52 
53 typedef struct _tx_fldigi_thread {
54 	pthread_attr_t  attr;       //!< Flag for indicating thread is to be detached. pthread_execute()
55 	pthread_cond_t  condition;  //!< Condition used to signal exit when process is asleep.
56 	pthread_mutex_t mutex;      //!< Mutex for transit thread.
57 	pthread_t thread;           //!< Thread
58 
59 	bool err_flag;              //!< @brief Indicating an error occured
60 	bool event_driven;          //!< @brief Indicate the tx thread is event_driven
61 
62 	char err_msg[THREAD_ERR_MSG_SIZE]; //!< @brief Error message storage.
63 
64 	int amp_type;               //!< @brief What type of instance in this? RX_AMP or TX_AMP.
65 	int exit_thread;            //!< @brief Setting to true causes thread to exit.
66 	int mode;                   //!< @brief Mode (modem index) used in time table generation
67 	int que;                    //!< @brief Flag to determine if a single file or multiple files to be sent.
68 	int rx_interval_time;       //!< @brief Delay period between transmits
69 	int tx_interval_time;       //!< @brief Transmit period in seconds
70 	int thread_running;         //!< @brief Flag indicating thread is running.
71 
72 	std::string header_modem;   //!< @brief Local storage for current selected header modem
73 	std::string modem;          //!< @brief Local storage for current selected modem
74 
75 	vector<std::string> bc_modems; //!< @brief Local storage for hamcast modems.
76 
77 	void *data;                 //!< For future use
78 
_tx_fldigi_thread_tx_fldigi_thread79 	_tx_fldigi_thread() {       //!< @brief Clear struct _tx_fldigi_thread memory on allocation.
80 		bc_modems.clear();
81 		data = (void *)0;
82 		event_driven = false;
83 		exit_thread    = 0;
84 		header_modem.clear();
85 		memset(&attr,      0, sizeof(attr));
86 		memset(&condition, 0, sizeof(condition));
87 		memset(&err_msg,   0, sizeof(err_msg));
88 		memset(&mutex,     0, sizeof(mutex));
89 		memset(&thread,    0, sizeof(thread));
90 		mode = 0;
91 		modem.clear();
92 		que  = 0;
93 		thread_running = 0;
94 	}
95 
96 } TX_FLDIGI_THREAD;
97 
98 extern std::string g_header_modem;
99 extern std::string g_modem;
100 extern unsigned int modem_rotation_index;
101 extern vector<std::string> bc_modems;
102 
103 extern class cAmpGlobal rx_amp;
104 extern class cAmpGlobal tx_amp;
105 
106 extern bool active_data_io;
107 extern bool event_bail_flag;
108 extern bool transmit_queue;
109 
110 extern int g_event_driven;
111 extern int last_selected_tx_file;
112 extern int tx_thread_running_count;
113 
114 extern bool check_block_tx_time(std::vector<std::string> &header, std::vector<std::string> &data, TX_FLDIGI_THREAD *thread_ptr);
115 extern bool send_vector_to_fldigi(TX_FLDIGI_THREAD *thread, std::string modem, std::string &tail, std::vector<std::string> vector_data, int mode, cAmp *tx);
116 extern TX_FLDIGI_THREAD * run_in_thread(void *(*func)(void *), int mode, bool queued, bool event_driven, RELAY_DATA *relay_data);
117 extern void * run_in_thread_destroy(TX_FLDIGI_THREAD *tx_thread, int level, bool *in_use_flag);
118 extern void * transmit_header_current(void *);
119 extern void * transmit_header(void * ptr);
120 extern void * transmit_interval(void *);
121 extern void * transmit_relay_interval(void *ptr);
122 extern void * transmit_serial_current(void *);
123 extern void * transmit_serial_queued(void *);
124 extern void * transmit_serial_relay(void *ptr);
125 extern void clear_missing(void *ptr);
126 extern void abort_tx_from_main(void *ptr);
127 extern bool wait_for_rx(int max_wait_seconds, float factpr = 1.0);
128 
129 #endif /* defined(__flamp_transmit_camp__) */
130