/** @file ModuleEchoLink.h @brief A module that provides EchoLink connection possibility @author Tobias Blomberg / SM0SVX @date 2004-03-07 \verbatim A module (plugin) for the multi purpose tranciever frontend system. Copyright (C) 2004-2014 Tobias Blomberg / SM0SVX This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA \endverbatim */ #ifndef MODULE_ECHOLINK_INCLUDED #define MODULE_ECHOLINK_INCLUDED /**************************************************************************** * * System Includes * ****************************************************************************/ #include #include #include #include /**************************************************************************** * * Project Includes * ****************************************************************************/ #include #include #include /**************************************************************************** * * Local Includes * ****************************************************************************/ #include "version/SVXLINK.h" #include "BrandMeisterBridge.h" /**************************************************************************** * * Forward declarations * ****************************************************************************/ namespace Async { class Timer; class AudioSplitter; class AudioValve; class AudioSelector; }; namespace EchoLink { class Directory; class StationData; class Proxy; }; /**************************************************************************** * * Namespace * ****************************************************************************/ //namespace MyNameSpace //{ /**************************************************************************** * * Forward declarations of classes inside of the declared namespace * ****************************************************************************/ class MsgHandler; class QsoImpl; class LocationInfo; /**************************************************************************** * * Defines & typedefs * ****************************************************************************/ /**************************************************************************** * * Exported Global Variables * ****************************************************************************/ /**************************************************************************** * * Class definitions * ****************************************************************************/ /** @brief A module for providing EchoLink connections @author Tobias Blomberg @date 2004-03-07 */ class ModuleEchoLink : public Module { public: ModuleEchoLink(void *dl_handle, Logic *logic, const std::string& cfg_name); ~ModuleEchoLink(void); bool initialize(void); const char *compiledForVersion(void) const { return SVXLINK_VERSION; } protected: /** * @brief Notify the module that the logic core idle state has changed * @param is_idle Set to \em true if the logic core is idle or else * \em false. * * This function is called by the logic core when the idle state changes. */ virtual void logicIdleStateChanged(bool is_idle); private: BrandMeisterBridge bridge; typedef enum { STATE_NORMAL, STATE_CONNECT_BY_CALL, STATE_DISCONNECT_BY_CALL } State; typedef std::vector StnList; struct NumConStn { unsigned num_con; struct timeval last_con; NumConStn(unsigned num, struct timeval &t) : num_con(num), last_con(t) {} }; typedef std::map NumConMap; static const int DEFAULT_AUTOCON_TIME = 3*60*1000; // Three minutes EchoLink::Directory *dir; Async::Timer *dir_refresh_timer; std::string mycall; std::string location; std::string sysop_name; std::string description; std::string allow_ip; bool remote_activation; int pending_connect_id; std::string last_message; std::vector outgoing_con_pending; std::vector qsos; unsigned max_connections; unsigned max_qsos; QsoImpl *talker; bool squelch_is_open; State state; StnList cbc_stns; Async::Timer *cbc_timer; Async::Timer *dbc_timer; regex_t *drop_incoming_regex; regex_t *reject_incoming_regex; regex_t *accept_incoming_regex; regex_t *reject_outgoing_regex; regex_t *accept_outgoing_regex; EchoLink::StationData last_disc_stn; Async::AudioSplitter *splitter; Async::AudioValve *listen_only_valve; Async::AudioSelector *selector; unsigned num_con_max; time_t num_con_ttl; time_t num_con_block_time; NumConMap num_con_map; Async::Timer *num_con_update_timer; bool reject_conf; int autocon_echolink_id; int autocon_time; Async::Timer *autocon_timer; EchoLink::Proxy *proxy; void moduleCleanup(void); void activateInit(void); void deactivateCleanup(void); //bool dtmfDigitReceived(char digit, int duration); void dtmfCmdReceived(const std::string& cmd); void dtmfCmdReceivedWhenIdle(const std::string &cmd); void squelchOpen(bool is_open); int audioFromRx(float *samples, int count); void allMsgsWritten(void); void onStatusChanged(EchoLink::StationData::Status status); void onStationListUpdated(void); void onError(const std::string& msg); void onIncomingConnection(const Async::IpAddress& ip, const std::string& callsign, const std::string& name, const std::string& priv); void onStateChange(QsoImpl *qso, EchoLink::Qso::State qso_state); void onChatMsgReceived(QsoImpl *qso, const std::string& msg); void onIsReceiving(bool is_receiving, QsoImpl *qso); void destroyQsoObject(QsoImpl *qso); void getDirectoryList(Async::Timer *timer=0); void createOutgoingConnection(const EchoLink::StationData &station); int audioFromRemote(float *samples, int count, QsoImpl *qso); void audioFromRemoteRaw(EchoLink::Qso::RawPacket *packet, QsoImpl *qso); QsoImpl *findFirstTalker(void) const; void broadcastTalkerStatus(void); void updateDescription(void); void updateEventVariables(void); void connectByCallsign(std::string cmd); void handleConnectByCall(const std::string& cmd); void cbcTimeout(Async::Timer *t); void disconnectByCallsign(const std::string &cmd); void handleDisconnectByCall(const std::string& cmd); void dbcTimeout(Async::Timer *t); int numConnectedStations(void); int listQsoCallsigns(std::list& call_list); void handleCommand(const std::string& cmd); void commandFailed(const std::string& cmd); void connectByNodeId(int node_id); void checkIdle(void); void checkAutoCon(Async::Timer *timer=0); bool numConCheck(const std::string &callsign); void numConUpdate(void); void replaceAll(std::string &str, const std::string &from, const std::string &to) const; }; /* class ModuleEchoLink */ //} /* namespace */ #endif /* MODULE_ECHOLINK_INCLUDED */ /* * This file has not been truncated */