bool CDStarRepeaterD::createThread() { CDStarRepeaterConfig config(m_confDir, CONFIG_FILE_NAME, m_name); wxString callsign, gateway; DSTAR_MODE mode; ACK_TYPE ack; bool restriction, rpt1Validation, dtmfBlanking, errorReply; config.getCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation, dtmfBlanking, errorReply); wxString modemType; config.getModem(modemType); // DVAP can only do simplex, force the mode accordingly if (modemType.IsSameAs(wxT("DVAP"))) { if (mode == MODE_DUPLEX) { wxLogInfo(wxT("DVAP: changing mode from DUPLEX to SIMPLEX")); mode = MODE_SIMPLEX; } else if (mode == MODE_TXANDRX) { wxLogInfo(wxT("DVAP: changing mode from TX_AND_RX to RX_ONLY")); mode = MODE_RXONLY; } } switch (mode) { case MODE_RXONLY: m_thread = new CDStarRepeaterRXThread(modemType); break; case MODE_TXONLY: m_thread = new CDStarRepeaterTXThread(modemType); break; case MODE_TXANDRX: m_thread = new CDStarRepeaterTXRXThread(modemType); break; default: m_thread = new CDStarRepeaterTRXThread(modemType); break; } m_thread->setCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation, dtmfBlanking, errorReply); wxLogInfo(wxT("Callsign set to \"%s\", gateway set to \"%s\", mode: %d, ack: %d, restriction: %d, RPT1 validation: %d, DTMF blanking: %d, Error reply: %d"), callsign.c_str(), gateway.c_str(), int(mode), int(ack), int(restriction), int(rpt1Validation), int(dtmfBlanking), int(errorReply)); wxString gatewayAddress, localAddress, name; unsigned int gatewayPort, localPort; config.getNetwork(gatewayAddress, gatewayPort, localAddress, localPort, name); wxLogInfo(wxT("Gateway set to %s:%u, local set to %s:%u, name set to \"%s\""), gatewayAddress.c_str(), gatewayPort, localAddress.c_str(), localPort, name.c_str()); if (!gatewayAddress.IsEmpty()) { bool local = gatewayAddress.IsSameAs(wxT("127.0.0.1")); CRepeaterProtocolHandler* handler = new CRepeaterProtocolHandler(gatewayAddress, gatewayPort, localAddress, localPort, name); bool res = handler->open(); if (!res) { wxLogError(wxT("Cannot open the protocol handler")); return false; } m_thread->setProtocolHandler(handler, local); } unsigned int timeout, ackTime; config.getTimes(timeout, ackTime); m_thread->setTimes(timeout, ackTime); wxLogInfo(wxT("Timeout set to %u secs, ack time set to %u ms"), timeout, ackTime); unsigned int beaconTime; wxString beaconText; bool beaconVoice; TEXT_LANG language; config.getBeacon(beaconTime, beaconText, beaconVoice, language); if (mode == MODE_GATEWAY) beaconTime = 0U; m_thread->setBeacon(beaconTime, beaconText, beaconVoice, language); wxLogInfo(wxT("Beacon set to %u mins, text set to \"%s\", voice set to %d, language set to %d"), beaconTime / 60U, beaconText.c_str(), int(beaconVoice), int(language)); bool announcementEnabled; unsigned int announcementTime; wxString announcementRecordRPT1, announcementRecordRPT2; wxString announcementDeleteRPT1, announcementDeleteRPT2; config.getAnnouncement(announcementEnabled, announcementTime, announcementRecordRPT1, announcementRecordRPT2, announcementDeleteRPT1, announcementDeleteRPT2); if (mode == MODE_GATEWAY) announcementEnabled = false; m_thread->setAnnouncement(announcementEnabled, announcementTime, announcementRecordRPT1, announcementRecordRPT2, announcementDeleteRPT1, announcementDeleteRPT2); wxLogInfo(wxT("Announcement enabled: %d, time: %u mins, record RPT1: \"%s\", record RPT2: \"%s\", delete RPT1: \"%s\", delete RPT2: \"%s\""), int(announcementEnabled), announcementTime / 60U, announcementRecordRPT1.c_str(), announcementRecordRPT2.c_str(), announcementDeleteRPT1.c_str(), announcementDeleteRPT2.c_str()); wxLogInfo(wxT("Modem type set to \"%s\""), modemType.c_str()); CModem* modem = NULL; if (modemType.IsSameAs(wxT("DVAP"))) { wxString port; unsigned int frequency; int power, squelch; config.getDVAP(port, frequency, power, squelch); wxLogInfo(wxT("DVAP: port: %s, frequency: %u Hz, power: %d dBm, squelch: %d dBm"), port.c_str(), frequency, power, squelch); modem = new CDVAPController(port, frequency, power, squelch); } else if (modemType.IsSameAs(wxT("DV-RPTR V1"))) { wxString port; bool rxInvert, txInvert, channel; unsigned int modLevel, txDelay; config.getDVRPTR1(port, rxInvert, txInvert, channel, modLevel, txDelay); wxLogInfo(wxT("DV-RPTR V1, port: %s, RX invert: %d, TX invert: %d, channel: %s, mod level: %u%%, TX delay: %u ms"), port.c_str(), int(rxInvert), int(txInvert), channel ? wxT("B") : wxT("A"), modLevel, txDelay); modem = new CDVRPTRV1Controller(port, wxEmptyString, rxInvert, txInvert, channel, modLevel, txDelay); } else if (modemType.IsSameAs(wxT("DV-RPTR V2"))) { CONNECTION_TYPE connType; wxString usbPort, address; bool txInvert; unsigned int port, modLevel, txDelay; config.getDVRPTR2(connType, usbPort, address, port, txInvert, modLevel, txDelay); wxLogInfo(wxT("DV-RPTR V2, type: %d, address: %s:%u, TX invert: %d, mod level: %u%%, TX delay: %u ms"), int(connType), address.c_str(), port, int(txInvert), modLevel, txDelay); switch (connType) { case CT_USB: modem = new CDVRPTRV2Controller(usbPort, wxEmptyString, txInvert, modLevel, mode == MODE_DUPLEX || mode == MODE_TXANDRX, callsign, txDelay); break; case CT_NETWORK: modem = new CDVRPTRV2Controller(address, port, txInvert, modLevel, mode == MODE_DUPLEX || mode == MODE_TXANDRX, callsign, txDelay); break; } } else if (modemType.IsSameAs(wxT("DV-RPTR V3"))) { CONNECTION_TYPE connType; wxString usbPort, address; bool txInvert; unsigned int port, modLevel, txDelay; config.getDVRPTR3(connType, usbPort, address, port, txInvert, modLevel, txDelay); wxLogInfo(wxT("DV-RPTR V3, type: %d, address: %s:%u, TX invert: %d, mod level: %u%%, TX delay: %u ms"), int(connType), address.c_str(), port, int(txInvert), modLevel, txDelay); switch (connType) { case CT_USB: modem = new CDVRPTRV3Controller(usbPort, wxEmptyString, txInvert, modLevel, mode == MODE_DUPLEX || mode == MODE_TXANDRX, callsign, txDelay); break; case CT_NETWORK: modem = new CDVRPTRV3Controller(address, port, txInvert, modLevel, mode == MODE_DUPLEX || mode == MODE_TXANDRX, callsign, txDelay); break; } } else if (modemType.IsSameAs(wxT("DVMEGA"))) { wxString port; DVMEGA_VARIANT variant; bool rxInvert, txInvert; unsigned int txDelay, rxFrequency, txFrequency, power; config.getDVMEGA(port, variant, rxInvert, txInvert, txDelay, rxFrequency, txFrequency, power); wxLogInfo(wxT("DVMEGA, port: %s, variant: %d, RX invert: %d, TX invert: %d, TX delay: %u ms, rx frequency: %u Hz, tx frequency: %u Hz, power: %u %%"), port.c_str(), int(variant), int(rxInvert), int(txInvert), txDelay, rxFrequency, txFrequency, power); switch (variant) { case DVMV_MODEM: modem = new CDVMegaController(port, wxEmptyString, rxInvert, txInvert, txDelay); break; case DVMV_RADIO_2M: case DVMV_RADIO_70CM: case DVMV_RADIO_2M_70CM: modem = new CDVMegaController(port, wxEmptyString, txDelay, rxFrequency, txFrequency, power); break; default: wxLogError(wxT("Unknown DVMEGA variant - %d"), int(variant)); break; } } else if (modemType.IsSameAs(wxT("GMSK Modem"))) { USB_INTERFACE iface; unsigned int address; config.getGMSK(iface, address); wxLogInfo(wxT("GMSK, interface: %d, address: %04X"), int(iface), address); modem = new CGMSKController(iface, address, mode == MODE_DUPLEX || mode == MODE_TXANDRX); } else if (modemType.IsSameAs(wxT("Sound Card"))) { wxString rxDevice, txDevice; bool rxInvert, txInvert; wxFloat32 rxLevel, txLevel; unsigned int txDelay, txTail; config.getSoundCard(rxDevice, txDevice, rxInvert, txInvert, rxLevel, txLevel, txDelay, txTail); wxLogInfo(wxT("Sound Card, devices: %s:%s, invert: %d:%d, levels: %.2f:%.2f, tx delay: %u ms, tx tail: %u ms"), rxDevice.c_str(), txDevice.c_str(), int(rxInvert), int(txInvert), rxLevel, txLevel, txDelay, txTail); modem = new CSoundCardController(rxDevice, txDevice, rxInvert, txInvert, rxLevel, txLevel, txDelay, txTail); } else if (modemType.IsSameAs(wxT("MMDVM"))) { wxString port; bool rxInvert, txInvert, pttInvert; unsigned int txDelay, rxLevel, txLevel; config.getMMDVM(port, rxInvert, txInvert, pttInvert, txDelay, rxLevel, txLevel); wxLogInfo(wxT("MMDVM, port: %s, RX invert: %d, TX invert: %d, PTT invert: %d, TX delay: %u ms, RX level: %u%%, TX level: %u%%"), port.c_str(), int(rxInvert), int(txInvert), int(pttInvert), txDelay, rxLevel, txLevel); modem = new CMMDVMController(port, wxEmptyString, rxInvert, txInvert, pttInvert, txDelay, rxLevel, txLevel); } else if (modemType.IsSameAs(wxT("Split"))) { wxString localAddress; unsigned int localPort; wxArrayString transmitterNames, receiverNames; unsigned int timeout; config.getSplit(localAddress, localPort, transmitterNames, receiverNames, timeout); wxLogInfo(wxT("Split, local: %s:%u, timeout: %u ms"), localAddress.c_str(), localPort, timeout); for (unsigned int i = 0U; i < transmitterNames.GetCount(); i++) { wxString name = transmitterNames.Item(i); if (!name.IsEmpty()) wxLogInfo(wxT("\tTX %u name: %s"), i + 1U, name.c_str()); } for (unsigned int i = 0U; i < receiverNames.GetCount(); i++) { wxString name = receiverNames.Item(i); if (!name.IsEmpty()) wxLogInfo(wxT("\tRX %u name: %s"), i + 1U, name.c_str()); } modem = new CSplitController(localAddress, localPort, transmitterNames, receiverNames, timeout); } else { wxLogError(wxT("Unknown modem type: %s"), modemType.c_str()); } if (modem != NULL) { bool res = modem->start(); if (!res) wxLogError(wxT("Cannot open the D-Star modem")); else m_thread->setModem(modem); } wxString controllerType; unsigned int portConfig, activeHangTime; bool pttInvert; config.getController(controllerType, portConfig, pttInvert, activeHangTime); wxLogInfo(wxT("Controller set to %s, config: %u, PTT invert: %d, active hang time: %u ms"), controllerType.c_str(), portConfig, int(pttInvert), activeHangTime); CExternalController* controller = NULL; wxString port; if (controllerType.StartsWith(wxT("Velleman K8055 - "), &port)) { unsigned long num; port.ToULong(&num); controller = new CExternalController(new CK8055Controller(num), pttInvert); } else if (controllerType.StartsWith(wxT("Serial - "), &port)) { controller = new CExternalController(new CSerialLineController(port, portConfig), pttInvert); } else if (controllerType.StartsWith(wxT("Arduino - "), &port)) { controller = new CExternalController(new CArduinoController(port), pttInvert); #if defined(GPIO) } else if (controllerType.IsSameAs(wxT("GPIO"))) { controller = new CExternalController(new CGPIOController(portConfig), pttInvert); #endif } else { controller = new CExternalController(new CDummyController, pttInvert); } bool res = controller->open(); if (!res) wxLogError(wxT("Cannot open the hardware interface - %s"), controllerType.c_str()); else m_thread->setController(controller, activeHangTime); bool out1, out2, out3, out4; config.getOutputs(out1, out2, out3, out4); m_thread->setOutputs(out1, out2, out3, out4); wxLogInfo(wxT("Output 1 = %d, output 2 = %d, output 3 = %d, output 4 = %d"), out1, out2, out3, out4); bool enabled; wxString rpt1Callsign, rpt2Callsign; wxString shutdown, startup; wxString status1, status2, status3, status4, status5; wxString command1, command1Line, command2, command2Line; wxString command3, command3Line, command4, command4Line; wxString command5, command5Line, command6, command6Line; wxString output1, output2, output3, output4; config.getControl(enabled, rpt1Callsign, rpt2Callsign, shutdown, startup, status1, status2, status3, status4, status5, command1, command1Line, command2, command2Line, command3, command3Line, command4, command4Line, command5, command5Line, command6, command6Line, output1, output2, output3, output4); m_thread->setControl(enabled, rpt1Callsign, rpt2Callsign, shutdown, startup, status1, status2, status3, status4, status5, command1, command1Line, command2, command2Line, command3, command3Line, command4, command4Line, command5, command5Line, command6, command6Line, output1, output2, output3, output4); wxLogInfo(wxT("Control: enabled: %d, RPT1: %s, RPT2: %s, shutdown: %s, startup: %s, status1: %s, status2: %s, status3: %s, status4: %s, status5: %s, command1: %s = %s, command2: %s = %s, command3: %s = %s, command4: %s = %s, command5: %s = %s, command6: %s = %s, output1: %s, output2: %s, output3: %s, output4: %s"), enabled, rpt1Callsign.c_str(), rpt2Callsign.c_str(), shutdown.c_str(), startup.c_str(), status1.c_str(), status2.c_str(), status3.c_str(), status4.c_str(), status5.c_str(), command1.c_str(), command1Line.c_str(), command2.c_str(), command2Line.c_str(), command3.c_str(), command3Line.c_str(), command4.c_str(), command4Line.c_str(), command5.c_str(), command5Line.c_str(), command6.c_str(), command6Line.c_str(), output1.c_str(), output2.c_str(), output3.c_str(), output4.c_str()); bool logging; config.getLogging(logging); m_thread->setLogging(logging, m_audioDir); wxLogInfo(wxT("Frame logging set to %d, in %s"), int(logging), m_audioDir.c_str()); wxFileName wlFilename(wxFileName::GetHomeDir(), WHITELIST_FILE_NAME); bool exists = wlFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(wlFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open white list file - %s"), wlFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the white list"), list->getCount()); m_thread->setWhiteList(list); } } wxFileName blFilename(wxFileName::GetHomeDir(), BLACKLIST_FILE_NAME); exists = blFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(blFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open black list file - %s"), blFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the black list"), list->getCount()); m_thread->setBlackList(list); } } wxFileName glFilename(wxFileName::GetHomeDir(), GREYLIST_FILE_NAME); exists = glFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(glFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open grey list file - %s"), glFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the grey list"), list->getCount()); m_thread->setGreyList(list); } } return true; }
void CGMSKRepeaterApp::createThread() { wxString callsign, gateway; DSTAR_MODE mode; ACK_TYPE ack; bool restriction, rpt1Validation; getCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation); IGMSKRepeaterThread* thread = NULL; switch (mode) { case MODE_RXONLY: thread = new CGMSKRepeaterRXThread; break; case MODE_TXONLY: thread = new CGMSKRepeaterTXThread; break; case MODE_TXANDRX: thread = new CGMSKRepeaterTXRXThread; break; default: thread = new CGMSKRepeaterTRXThread; break; } thread->setCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation); wxLogInfo(wxT("Callsign set to \"%s\", gateway set to \"%s\", mode: %d, ack: %d, restriction: %d, RPT1 validation: %d"), callsign.c_str(), gateway.c_str(), int(mode), int(ack), restriction, rpt1Validation); wxString gatewayAddress, localAddress; unsigned int gatewayPort, localPort; getNetwork(gatewayAddress, gatewayPort, localAddress, localPort); wxLogInfo(wxT("Gateway set to %s:%u, local set to %s:%u"), gatewayAddress.c_str(), gatewayPort, localAddress.c_str(), localPort); if (!gatewayAddress.IsEmpty()) { CRepeaterProtocolHandler* handler = new CRepeaterProtocolHandler(gatewayAddress, gatewayPort, localAddress, localPort); bool res = handler->open(); if (!res) wxLogError(wxT("Cannot open the protocol handler")); else thread->setProtocolHandler(handler); } unsigned int timeout, ackTime; getTimes(timeout, ackTime); thread->setTimes(timeout, ackTime); wxLogInfo(wxT("Timeout set to %u secs, ack time set to %u ms"), timeout, ackTime); unsigned int beaconTime; wxString beaconText; bool beaconVoice; TEXT_LANG language; getBeacon(beaconTime, beaconText, beaconVoice, language); if (mode == MODE_GATEWAY) beaconTime = 0U; thread->setBeacon(beaconTime, beaconText, beaconVoice, language); wxLogInfo(wxT("Beacon set to %u mins, text set to \"%s\", voice set to %d, language set to %d"), beaconTime / 60U, beaconText.c_str(), int(beaconVoice), int(language)); GMSK_MODEM_TYPE modemType; unsigned int modemAddress; getModem(modemType, modemAddress); #if defined(WIN32) IGMSKModem* modem = NULL; switch (modemType) { case GMT_LIBUSB: wxLogInfo(wxT("GMSK modem: type: LibUsb, address: 0x%04X"), modemAddress); modem = new CGMSKModemLibUsb(modemAddress); break; case GMT_WINUSB: wxLogInfo(wxT("GMSK modem: type: WinUSB, address: 0x%04X"), modemAddress); modem = new CGMSKModemWinUSB(modemAddress); break; default: wxLogError(wxT("Unknown GMSK Modem type - %d"), int(modemType)); break; } #else wxLogInfo(wxT("GMSK modem: type: LibUsb, address: 0x%04X"), modemAddress); IGMSKModem* modem = new CGMSKModemLibUsb(modemAddress); #endif if (modem != NULL) { bool res = modem->open(); if (!res) wxLogError(wxT("Cannot open the GMSK modem")); else thread->setModem(modem); } wxString controllerType; unsigned int activeHangTime; getController(controllerType, activeHangTime); wxLogInfo(wxT("Controller set to %s, active hang time: %u ms"), controllerType.c_str(), activeHangTime); CExternalController* controller = NULL; wxString port; if (controllerType.StartsWith(wxT("Velleman K8055 - "), &port)) { unsigned long num; port.ToULong(&num); controller = new CExternalController(new CK8055Controller(num), false, false); } else if (controllerType.IsSameAs(wxT("Raspberry Pi"))) { controller = new CExternalController(new CRaspberryController, false, false); } else { controller = new CExternalController(new CDummyController, false, false); } bool res = controller->open(); if (!res) wxLogError(wxT("Cannot open the hardware interface - %s"), controllerType.c_str()); else thread->setController(controller, activeHangTime); bool out1, out2, out3, out4; getOutputs(out1, out2, out3, out4); thread->setOutputs(out1, out2, out3, out4); m_frame->setOutputs(out1, out2, out3, out4); wxLogInfo(wxT("Output 1 = %d, output 2 = %d, output 3 = %d, output 4 = %d"), out1, out2, out3, out4); bool enabled; wxString rpt1Callsign, rpt2Callsign; wxString shutdown, startup; wxString status1, status2, status3, status4, status5; wxString command1, command1Line, command2, command2Line; wxString command3, command3Line, command4, command4Line; wxString output1, output2, output3, output4; getControl(enabled, rpt1Callsign, rpt2Callsign, shutdown, startup, status1, status2, status3, status4, status5, command1, command1Line, command2, command2Line, command3, command3Line, command4, command4Line, output1, output2, output3, output4); thread->setControl(enabled, rpt1Callsign, rpt2Callsign, shutdown, startup, status1, status2, status3, status4, status5, command1, command1Line, command2, command2Line, command3, command3Line, command4, command4Line, output1, output2, output3, output4); wxLogInfo(wxT("Control: enabled: %d, RPT1: %s, RPT2: %s, shutdown: %s, startup: %s, status1: %s, status2: %s, status3: %s, status4: %s, status5: %s, command1: %s = %s, command2: %s = %s, command3: %s = %s, command4: %s = %s, output1: %s, output2: %s, output3: %s, output4: %s"), enabled, rpt1Callsign.c_str(), rpt2Callsign.c_str(), shutdown.c_str(), startup.c_str(), status1.c_str(), status2.c_str(), status3.c_str(), status4.c_str(), status5.c_str(), command1.c_str(), command1Line.c_str(), command2.c_str(), command2Line.c_str(), command3.c_str(), command3Line.c_str(), command4.c_str(), command4Line.c_str(), output1.c_str(), output2.c_str(), output3.c_str(), output4.c_str()); bool logging; getLogging(logging); thread->setLogging(logging, m_audioDir); m_frame->setLogging(logging); wxLogInfo(wxT("Frame logging set to %d, in %s"), int(logging), m_audioDir.c_str()); wxFileName wlFilename(wxFileName::GetHomeDir(), WHITELIST_FILE_NAME); bool exists = wlFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(wlFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open white list file - %s"), wlFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the white list"), list->getCount()); thread->setWhiteList(list); } } wxFileName blFilename(wxFileName::GetHomeDir(), BLACKLIST_FILE_NAME); exists = blFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(blFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open black list file - %s"), blFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the black list"), list->getCount()); thread->setBlackList(list); } } // Convert the worker class into a thread m_thread = new CGMSKRepeaterThreadHelper(thread); m_thread->start(); }
void CSplitRepeaterApp::createThread() { CSplitRepeaterThread* thread = new CSplitRepeaterThread; wxString callsign, gateway; DSTAR_MODE mode; ACK_TYPE ack; bool restriction, rpt1Validation; getCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation); thread->setCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation); wxLogInfo(wxT("Callsign set to \"%s\", gateway set to \"%s\", mode: %d, ack: %d, restriction: %d, RPT1 validation: %d"), callsign.c_str(), gateway.c_str(), int(mode), int(ack), restriction, rpt1Validation); wxString gatewayAddress, localAddress; unsigned int gatewayPort, localPort; getNetwork(gatewayAddress, gatewayPort, localAddress, localPort); wxLogInfo(wxT("Gateway set to %s:%u, local set to %s:%u"), gatewayAddress.c_str(), gatewayPort, localAddress.c_str(), localPort); if (!gatewayAddress.IsEmpty() && gatewayPort > 0U && localPort > 0U) { CSplitRepeaterProtocolHandler* handler = new CSplitRepeaterProtocolHandler(localAddress, localPort); bool res = handler->open(); if (!res) wxLogError(wxT("Cannot open the protocol handler")); else thread->setProtocolHandler(handler); thread->setGateway(gatewayAddress, gatewayPort); } unsigned int timeout, ackTime; getTimes(timeout, ackTime); thread->setTimes(timeout, ackTime); wxLogInfo(wxT("Timeout set to %u secs, ack time set to %u ms"), timeout, ackTime); unsigned int beaconTime; wxString beaconText; bool beaconVoice; TEXT_LANG language; getBeacon(beaconTime, beaconText, beaconVoice, language); thread->setBeacon(beaconTime, beaconText, beaconVoice, language); wxLogInfo(wxT("Beacon set to %u mins, text set to \"%s\", voice set to %d, language set to %d"), beaconTime / 60U, beaconText.c_str(), int(beaconVoice), int(language)); wxString receiver1Address; unsigned int receiver1Port; getReceiver1(receiver1Address, receiver1Port); if (!receiver1Address.IsEmpty() && receiver1Port > 0U) { wxLogInfo(wxT("Receiver 1 set to %s:%u"), receiver1Address.c_str(), receiver1Port); bool res = thread->setReceiver1(receiver1Address, receiver1Port); if (!res) wxLogError(wxT("The IP address is invalid")); } wxString receiver2Address; unsigned int receiver2Port; getReceiver2(receiver2Address, receiver2Port); if (!receiver2Address.IsEmpty() && receiver2Port > 0U) { wxLogInfo(wxT("Receiver 2 set to %s:%u"), receiver2Address.c_str(), receiver2Port); bool res = thread->setReceiver2(receiver2Address, receiver2Port); if (!res) wxLogError(wxT("The IP address is invalid")); } wxString transmitter1Address; unsigned int transmitter1Port; getTransmitter1(transmitter1Address, transmitter1Port); if (!transmitter1Address.IsEmpty() && transmitter1Port > 0U) { wxLogInfo(wxT("Transmitter 1 set to %s:%u"), transmitter1Address.c_str(), transmitter1Port); bool res = thread->setTransmitter1(transmitter1Address, transmitter1Port); if (!res) wxLogError(wxT("The IP address is invalid")); } wxString transmitter2Address; unsigned int transmitter2Port; getTransmitter2(transmitter2Address, transmitter2Port); if (!transmitter2Address.IsEmpty() && transmitter2Port > 0U) { wxLogInfo(wxT("Transmitter 2 set to %s:%u"), transmitter2Address.c_str(), transmitter2Port); bool res = thread->setTransmitter2(transmitter2Address, transmitter2Port); if (!res) wxLogError(wxT("The IP address is invalid")); } bool enabled; wxString rpt1Callsign, rpt2Callsign; wxString shutdown, startup; wxString status1, status2, status3, status4, status5; wxString command1, command1Line, command2, command2Line; wxString command3, command3Line, command4, command4Line; getControl(enabled, rpt1Callsign, rpt2Callsign, shutdown, startup, status1, status2, status3, status4, status5, command1, command1Line, command2, command2Line, command3, command3Line, command4, command4Line); thread->setControl(enabled, rpt1Callsign, rpt2Callsign, shutdown, startup, status1, status2, status3, status4, status5, command1, command1Line, command2, command2Line, command3, command3Line, command4, command4Line); wxLogInfo(wxT("Control: enabled: %d, RPT1: %s, RPT2: %s, shutdown: %s, startup: %s, status1: %s, status2: %s, status3: %s, status4: %s, status5: %s, command1: %s = %s, command2: %s = %s, command3: %s = %s, command4: %s = %s"), enabled, rpt1Callsign.c_str(), rpt2Callsign.c_str(), shutdown.c_str(), startup.c_str(), status1.c_str(), status2.c_str(), status3.c_str(), status4.c_str(), status5.c_str(), command1.c_str(), command1Line.c_str(), command2.c_str(), command2Line.c_str(), command3.c_str(), command3Line.c_str(), command4.c_str(), command4Line.c_str()); wxFileName wlFilename(wxFileName::GetHomeDir(), WHITELIST_FILE_NAME); bool exists = wlFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(wlFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open white list file - %s"), wlFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the white list"), list->getCount()); thread->setWhiteList(list); } } wxFileName blFilename(wxFileName::GetHomeDir(), BLACKLIST_FILE_NAME); exists = blFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(blFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open black list file - %s"), blFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the black list"), list->getCount()); thread->setBlackList(list); } } // Convert the worker class into a thread m_thread = new CSplitRepeaterThreadHelper(thread); m_thread->start(); }
bool CDVAPNodeD::createThread() { CDVAPNodeConfig config(m_confDir, m_name); wxString callsign, gateway; DSTAR_MODE mode; ACK_TYPE ack; bool restriction, rpt1Validation; config.getCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation); switch (mode) { case MODE_RXONLY: m_thread = new CDVAPNodeRXThread; break; case MODE_TXONLY: m_thread = new CDVAPNodeTXThread; break; default: m_thread = new CDVAPNodeTRXThread; break; } m_thread->setCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation); wxLogInfo(wxT("Callsign set to \"%s\", gateway set to \"%s\", mode: %d, ack: %d, restriction: %d, RPT1 validation: %d"), callsign.c_str(), gateway.c_str(), int(mode), int(ack), restriction, rpt1Validation); wxString gatewayAddress, localAddress; unsigned int gatewayPort, localPort; config.getNetwork(gatewayAddress, gatewayPort, localAddress, localPort); wxLogInfo(wxT("Gateway set to %s:%u, local set to %s:%u"), gatewayAddress.c_str(), gatewayPort, localAddress.c_str(), localPort); if (!gatewayAddress.IsEmpty()) { CRepeaterProtocolHandler* handler = new CRepeaterProtocolHandler(gatewayAddress, gatewayPort, localAddress, localPort); bool res = handler->open(); if (!res) { wxLogError(wxT("Cannot open the protocol handler")); return false; } m_thread->setProtocolHandler(handler); } unsigned int timeout, ackTime; config.getTimes(timeout, ackTime); m_thread->setTimes(timeout, ackTime); wxLogInfo(wxT("Timeout set to %u secs, ack time set to %u ms"), timeout, ackTime); unsigned int beaconTime; wxString beaconText; bool beaconVoice; TEXT_LANG language; config.getBeacon(beaconTime, beaconText, beaconVoice, language); m_thread->setBeacon(beaconTime, beaconText, beaconVoice, language); wxLogInfo(wxT("Beacon set to %u mins, text set to \"%s\", voice set to %d, language set to %d"), beaconTime / 60U, beaconText.c_str(), int(beaconVoice), int(language)); wxString dvapPort; unsigned int dvapFrequency; int dvapPower, dvapSquelch, dvapOffset; config.getDVAP(dvapPort, dvapFrequency, dvapPower, dvapSquelch, dvapOffset); wxLogInfo(wxT("DVAP: port: %s, frequency: %u Hz, power: %d dBm, squelch: %d dBm, offset: %d Hz"), dvapPort.c_str(), dvapFrequency, dvapPower, dvapSquelch, dvapOffset); if (!dvapPort.IsEmpty()) { CDVAPController* dvap = new CDVAPController(dvapPort, dvapFrequency, dvapPower, dvapSquelch, dvapOffset); bool res = dvap->open(); if (!res) { wxLogError(wxT("Unable to open the DVAP")); return false; } m_thread->setDVAP(dvap); } wxFileName wlFilename(wxFileName::GetHomeDir(), WHITELIST_FILE_NAME); bool exists = wlFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(wlFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open white list file - %s"), wlFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the white list"), list->getCount()); m_thread->setWhiteList(list); } } wxFileName blFilename(wxFileName::GetHomeDir(), BLACKLIST_FILE_NAME); exists = blFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(blFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open black list file - %s"), blFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the black list"), list->getCount()); m_thread->setBlackList(list); } } return true; }
void CDVRPTRRepeaterApp::createThread() { wxString callsign, gateway; DSTAR_MODE mode; ACK_TYPE ack; bool restriction, rpt1Validation; getCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation); IDVRPTRRepeaterThread* thread = NULL; switch (mode) { case MODE_RXONLY: thread = new CDVRPTRRepeaterRXThread; break; case MODE_TXONLY: thread = new CDVRPTRRepeaterTXThread; break; case MODE_TXANDRX: thread = new CDVRPTRRepeaterTXRXThread; break; default: thread = new CDVRPTRRepeaterTRXThread; break; } thread->setCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation); wxLogInfo(wxT("Callsign set to \"%s\", gateway set to \"%s\", mode: %d, ack: %d, restriction: %d, RPT1 validation: %d"), callsign.c_str(), gateway.c_str(), int(mode), int(ack), restriction, rpt1Validation); wxString gatewayAddress, localAddress; unsigned int gatewayPort, localPort; getNetwork(gatewayAddress, gatewayPort, localAddress, localPort); wxLogInfo(wxT("Gateway set to %s:%u, local set to %s:%u"), gatewayAddress.c_str(), gatewayPort, localAddress.c_str(), localPort); if (!gatewayAddress.IsEmpty()) { CRepeaterProtocolHandler* handler = new CRepeaterProtocolHandler(gatewayAddress, gatewayPort, localAddress, localPort); bool res = handler->open(); if (!res) wxLogError(wxT("Cannot open the protocol handler")); else thread->setProtocolHandler(handler); } unsigned int timeout, ackTime; getTimes(timeout, ackTime); thread->setTimes(timeout, ackTime); wxLogInfo(wxT("Timeout set to %u secs, ack time set to %u ms"), timeout, ackTime); unsigned int beaconTime; wxString beaconText; bool beaconVoice; TEXT_LANG language; getBeacon(beaconTime, beaconText, beaconVoice, language); if (mode == MODE_GATEWAY) beaconTime = 0U; thread->setBeacon(beaconTime, beaconText, beaconVoice, language); wxLogInfo(wxT("Beacon set to %u mins, text set to \"%s\", voice set to %d, language set to %d"), beaconTime / 60U, beaconText.c_str(), int(beaconVoice), int(language)); DVRPTR_VERSION modemVersion; CONNECTION_TYPE modemType; wxString modemUSBPort, modemAddress, modemUSBPath; bool rxInvert, txInvert, channel; unsigned int modemPort, modLevel, txDelay; getModem(modemVersion, modemType, modemUSBPort, modemAddress, modemPort, rxInvert, txInvert, channel, modLevel, txDelay); wxLogInfo(wxT("DV-RPTR modem: version: %d, type: %d, USB port: %s, address: %s:%u, RX invert: %d, TX invert: %d, channel: %s, mod level: %u%%, TX delay: %u ms"), int(modemVersion), int(modemType), modemUSBPort.c_str(), modemAddress.c_str(), modemPort, int(rxInvert), int(txInvert), channel ? wxT("B") : wxT("A"), modLevel, txDelay); if (modemType == CT_USB) { if (!modemUSBPort.IsEmpty()) { getModem(modemUSBPath); if (!modemUSBPath.IsEmpty()) wxLogInfo(wxT("DV-RPTR modem: path: %s"), modemUSBPath.c_str()); IDVRPTRController* controller = NULL; switch (modemVersion) { case DVRPTR_V1: controller = new CDVRPTRControllerV1(modemUSBPort, modemUSBPath, rxInvert, txInvert, channel, modLevel, txDelay); break; case DVRPTR_V2: controller = new CDVRPTRControllerV2(modemUSBPort, modemUSBPath, txInvert, modLevel, mode == MODE_DUPLEX || mode == MODE_TXANDRX, callsign); break; default: wxLogError(wxT("Unknown DV-RPTR modem version - %d"), int(modemVersion)); break; } if (controller != NULL) { bool res = controller->open(); if (!res) { wxLogError(wxT("Cannot open the DV-RPTR modem")); } else { thread->setModem(controller); setModem(controller->getPath()); } } } } else if (modemType == CT_NETWORK) { if (!modemAddress.IsEmpty()) { CDVRPTRControllerV2* controller = new CDVRPTRControllerV2(modemAddress, modemPort, txInvert, modLevel, mode == MODE_DUPLEX || mode == MODE_TXANDRX, callsign); bool res = controller->open(); if (!res) wxLogError(wxT("Cannot open the DV-RPTR modem")); else thread->setModem(controller); } } wxString controllerType; unsigned int activeHangTime; getController(controllerType, activeHangTime); wxLogInfo(wxT("Controller set to %s, active hang time: %u ms"), controllerType.c_str(), activeHangTime); CExternalController* controller = NULL; wxString port; if (controllerType.StartsWith(wxT("Velleman K8055 - "), &port)) { unsigned long num; port.ToULong(&num); controller = new CExternalController(new CK8055Controller(num), false, false); } else if (controllerType.IsSameAs(wxT("Raspberry Pi"))) { controller = new CExternalController(new CRaspberryController, false, false); } else { controller = new CExternalController(new CDummyController, false, false); } bool res = controller->open(); if (!res) wxLogError(wxT("Cannot open the hardware interface - %s"), controllerType.c_str()); else thread->setController(controller, activeHangTime); bool out1, out2, out3, out4; getOutputs(out1, out2, out3, out4); thread->setOutputs(out1, out2, out3, out4); m_frame->setOutputs(out1, out2, out3, out4); wxLogInfo(wxT("Output 1 = %d, output 2 = %d, output 3 = %d, output 4 = %d"), out1, out2, out3, out4); bool enabled; wxString rpt1Callsign, rpt2Callsign; wxString shutdown, startup; wxString status1, status2, status3, status4, status5; wxString command1, command1Line, command2, command2Line; wxString command3, command3Line, command4, command4Line; wxString output1, output2, output3, output4; getControl(enabled, rpt1Callsign, rpt2Callsign, shutdown, startup, status1, status2, status3, status4, status5, command1, command1Line, command2, command2Line, command3, command3Line, command4, command4Line, output1, output2, output3, output4); thread->setControl(enabled, rpt1Callsign, rpt2Callsign, shutdown, startup, status1, status2, status3, status4, status5, command1, command1Line, command2, command2Line, command3, command3Line, command4, command4Line, output1, output2, output3, output4); wxLogInfo(wxT("Control: enabled: %d, RPT1: %s, RPT2: %s, shutdown: %s, startup: %s, status1: %s, status2: %s, status3: %s, status4: %s, status5: %s, command1: %s = %s, command2: %s = %s, command3: %s = %s, command4: %s = %s, output1: %s, output2: %s, output3: %s, output4: %s"), enabled, rpt1Callsign.c_str(), rpt2Callsign.c_str(), shutdown.c_str(), startup.c_str(), status1.c_str(), status2.c_str(), status3.c_str(), status4.c_str(), status5.c_str(), command1.c_str(), command1Line.c_str(), command2.c_str(), command2Line.c_str(), command3.c_str(), command3Line.c_str(), command4.c_str(), command4Line.c_str(), output1.c_str(), output2.c_str(), output3.c_str(), output4.c_str()); bool logging; getLogging(logging); thread->setLogging(logging, m_audioDir); m_frame->setLogging(logging); wxLogInfo(wxT("Frame logging set to %d, in %s"), int(logging), m_audioDir.c_str()); wxFileName wlFilename(wxFileName::GetHomeDir(), WHITELIST_FILE_NAME); bool exists = wlFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(wlFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open white list file - %s"), wlFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the white list"), list->getCount()); thread->setWhiteList(list); } } wxFileName blFilename(wxFileName::GetHomeDir(), BLACKLIST_FILE_NAME); exists = blFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(blFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open black list file - %s"), blFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the black list"), list->getCount()); thread->setBlackList(list); } } // Convert the worker class into a thread m_thread = new CDVRPTRRepeaterThreadHelper(thread); m_thread->start(); }
void CIRCDDBGatewayApp::createThread() { wxASSERT(m_config != NULL); CIRCDDBGatewayThread* thread = new CIRCDDBGatewayThread(m_logDir, m_name); GATEWAY_TYPE gatewayType; wxString gatewayCallsign, gatewayAddress, icomAddress, hbAddress, description1, description2, url; unsigned int icomPort, hbPort; double latitude, longitude; m_config->getGateway(gatewayType, gatewayCallsign, gatewayAddress, icomAddress, icomPort, hbAddress, hbPort, latitude, longitude, description1, description2, url); gatewayCallsign.MakeUpper(); gatewayCallsign.Append(wxT(" ")); gatewayCallsign.Truncate(LONG_CALLSIGN_LENGTH - 1U); wxString callsign = gatewayCallsign; callsign.Append(wxT(" ")); gatewayCallsign.Append(wxT("G")); wxLogInfo(wxT("Gateway type: %d, callsign: \"%s\", address: %s, Icom address: %s:%u, homebrew address: %s:%u, latitude: %lf, longitude: %lf, description: \"%s %s\", URL: \"%s\""), int(gatewayType), gatewayCallsign.c_str(), gatewayAddress.c_str(), icomAddress.c_str(), icomPort, hbAddress.c_str(), hbPort, latitude, longitude, description1.c_str(), description2.c_str(), url.c_str()); thread->setGateway(gatewayType, gatewayCallsign, gatewayAddress); wxString aprsHostname; unsigned int aprsPort; bool aprsEnabled; m_config->getDPRS(aprsEnabled, aprsHostname, aprsPort); wxLogInfo(wxT("APRS enabled: %d, host: %s:%u"), int(aprsEnabled), aprsHostname.c_str(), aprsPort); CAPRSWriter* aprs = NULL; if (aprsEnabled && !gatewayCallsign.IsEmpty() && !aprsHostname.IsEmpty() && aprsPort != 0U) { aprs = new CAPRSWriter(aprsHostname, aprsPort, gatewayCallsign, gatewayAddress); bool res = aprs->open(); if (!res) wxLogError(wxT("Cannot initialise the APRS data writer")); else thread->setAPRSWriter(aprs); } TEXT_LANG language; bool infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled; m_config->getMiscellaneous(language, infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled); wxLogInfo(wxT("Language: %d, info enabled: %d, echo enabled: %d, log enabled : %d, D-RATS enabled: %d, DTMF control enabled: %d"), int(language), int(infoEnabled), int(echoEnabled), int(logEnabled), int(dratsEnabled), int(dtmfEnabled)); CIcomRepeaterProtocolHandler* icomRepeaterHandler = NULL; CHBRepeaterProtocolHandler* hbRepeaterHandler = NULL; CDummyRepeaterProtocolHandler* dummyRepeaterHandler = NULL; unsigned int icomCount = 0U; wxString repeaterCall1, repeaterBand1, repeaterAddress1, reflector1, description11, description12, url1; double frequency1, offset1, range1, latitude1, longitude1, agl1; unsigned char band11, band12, band13; unsigned int repeaterPort1; HW_TYPE repeaterType1; bool atStartup1; RECONNECT reconnect1; m_config->getRepeater1(repeaterCall1, repeaterBand1, repeaterType1, repeaterAddress1, repeaterPort1, band11, band12, band13, reflector1, atStartup1, reconnect1, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1); CUtils::clean(description11, wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,&*()-+=@/?:;")); CUtils::clean(description12, wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,&*()-+=@/?:;")); CUtils::clean(url1, wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,&*()-+=@/?:;")); wxString callsign1 = callsign; if (!repeaterBand1.IsSameAs(wxT(" "))) { if (!repeaterCall1.IsEmpty()) { callsign1 = repeaterCall1; callsign1.Append(wxT(" ")); callsign1.Truncate(LONG_CALLSIGN_LENGTH); } wxLogInfo(wxT("Repeater 1 callsign: \"%.7s%s\", hardware type: %d, address: %s:%u"), callsign1.c_str(), repeaterBand1.c_str(), int(repeaterType1), repeaterAddress1.c_str(), repeaterPort1); wxLogInfo(wxT("Repeater 1 reflector: %s, at startup: %d, reconnect: %d"), reflector1.c_str(), atStartup1, reconnect1); wxLogInfo(wxT("Repeater 1 latitude: %lf, longitude: %lf, range: %.0lf kms, height: %.0lf m, frequency: %.4lf MHz, offset: %.4lf MHz"), latitude1, longitude1, range1, agl1, frequency1, offset1); wxLogInfo(wxT("Repeater 1 description: \"%s %s\", URL: \"%s\""), description11.c_str(), description12.c_str(), url1.c_str()); if (repeaterType1 == HW_ICOM && !icomAddress.IsEmpty()) { icomRepeaterHandler = new CIcomRepeaterProtocolHandler(icomAddress, icomPort, repeaterAddress1, repeaterPort1); bool res = icomRepeaterHandler->open(); if (!res) { wxLogError(wxT("Cannot open the Icom repeater protocol handler")); delete icomRepeaterHandler; icomRepeaterHandler = NULL; } } else if (repeaterType1 == HW_HOMEBREW && !hbAddress.IsEmpty()) { hbRepeaterHandler = new CHBRepeaterProtocolHandler(hbAddress, hbPort); bool res = hbRepeaterHandler->open(); if (!res) { wxLogError(wxT("Cannot open the Homebrew repeater protocol handler")); delete hbRepeaterHandler; hbRepeaterHandler = NULL; } } else if (repeaterType1 == HW_DUMMY && !hbAddress.IsEmpty()) { dummyRepeaterHandler = new CDummyRepeaterProtocolHandler; bool res = dummyRepeaterHandler->open(); if (!res) { wxLogError(wxT("Cannot open the Dummy repeater protocol handler")); delete dummyRepeaterHandler; dummyRepeaterHandler = NULL; } } if (latitude1 == 0.0 && longitude1 == 0.0) { latitude1 = latitude; longitude1 = longitude; } if (description11.IsEmpty()) description11 = description1; if (description12.IsEmpty()) description12 = description2; if (url1.IsEmpty()) url1 = url; if (repeaterType1 == HW_ICOM && icomRepeaterHandler != NULL) { wxLogInfo(wxT("Repeater 1 bands: %u %u %u"), band11, band12, band13); thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, icomRepeaterHandler, band11, band12, band13); if (aprs != NULL) aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); icomCount++; } else if (repeaterType1 == HW_HOMEBREW && hbRepeaterHandler != NULL) { thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, hbRepeaterHandler); if (aprs != NULL) aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); } else if (repeaterType1 == HW_DUMMY && dummyRepeaterHandler != NULL) { thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, dummyRepeaterHandler); } } wxString repeaterCall2, repeaterBand2, repeaterAddress2, reflector2, description21, description22, url2; double frequency2, offset2, range2, latitude2, longitude2, agl2; unsigned char band21, band22, band23; unsigned int repeaterPort2; HW_TYPE repeaterType2; bool atStartup2; RECONNECT reconnect2; m_config->getRepeater2(repeaterCall2, repeaterBand2, repeaterType2, repeaterAddress2, repeaterPort2, band21, band22, band23, reflector2, atStartup2, reconnect2, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2); CUtils::clean(description21, wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,&*()-+=@/?:;")); CUtils::clean(description22, wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,&*()-+=@/?:;")); CUtils::clean(url2, wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,&*()-+=@/?:;")); wxString callsign2 = callsign; if (!repeaterBand2.IsSameAs(wxT(" "))) { if (!repeaterCall2.IsEmpty()) { callsign2 = repeaterCall2; callsign2.Append(wxT(" ")); callsign2.Truncate(LONG_CALLSIGN_LENGTH); } wxLogInfo(wxT("Repeater 2 callsign: \"%.7s%s\", hardware type: %d, address: %s:%u"), callsign2.c_str(), repeaterBand2.c_str(), int(repeaterType2), repeaterAddress2.c_str(), repeaterPort2); wxLogInfo(wxT("Repeater 2 reflector: %s, at startup: %d, reconnect: %d"), reflector2.c_str(), atStartup2, reconnect2); wxLogInfo(wxT("Repeater 2 latitude: %lf, longitude: %lf, range: %.0lf kms, height: %.0lf m, frequency: %.4lf MHz, offset: %.4lf MHz"), latitude2, longitude2, range2, agl2, frequency2, offset2); wxLogInfo(wxT("Repeater 2 description: \"%s %s\", URL: \"%s\""), description21.c_str(), description22.c_str(), url2.c_str()); if (callsign1.IsSameAs(callsign2) && repeaterBand1.IsSameAs(repeaterBand2)) { wxLogError(wxT("Repeater 2 has the same callsign and module as repeater 1, exiting")); return; } if (repeaterType2 == HW_ICOM && !icomAddress.IsEmpty() && icomRepeaterHandler == NULL) { icomRepeaterHandler = new CIcomRepeaterProtocolHandler(icomAddress, icomPort, repeaterAddress2, repeaterPort2); bool res = icomRepeaterHandler->open(); if (!res) { wxLogError(wxT("Cannot open the Icom repeater protocol handler")); delete icomRepeaterHandler; icomRepeaterHandler = NULL; } } else if (repeaterType2 == HW_HOMEBREW && !hbAddress.IsEmpty() && hbRepeaterHandler == NULL) { hbRepeaterHandler = new CHBRepeaterProtocolHandler(hbAddress, hbPort); bool res = hbRepeaterHandler->open(); if (!res) { wxLogError(wxT("Cannot open the Homebrew repeater protocol handler")); delete hbRepeaterHandler; hbRepeaterHandler = NULL; } } else if (repeaterType2 == HW_DUMMY && !hbAddress.IsEmpty() && dummyRepeaterHandler == NULL) { dummyRepeaterHandler = new CDummyRepeaterProtocolHandler; bool res = dummyRepeaterHandler->open(); if (!res) { wxLogError(wxT("Cannot open the Dummy repeater protocol handler")); delete dummyRepeaterHandler; dummyRepeaterHandler = NULL; } } if (latitude2 == 0.0 && longitude2 == 0.0) { latitude2 = latitude; longitude2 = longitude; } if (description21.IsEmpty()) description21 = description1; if (description22.IsEmpty()) description22 = description2; if (url2.IsEmpty()) url2 = url; if (repeaterType2 == HW_ICOM && icomRepeaterHandler != NULL) { wxLogInfo(wxT("Repeater 2 bands: %u %u %u"), band21, band22, band23); thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, icomRepeaterHandler, band21, band22, band23); if (aprs != NULL) aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2); icomCount++; } else if (repeaterType2 == HW_HOMEBREW && hbRepeaterHandler != NULL) { thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, hbRepeaterHandler); if (aprs != NULL) aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2); } else if (repeaterType2 == HW_DUMMY && dummyRepeaterHandler != NULL) { thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, dummyRepeaterHandler); } } wxString repeaterCall3, repeaterBand3, repeaterAddress3, reflector3, description31, description32, url3; double frequency3, offset3, range3, latitude3, longitude3, agl3; unsigned char band31, band32, band33; unsigned int repeaterPort3; HW_TYPE repeaterType3; bool atStartup3; RECONNECT reconnect3; m_config->getRepeater3(repeaterCall3, repeaterBand3, repeaterType3, repeaterAddress3, repeaterPort3, band31, band32, band33, reflector3, atStartup3, reconnect3, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3); CUtils::clean(description31, wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,&*()-+=@/?:;")); CUtils::clean(description32, wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,&*()-+=@/?:;")); CUtils::clean(url3, wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,&*()-+=@/?:;")); wxString callsign3 = callsign; if (!repeaterBand3.IsSameAs(wxT(" "))) { if (!repeaterCall3.IsEmpty()) { callsign3 = repeaterCall3; callsign3.Append(wxT(" ")); callsign3.Truncate(LONG_CALLSIGN_LENGTH); } wxLogInfo(wxT("Repeater 3 callsign: \"%.7s%s\", hardware type: %d, address: %s:%u"), callsign3.c_str(), repeaterBand3.c_str(), int(repeaterType3), repeaterAddress3.c_str(), repeaterPort3); wxLogInfo(wxT("Repeater 3 reflector: %s, at startup: %d, reconnect: %d"), reflector3.c_str(), atStartup3, reconnect3); wxLogInfo(wxT("Repeater 3 latitude: %lf, longitude: %lf, range: %.0lf kms, height: %.0lf m, frequency: %.4lf MHz, offset: %.4lf MHz"), latitude3, longitude3, range3, agl3, frequency3, offset3); wxLogInfo(wxT("Repeater 3 description: \"%s %s\", URL: \"%s\""), description31.c_str(), description32.c_str(), url3.c_str()); if (callsign1.IsSameAs(callsign3) && repeaterBand1.IsSameAs(repeaterBand3)) { wxLogError(wxT("Repeater 3 has the same callsign and module as repeater 1, exiting")); return; } if (callsign2.IsSameAs(callsign3) && repeaterBand2.IsSameAs(repeaterBand3)) { wxLogError(wxT("Repeater 3 has the same callsign and module as repeater 2, exiting")); return; } if (repeaterType3 == HW_ICOM && !icomAddress.IsEmpty() && icomRepeaterHandler == NULL) { icomRepeaterHandler = new CIcomRepeaterProtocolHandler(icomAddress, icomPort, repeaterAddress3, repeaterPort3); bool res = icomRepeaterHandler->open(); if (!res) { wxLogError(wxT("Cannot open the Icom repeater protocol handler")); delete icomRepeaterHandler; icomRepeaterHandler = NULL; } } else if (repeaterType3 == HW_HOMEBREW && !hbAddress.IsEmpty() && hbRepeaterHandler == NULL) { hbRepeaterHandler = new CHBRepeaterProtocolHandler(hbAddress, hbPort); bool res = hbRepeaterHandler->open(); if (!res) { wxLogError(wxT("Cannot open the Homebrew repeater protocol handler")); delete hbRepeaterHandler; hbRepeaterHandler = NULL; } } else if (repeaterType3 == HW_DUMMY && !hbAddress.IsEmpty() && dummyRepeaterHandler == NULL) { dummyRepeaterHandler = new CDummyRepeaterProtocolHandler; bool res = dummyRepeaterHandler->open(); if (!res) { wxLogError(wxT("Cannot open the Dummy repeater protocol handler")); delete dummyRepeaterHandler; dummyRepeaterHandler = NULL; } } if (latitude3 == 0.0 && longitude3 == 0.0) { latitude3 = latitude; longitude3 = longitude; } if (description31.IsEmpty()) description31 = description1; if (description32.IsEmpty()) description32 = description2; if (url3.IsEmpty()) url3 = url; if (repeaterType3 == HW_ICOM && icomRepeaterHandler != NULL) { wxLogInfo(wxT("Repeater 3 bands: %u %u %u"), band31, band32, band33); thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, icomRepeaterHandler, band31, band32, band33); if (aprs != NULL) aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); icomCount++; } else if (repeaterType3 == HW_HOMEBREW && hbRepeaterHandler != NULL) { thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, hbRepeaterHandler); if (aprs != NULL) aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); } else if (repeaterType3 == HW_DUMMY && dummyRepeaterHandler != NULL) { thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, dummyRepeaterHandler); } } wxString repeaterCall4, repeaterBand4, repeaterAddress4, reflector4, description41, description42, url4; double frequency4, offset4, range4, latitude4, longitude4, agl4; unsigned char band41, band42, band43; unsigned int repeaterPort4; HW_TYPE repeaterType4; bool atStartup4; RECONNECT reconnect4; m_config->getRepeater4(repeaterCall4, repeaterBand4, repeaterType4, repeaterAddress4, repeaterPort4, band41, band42, band43, reflector4, atStartup4, reconnect4, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4); CUtils::clean(description41, wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,&*()-+=@/?:;")); CUtils::clean(description42, wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,&*()-+=@/?:;")); CUtils::clean(url4, wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,&*()-+=@/?:;")); wxString callsign4 = callsign; if (!repeaterBand4.IsSameAs(wxT(" "))) { if (!repeaterCall4.IsEmpty()) { callsign4 = repeaterCall4; callsign4.Append(wxT(" ")); callsign4.Truncate(LONG_CALLSIGN_LENGTH); } wxLogInfo(wxT("Repeater 4 callsign: \"%.7s%s\", hardware type: %d, address: %s:%u"), callsign4.c_str(), repeaterBand4.c_str(), int(repeaterType4), repeaterAddress4.c_str(), repeaterPort4); wxLogInfo(wxT("Repeater 4 reflector: %s, at startup: %d, reconnect: %d"), reflector4.c_str(), atStartup4, reconnect4); wxLogInfo(wxT("Repeater 4 latitude: %lf, longitude: %lf, range: %.0lf kms, height: %.0lf m, frequency: %.4lf MHz, offset: %.4lf MHz"), latitude4, longitude4, range4, agl4, frequency4, offset4); wxLogInfo(wxT("Repeater 4 description: \"%s %s\", URL: \"%s\""), description41.c_str(), description42.c_str(), url4.c_str()); if (callsign1.IsSameAs(callsign4) && repeaterBand1.IsSameAs(repeaterBand4)) { wxLogError(wxT("Repeater 4 has the same callsign and module as repeater 1, exiting")); return; } if (callsign2.IsSameAs(callsign4) && repeaterBand2.IsSameAs(repeaterBand4)) { wxLogError(wxT("Repeater 4 has the same callsign and module as repeater 2, exiting")); return; } if (callsign3.IsSameAs(callsign4) && repeaterBand3.IsSameAs(repeaterBand4)) { wxLogError(wxT("Repeater 4 has the same callsign and module as repeater 3, exiting")); return; } if (repeaterType4 == HW_ICOM && !icomAddress.IsEmpty() && icomRepeaterHandler == NULL) { icomRepeaterHandler = new CIcomRepeaterProtocolHandler(icomAddress, icomPort, repeaterAddress4, repeaterPort4); bool res = icomRepeaterHandler->open(); if (!res) { wxLogError(wxT("Cannot open the Icom repeater protocol handler")); delete icomRepeaterHandler; icomRepeaterHandler = NULL; } } else if (repeaterType4 == HW_HOMEBREW && !hbAddress.IsEmpty() && hbRepeaterHandler == NULL) { hbRepeaterHandler = new CHBRepeaterProtocolHandler(hbAddress, hbPort); bool res = hbRepeaterHandler->open(); if (!res) { wxLogError(wxT("Cannot open the Homebrew repeater protocol handler")); delete hbRepeaterHandler; hbRepeaterHandler = NULL; } } else if (repeaterType4 == HW_DUMMY && !hbAddress.IsEmpty() && dummyRepeaterHandler == NULL) { dummyRepeaterHandler = new CDummyRepeaterProtocolHandler; bool res = dummyRepeaterHandler->open(); if (!res) { wxLogError(wxT("Cannot open the Dummy repeater protocol handler")); delete dummyRepeaterHandler; dummyRepeaterHandler = NULL; } } if (latitude4 == 0.0 && longitude4 == 0.0) { latitude4 = latitude; longitude4 = longitude; } if (description41.IsEmpty()) description41 = description1; if (description42.IsEmpty()) description42 = description2; if (url4.IsEmpty()) url4 = url; if (repeaterType4 == HW_ICOM && icomRepeaterHandler != NULL) { wxLogInfo(wxT("Repeater 4 bands: %u %u %u"), band41, band42, band43); thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, icomRepeaterHandler, band41, band42, band43); if (aprs != NULL) aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); icomCount++; } else if (repeaterType4 == HW_HOMEBREW && hbRepeaterHandler != NULL) { thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, hbRepeaterHandler); if (aprs != NULL) aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); } else if (repeaterType4 == HW_DUMMY && dummyRepeaterHandler != NULL) { thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, dummyRepeaterHandler); } } if (icomRepeaterHandler != NULL) icomRepeaterHandler->setCount(icomCount); bool ircDDBEnabled; wxString ircDDBHostname, ircDDBUsername, ircDDBPassword; m_config->getIrcDDB(ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword); wxLogInfo(wxT("ircDDB enabled: %d, host: %s, username: %s"), int(ircDDBEnabled), ircDDBHostname.c_str(), ircDDBUsername.c_str()); if (ircDDBEnabled) { #if defined(__WINDOWS__) CIRCDDB* ircDDB = new CIRCDDB(ircDDBHostname, 9007U, ircDDBUsername, ircDDBPassword, wxT("win_") + LOG_BASE_NAME + wxT("-") + VERSION, gatewayAddress); #else CIRCDDB* ircDDB = new CIRCDDB(ircDDBHostname, 9007U, ircDDBUsername, ircDDBPassword, wxT("linux_") + LOG_BASE_NAME + wxT("-") + VERSION, gatewayAddress); #endif bool res = ircDDB->open(); if (!res) { wxLogError(wxT("Cannot initialise the ircDDB protocol handler")); ircDDBEnabled = false; } else { thread->setIRC(ircDDB); } } if (ircDDBEnabled) { wxString starNetBand1, starNetCallsign1, starNetLogoff1, starNetInfo1, starNetPermanent1, link1; // DEXTRA_LINK || DCS_LINK unsigned int starNetUserTimeout1, starNetGroupTimeout1; STARNET_CALLSIGN_SWITCH starNetCallsignSwitch1; bool starNetTXMsgSwitch1; m_config->getStarNet1(starNetBand1, starNetCallsign1, starNetLogoff1, starNetInfo1, starNetPermanent1, starNetUserTimeout1, starNetGroupTimeout1, starNetCallsignSwitch1, starNetTXMsgSwitch1 #if defined(DEXTRA_LINK) || defined(DCS_LINK) ,link1 #endif ); if (!starNetCallsign1.IsEmpty() && !starNetCallsign1.IsSameAs(wxT(" "))) { wxString repeater = gatewayCallsign; repeater.Truncate(LONG_CALLSIGN_LENGTH - 1U); repeater.Append(starNetBand1); #if defined(DEXTRA_LINK) || defined(DCS_LINK) thread->addStarNet(starNetCallsign1, starNetLogoff1, repeater, starNetInfo1, starNetPermanent1, starNetUserTimeout1, starNetGroupTimeout1, starNetCallsignSwitch1, starNetTXMsgSwitch1, link1); wxLogInfo(wxT("STARnet group 1 set to %s/%s on repeater %s, info: \"%s\", permanent: %s, user: %u mins, group: %u mins, callsign switch: %d, tx msg switch: %d, reflector: %s"), starNetCallsign1.c_str(), starNetLogoff1.c_str(), repeater.c_str(), starNetInfo1.c_str(), starNetPermanent1.c_str(), starNetUserTimeout1, starNetGroupTimeout1, int(starNetCallsignSwitch1), int(starNetTXMsgSwitch1), link1.c_str()); #else thread->addStarNet(starNetCallsign1, starNetLogoff1, repeater, starNetInfo1, starNetPermanent1, starNetUserTimeout1, starNetGroupTimeout1, starNetCallsignSwitch1, starNetTXMsgSwitch1); wxLogInfo(wxT("STARnet group 1 set to %s/%s on repeater %s, info: \"%s\", permanent: %s, user: %u mins, group: %u mins, callsign switch: %d, tx msg switch: %d"), starNetCallsign1.c_str(), starNetLogoff1.c_str(), repeater.c_str(), starNetInfo1.c_str(), starNetPermanent1.c_str(), starNetUserTimeout1, starNetGroupTimeout1, int(starNetCallsignSwitch1), int(starNetTXMsgSwitch1)); #endif } wxString starNetBand2, starNetCallsign2, starNetLogoff2, starNetInfo2, starNetPermanent2, link2; // DEXTRA_LINK || DCS_LINK unsigned int starNetUserTimeout2, starNetGroupTimeout2; STARNET_CALLSIGN_SWITCH starNetCallsignSwitch2; bool starNetTXMsgSwitch2; m_config->getStarNet2(starNetBand2, starNetCallsign2, starNetLogoff2, starNetInfo2, starNetPermanent2, starNetUserTimeout2, starNetGroupTimeout2, starNetCallsignSwitch2, starNetTXMsgSwitch2 #if defined(DEXTRA_LINK) || defined(DCS_LINK) ,link2 #endif ); if (!starNetCallsign2.IsEmpty() && !starNetCallsign2.IsSameAs(wxT(" "))) { wxString repeater = gatewayCallsign; repeater.Truncate(LONG_CALLSIGN_LENGTH - 1U); repeater.Append(starNetBand2); #if defined(DEXTRA_LINK) || defined(DCS_LINK) thread->addStarNet(starNetCallsign2, starNetLogoff2, repeater, starNetInfo2, starNetPermanent2, starNetUserTimeout2, starNetGroupTimeout2, starNetCallsignSwitch2, starNetTXMsgSwitch2, link2); wxLogInfo(wxT("STARnet group 2 set to %s/%s on repeater %s, info: \"%s\", permanent: %s, user: %u mins, group: %u mins, callsign switch: %d, tx msg switch: %d, reflector: %s"), starNetCallsign2.c_str(), starNetLogoff2.c_str(), repeater.c_str(), starNetInfo2.c_str(), starNetPermanent2.c_str(), starNetUserTimeout2, starNetGroupTimeout2, int(starNetCallsignSwitch2), int(starNetTXMsgSwitch2), link2.c_str()); #else thread->addStarNet(starNetCallsign2, starNetLogoff2, repeater, starNetInfo2, starNetPermanent2, starNetUserTimeout2, starNetGroupTimeout2, starNetCallsignSwitch2, starNetTXMsgSwitch2); wxLogInfo(wxT("STARnet group 2 set to %s/%s on repeater %s, info: \"%s\", permanent: %s, user: %u mins, group: %u mins, callsign switch: %d, tx msg switch: %d"), starNetCallsign2.c_str(), starNetLogoff2.c_str(), repeater.c_str(), starNetInfo2.c_str(), starNetPermanent2.c_str(), starNetUserTimeout2, starNetGroupTimeout2, int(starNetCallsignSwitch2), int(starNetTXMsgSwitch2)); #endif } wxString starNetBand3, starNetCallsign3, starNetLogoff3, starNetInfo3, starNetPermanent3, link3; // DEXTRA_LINK || DCS_LINK unsigned int starNetUserTimeout3, starNetGroupTimeout3; STARNET_CALLSIGN_SWITCH starNetCallsignSwitch3; bool starNetTXMsgSwitch3; m_config->getStarNet3(starNetBand3, starNetCallsign3, starNetLogoff3, starNetInfo3, starNetPermanent3, starNetUserTimeout3, starNetGroupTimeout3, starNetCallsignSwitch3, starNetTXMsgSwitch3 #if defined(DEXTRA_LINK) || defined(DCS_LINK) ,link3 #endif ); if (!starNetCallsign3.IsEmpty() && !starNetCallsign3.IsSameAs(wxT(" "))) { wxString repeater = gatewayCallsign; repeater.Truncate(LONG_CALLSIGN_LENGTH - 1U); repeater.Append(starNetBand3); #if defined(DEXTRA_LINK) || defined(DCS_LINK) thread->addStarNet(starNetCallsign3, starNetLogoff3, repeater, starNetInfo3, starNetPermanent3, starNetUserTimeout3, starNetGroupTimeout3, starNetCallsignSwitch3, starNetTXMsgSwitch3, link3); wxLogInfo(wxT("STARnet group 3 set to %s/%s on repeater %s, info: \"%s\", permanent: %s, user: %u mins, group: %u mins, callsign switch: %d, tx msg switch: %d, reflector: %s"), starNetCallsign3.c_str(), starNetLogoff3.c_str(), repeater.c_str(), starNetInfo3.c_str(), starNetPermanent3.c_str(), starNetUserTimeout3, starNetGroupTimeout3, int(starNetCallsignSwitch3), int(starNetTXMsgSwitch3), link3.c_str()); #else thread->addStarNet(starNetCallsign3, starNetLogoff3, repeater, starNetInfo3, starNetPermanent3, starNetUserTimeout3, starNetGroupTimeout3, starNetCallsignSwitch3, starNetTXMsgSwitch3); wxLogInfo(wxT("STARnet group 3 set to %s/%s on repeater %s, info: \"%s\", permanent: %s, user: %u mins, group: %u mins, callsign switch: %d, tx msg switch: %d"), starNetCallsign3.c_str(), starNetLogoff3.c_str(), repeater.c_str(), starNetInfo3.c_str(), starNetPermanent3.c_str(), starNetUserTimeout3, starNetGroupTimeout3, int(starNetCallsignSwitch3), int(starNetTXMsgSwitch3)); #endif } wxString starNetBand4, starNetCallsign4, starNetLogoff4, starNetInfo4, starNetPermanent4, link4; // DEXTRA_LINK || DCS_LINK unsigned int starNetUserTimeout4, starNetGroupTimeout4; STARNET_CALLSIGN_SWITCH starNetCallsignSwitch4; bool starNetTXMsgSwitch4; m_config->getStarNet4(starNetBand4, starNetCallsign4, starNetLogoff4, starNetInfo4, starNetPermanent4, starNetUserTimeout4, starNetGroupTimeout4, starNetCallsignSwitch4, starNetTXMsgSwitch4 #if defined(DEXTRA_LINK) || defined(DCS_LINK) ,link4 #endif ); if (!starNetCallsign4.IsEmpty() && !starNetCallsign4.IsSameAs(wxT(" "))) { wxString repeater = gatewayCallsign; repeater.Truncate(LONG_CALLSIGN_LENGTH - 1U); repeater.Append(starNetBand4); #if defined(DEXTRA_LINK) || defined(DCS_LINK) thread->addStarNet(starNetCallsign4, starNetLogoff4, repeater, starNetInfo4, starNetPermanent4, starNetUserTimeout4, starNetGroupTimeout4, starNetCallsignSwitch4, starNetTXMsgSwitch4, link4); wxLogInfo(wxT("STARnet group 4 set to %s/%s on repeater %s, info: \"%s\", permanent: %s, user: %u mins, group: %u mins, callsign switch: %d, tx msg switch: %d, reflector: %s"), starNetCallsign4.c_str(), starNetLogoff4.c_str(), repeater.c_str(), starNetInfo4.c_str(), starNetPermanent4.c_str(), starNetUserTimeout4, starNetGroupTimeout4, int(starNetCallsignSwitch4), int(starNetTXMsgSwitch4), link4.c_str()); #else thread->addStarNet(starNetCallsign4, starNetLogoff4, repeater, starNetInfo4, starNetPermanent4, starNetUserTimeout4, starNetGroupTimeout4, starNetCallsignSwitch4, starNetTXMsgSwitch4); wxLogInfo(wxT("STARnet group 4 set to %s/%s on repeater %s, info: \"%s\", permanent: %s, user: %u mins, group: %u mins, callsign switch: %d, tx msg switch: %d"), starNetCallsign4.c_str(), starNetLogoff4.c_str(), repeater.c_str(), starNetInfo4.c_str(), starNetPermanent4.c_str(), starNetUserTimeout4, starNetGroupTimeout4, int(starNetCallsignSwitch4), int(starNetTXMsgSwitch4)); #endif } wxString starNetBand5, starNetCallsign5, starNetLogoff5, starNetInfo5, starNetPermanent5, link5; // DEXTRA_LINK || DCS_LINK unsigned int starNetUserTimeout5, starNetGroupTimeout5; STARNET_CALLSIGN_SWITCH starNetCallsignSwitch5; bool starNetTXMsgSwitch5; m_config->getStarNet5(starNetBand5, starNetCallsign5, starNetLogoff5, starNetInfo5, starNetPermanent5, starNetUserTimeout5, starNetGroupTimeout5, starNetCallsignSwitch5, starNetTXMsgSwitch5 #if defined(DEXTRA_LINK) || defined(DCS_LINK) ,link5 #endif ); if (!starNetCallsign5.IsEmpty() && !starNetCallsign5.IsSameAs(wxT(" "))) { wxString repeater = gatewayCallsign; repeater.Truncate(LONG_CALLSIGN_LENGTH - 1U); repeater.Append(starNetBand5); #if defined(DEXTRA_LINK) || defined(DCS_LINK) thread->addStarNet(starNetCallsign5, starNetLogoff5, repeater, starNetInfo5, starNetPermanent5, starNetUserTimeout5, starNetGroupTimeout5, starNetCallsignSwitch5, starNetTXMsgSwitch5, link5); wxLogInfo(wxT("STARnet group 5 set to %s/%s on repeater %s, info: \"%s\", permanent: %s, user: %u mins, group: %u mins, callsign switch: %d, tx msg switch: %d, reflector: %s"), starNetCallsign5.c_str(), starNetLogoff5.c_str(), repeater.c_str(), starNetInfo5.c_str(), starNetPermanent5.c_str(), starNetUserTimeout5, starNetGroupTimeout5, int(starNetCallsignSwitch5), int(starNetTXMsgSwitch5), link5.c_str()); #else thread->addStarNet(starNetCallsign5, starNetLogoff5, repeater, starNetInfo5, starNetPermanent5, starNetUserTimeout5, starNetGroupTimeout5, starNetCallsignSwitch5, starNetTXMsgSwitch5); wxLogInfo(wxT("STARnet group 5 set to %s/%s on repeater %s, info: \"%s\", permanent: %s, user: %u mins, group: %u mins, callsign switch: %d, tx msg switch: %d"), starNetCallsign5.c_str(), starNetLogoff5.c_str(), repeater.c_str(), starNetInfo5.c_str(), starNetPermanent5.c_str(), starNetUserTimeout5, starNetGroupTimeout5, int(starNetCallsignSwitch5), int(starNetTXMsgSwitch5)); #endif } } bool dextraEnabled; unsigned int dextraMaxDongles; m_config->getDExtra(dextraEnabled, dextraMaxDongles); wxLogInfo(wxT("DExtra enabled: %d, max. dongles: %u"), int(dextraEnabled), dextraMaxDongles); bool remoteEnabled; wxString remotePassword; unsigned int remotePort; m_config->getRemote(remoteEnabled, remotePassword, remotePort); wxLogInfo(wxT("Remote enabled: %d, port: %u"), int(remoteEnabled), remotePort); thread->setRemote(remoteEnabled, remotePassword, remotePort); wxString dplusLogin; unsigned int dplusMaxDongles; bool dplusEnabled; m_config->getDPlus(dplusEnabled, dplusMaxDongles, dplusLogin); wxLogInfo(wxT("D-Plus enabled: %d, max. dongles; %u, login: %s"), int(dplusEnabled), dplusMaxDongles, dplusLogin.c_str()); bool dcsEnabled, ccsEnabled; wxString ccsHost; m_config->getDCS(dcsEnabled, ccsEnabled, ccsHost); wxLogInfo(wxT("DCS enabled: %d, CCS enabled: %d, server: %s"), int(dcsEnabled), int(ccsEnabled), ccsHost.c_str()); if (repeaterBand1.Len() > 1U || repeaterBand2.Len() > 1U || repeaterBand3.Len() > 1U || repeaterBand4.Len() > 1U) { wxLogInfo(wxT("DD mode enabled")); thread->setDDModeEnabled(true); } wxFileName wlFilename(wxFileName::GetHomeDir(), WHITELIST_FILE_NAME); bool exists = wlFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(wlFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open the white list file - %s"), wlFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the white list"), list->getCount()); thread->setWhiteList(list); } } wxFileName blFilename(wxFileName::GetHomeDir(), BLACKLIST_FILE_NAME); exists = blFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(blFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open the black list file - %s"), blFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the black list"), list->getCount()); thread->setBlackList(list); } } wxFileName rlFilename(wxFileName::GetHomeDir(), RESTRICT_FILE_NAME); exists = rlFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(rlFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open the restrict list file - %s"), rlFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the restrict list"), list->getCount()); thread->setRestrictList(list); } } thread->setIcomRepeaterHandler(icomRepeaterHandler); thread->setHBRepeaterHandler(hbRepeaterHandler); thread->setDummyRepeaterHandler(dummyRepeaterHandler); thread->setLanguage(language); thread->setDPlus(dplusEnabled, dplusMaxDongles, dplusLogin); thread->setDExtra(dextraEnabled, dextraMaxDongles); thread->setDCS(dcsEnabled); thread->setCCS(ccsEnabled, ccsHost); thread->setInfoEnabled(infoEnabled); thread->setEchoEnabled(echoEnabled); thread->setDTMFEnabled(dtmfEnabled); thread->setLog(logEnabled); thread->setLocation(latitude, longitude); // Convert the worker class into a thread m_thread = new CIRCDDBGatewayThreadHelper(thread); m_thread->start(); }
void CDStarRepeaterApp::createThread() { wxASSERT(m_config != NULL); wxString callsign, gateway; DSTAR_MODE mode; ACK_TYPE ack; bool restriction, rpt1Validation, dtmfBlanking, errorReply; m_config->getCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation, dtmfBlanking, errorReply); wxString modemType; m_config->getModem(modemType); // DVAP can only do simplex, force the mode accordingly if (modemType.IsSameAs("DVAP")) { if (mode == MODE_DUPLEX) { wxLogInfo("DVAP: changing mode from DUPLEX to SIMPLEX"); mode = MODE_SIMPLEX; } else if (mode == MODE_TXANDRX) { wxLogInfo("DVAP: changing mode from TX_AND_RX to RX_ONLY"); mode = MODE_RXONLY; } } // XXX This should be m_thread eventually. switch (mode) { case MODE_RXONLY: m_thread = new CDStarRepeaterRXThread(modemType); break; case MODE_TXONLY: m_thread = new CDStarRepeaterTXThread(modemType); break; case MODE_TXANDRX: m_thread = new CDStarRepeaterTXRXThread(modemType); break; default: m_thread = new CDStarRepeaterTRXThread(modemType); break; } m_thread->setCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation, dtmfBlanking, errorReply); wxLogInfo("Callsign set to \"%s\", gateway set to \"%s\", mode: %d, ack: %d, restriction: %d, RPT1 validation: %d, DTMF blanking: %d, Error reply: %d", callsign.c_str(), gateway.c_str(), int(mode), int(ack), int(restriction), int(rpt1Validation), int(dtmfBlanking), int(errorReply)); wxString gatewayAddress, localAddress, name; unsigned int gatewayPort, localPort; m_config->getNetwork(gatewayAddress, gatewayPort, localAddress, localPort, name); wxLogInfo("Gateway set to %s:%u, local set to %s:%u, name set to \"%s\"", gatewayAddress.c_str(), gatewayPort, localAddress.c_str(), localPort, name.c_str()); if (!gatewayAddress.IsEmpty()) { bool local = gatewayAddress.IsSameAs("127.0.0.1"); CRepeaterProtocolHandler* handler = new CRepeaterProtocolHandler(gatewayAddress, gatewayPort, localAddress, localPort, name); bool res = handler->open(); if (!res) wxLogError("Cannot open the protocol handler"); else m_thread->setProtocolHandler(handler, local); } unsigned int timeout, ackTime; m_config->getTimes(timeout, ackTime); m_thread->setTimes(timeout, ackTime); wxLogInfo("Timeout set to %u secs, ack time set to %u ms", timeout, ackTime); unsigned int beaconTime; wxString beaconText; bool beaconVoice; TEXT_LANG language; m_config->getBeacon(beaconTime, beaconText, beaconVoice, language); if (mode == MODE_GATEWAY) beaconTime = 0U; m_thread->setBeacon(beaconTime, beaconText, beaconVoice, language); wxLogInfo("Beacon set to %u mins, text set to \"%s\", voice set to %d, language set to %d", beaconTime / 60U, beaconText.c_str(), int(beaconVoice), int(language)); bool announcementEnabled; unsigned int announcementTime; wxString announcementRecordRPT1, announcementRecordRPT2; wxString announcementDeleteRPT1, announcementDeleteRPT2; m_config->getAnnouncement(announcementEnabled, announcementTime, announcementRecordRPT1, announcementRecordRPT2, announcementDeleteRPT1, announcementDeleteRPT2); if (mode == MODE_GATEWAY) announcementEnabled = false; m_thread->setAnnouncement(announcementEnabled, announcementTime, announcementRecordRPT1, announcementRecordRPT2, announcementDeleteRPT1, announcementDeleteRPT2); wxLogInfo("Announcement enabled: %d, time: %u mins, record RPT1: \"%s\", record RPT2: \"%s\", delete RPT1: \"%s\", delete RPT2: \"%s\"", int(announcementEnabled), announcementTime / 60U, announcementRecordRPT1.c_str(), announcementRecordRPT2.c_str(), announcementDeleteRPT1.c_str(), announcementDeleteRPT2.c_str()); wxLogInfo("Modem type set to \"%s\"", modemType.c_str()); CModem* modem = NULL; if (modemType.IsSameAs("DVAP")) { wxString port; unsigned int frequency; int power, squelch; m_config->getDVAP(port, frequency, power, squelch); wxLogInfo("DVAP: port: %s, frequency: %u Hz, power: %d dBm, squelch: %d dBm", port.c_str(), frequency, power, squelch); modem = new CDVAPController(port, frequency, power, squelch); } else if (modemType.IsSameAs("DV-RPTR V1")) { wxString port; bool rxInvert, txInvert, channel; unsigned int modLevel, txDelay; m_config->getDVRPTR1(port, rxInvert, txInvert, channel, modLevel, txDelay); wxLogInfo("DV-RPTR V1, port: %s, RX invert: %d, TX invert: %d, channel: %s, mod level: %u%%, TX delay: %u ms", port.c_str(), int(rxInvert), int(txInvert), channel ? "B" : "A", modLevel, txDelay); modem = new CDVRPTRV1Controller(port, wxEmptyString, rxInvert, txInvert, channel, modLevel, txDelay); } else if (modemType.IsSameAs("DV-RPTR V2")) { CONNECTION_TYPE connType; wxString usbPort, address; bool txInvert; unsigned int port, modLevel, txDelay; m_config->getDVRPTR2(connType, usbPort, address, port, txInvert, modLevel, txDelay); wxLogInfo("DV-RPTR V2, type: %d, address: %s:%u, TX invert: %d, mod level: %u%%, TX delay: %u ms", int(connType), address.c_str(), port, int(txInvert), modLevel, txDelay); switch (connType) { case CT_USB: modem = new CDVRPTRV2Controller(usbPort, wxEmptyString, txInvert, modLevel, mode == MODE_DUPLEX || mode == MODE_TXANDRX, callsign, txDelay); break; case CT_NETWORK: modem = new CDVRPTRV2Controller(address, port, txInvert, modLevel, mode == MODE_DUPLEX || mode == MODE_TXANDRX, callsign, txDelay); break; } } else if (modemType.IsSameAs("DV-RPTR V3")) { CONNECTION_TYPE connType; wxString usbPort, address; bool txInvert; unsigned int port, modLevel, txDelay; m_config->getDVRPTR3(connType, usbPort, address, port, txInvert, modLevel, txDelay); wxLogInfo("DV-RPTR V3, type: %d, address: %s:%u, TX invert: %d, mod level: %u%%, TX delay: %u ms", int(connType), address.c_str(), port, int(txInvert), modLevel, txDelay); switch (connType) { case CT_USB: modem = new CDVRPTRV3Controller(usbPort, wxEmptyString, txInvert, modLevel, mode == MODE_DUPLEX || mode == MODE_TXANDRX, callsign, txDelay); break; case CT_NETWORK: modem = new CDVRPTRV3Controller(address, port, txInvert, modLevel, mode == MODE_DUPLEX || mode == MODE_TXANDRX, callsign, txDelay); break; } } else if (modemType.IsSameAs("DVMEGA")) { wxString port; DVMEGA_VARIANT variant; bool rxInvert, txInvert; unsigned int txDelay, rxFrequency, txFrequency, power; m_config->getDVMEGA(port, variant, rxInvert, txInvert, txDelay, rxFrequency, txFrequency, power); wxLogInfo("DVMEGA, port: %s, variant: %d, RX invert: %d, TX invert: %d, TX delay: %u ms, rx frequency: %u Hz, tx frequency: %u Hz, power: %u %%", port.c_str(), int(variant), int(rxInvert), int(txInvert), txDelay, rxFrequency, txFrequency, power); switch (variant) { case DVMV_MODEM: modem = new CDVMegaController(port, wxEmptyString, rxInvert, txInvert, txDelay); break; case DVMV_RADIO_2M: case DVMV_RADIO_70CM: case DVMV_RADIO_2M_70CM: modem = new CDVMegaController(port, wxEmptyString, txDelay, rxFrequency, txFrequency, power); break; default: wxLogError("Unknown DVMEGA variant - %d"), int(variant); break; } } else if (modemType.IsSameAs("GMSK Modem")) { USB_INTERFACE iface; unsigned int address; m_config->getGMSK(iface, address); wxLogInfo("GMSK, interface: %d, address: %04X", int(iface), address); modem = new CGMSKController(iface, address, mode == MODE_DUPLEX || mode == MODE_TXANDRX); } else if (modemType.IsSameAs("Sound Card")) { wxString rxDevice, txDevice; bool rxInvert, txInvert; wxFloat32 rxLevel, txLevel; unsigned int txDelay, txTail; m_config->getSoundCard(rxDevice, txDevice, rxInvert, txInvert, rxLevel, txLevel, txDelay, txTail); wxLogInfo("Sound Card, devices: %s:%s, invert: %d:%d, levels: %.2f:%.2f, tx delay: %u ms, tx tail: %u ms", rxDevice.c_str(), txDevice.c_str(), int(rxInvert), int(txInvert), rxLevel, txLevel, txDelay, txTail); modem = new CSoundCardController(rxDevice, txDevice, rxInvert, txInvert, rxLevel, txLevel, txDelay, txTail); } else if (modemType.IsSameAs("MMDVM")) { wxString port; bool rxInvert, txInvert, pttInvert; unsigned int txDelay, rxLevel, txLevel; m_config->getMMDVM(port, rxInvert, txInvert, pttInvert, txDelay, rxLevel, txLevel); wxLogInfo("MMDVM, port: %s, RX invert: %d, TX invert: %d, PTT invert: %d, TX delay: %u ms, RX level: %u%%, TX level: %u%%", port.c_str(), int(rxInvert), int(txInvert), int(pttInvert), txDelay, rxLevel, txLevel); modem = new CMMDVMController(port, wxEmptyString, rxInvert, txInvert, pttInvert, txDelay, rxLevel, txLevel); } else if (modemType.IsSameAs("Split")) { wxString localAddress; unsigned int localPort; wxArrayString transmitterNames, receiverNames; unsigned int timeout; m_config->getSplit(localAddress, localPort, transmitterNames, receiverNames, timeout); wxLogInfo("Split, local: %s:%u, timeout: %u ms", localAddress.c_str(), localPort, timeout); for (unsigned int i = 0U; i < transmitterNames.GetCount(); i++) { wxString name = transmitterNames.Item(i); if (!name.IsEmpty()) wxLogInfo("\tTX %u name: %s", i + 1U, name.c_str()); } for (unsigned int i = 0U; i < receiverNames.GetCount(); i++) { wxString name = receiverNames.Item(i); if (!name.IsEmpty()) wxLogInfo("\tRX %u name: %s", i + 1U, name.c_str()); } modem = new CSplitController(localAddress, localPort, transmitterNames, receiverNames, timeout); } else { wxLogError("Unknown modem type: %s", modemType.c_str()); } if (modem != NULL) { bool res = modem->start(); if (!res) wxLogError("Cannot open the D-Star modem"); else m_thread->setModem(modem); } wxString controllerType; unsigned int portConfig, activeHangTime; bool pttInvert; m_config->getController(controllerType, portConfig, pttInvert, activeHangTime); wxLogInfo("Controller set to %s, config: %u, PTT invert: %d, active hang time: %u ms", controllerType.c_str(), portConfig, int(pttInvert), activeHangTime); CExternalController* controller = NULL; wxString port; if (controllerType.StartsWith("Velleman K8055 - ", &port)) { unsigned long num; port.ToULong(&num); controller = new CExternalController(new CK8055Controller(num), pttInvert); } else if (controllerType.StartsWith("URI USB - ", &port)) { unsigned long num; port.ToULong(&num); controller = new CExternalController(new CURIUSBController(num, true), pttInvert); } else if (controllerType.StartsWith("Serial - ", &port)) { controller = new CExternalController(new CSerialLineController(port, portConfig), pttInvert); } else if (controllerType.StartsWith("Arduino - ", &port)) { controller = new CExternalController(new CArduinoController(port), pttInvert); #if defined(GPIO) } else if (controllerType.IsSameAs("GPIO")) { controller = new CExternalController(new CGPIOController(portConfig), pttInvert); } else if (controllerType.IsSameAs(wxT("UDRC"))) { switch(portConfig) { case 1: controller = new CUDRCController(AUTO_FM); break; case 3: controller = new CUDRCController(DIGITAL_DIGITAL); break; case 4: controller = new CUDRCController(FM_FM); break; case 5: controller = new CUDRCController(HOTSPOT); break; default: case 2: controller = new CUDRCController(AUTO_AUTO); break; } #endif } else { wxLogError("Unrecognized controller %s, using dummy controller", controllerType); controller = new CExternalController(new CDummyController, pttInvert); } bool res = controller->open(); if (!res) wxLogError("Cannot open the hardware interface - %s", controllerType.c_str()); else m_thread->setController(controller, activeHangTime); bool out1, out2, out3, out4; m_config->getOutputs(out1, out2, out3, out4); m_thread->setOutputs(out1, out2, out3, out4); #if (wxUSE_GUI == 1) m_frame->setOutputs(out1, out2, out3, out4); #endif wxLogInfo("Output 1 = %d, output 2 = %d, output 3 = %d, output 4 = %d", int(out1), int(out2), int(out3), int(out4)); bool enabled; wxString rpt1Callsign, rpt2Callsign; wxString shutdown, startup; // XXX Initialization should be temporary until we get them coming // from m_config->getControl wxArrayString status; status.Add("", 5); wxArrayString command; command.Add("", 6); wxArrayString output; output.Add("", 4); m_config->getControl(enabled, rpt1Callsign, rpt2Callsign, shutdown, startup, status[0], status[1], status[2], status[3], status[4], command[0], m_commandLine[0], command[1], m_commandLine[1], command[2], m_commandLine[2], command[3], m_commandLine[3], command[4], m_commandLine[4], command[5], m_commandLine[5], output[0], output[1], output[2], output[3]); m_thread->setControl(enabled, rpt1Callsign, rpt2Callsign, shutdown, startup, command, status, output); wxLogInfo(wxT("Control: enabled: %d, RPT1: %s, RPT2: %s, shutdown: %s, startup: %s, status1: %s, status2: %s, status3: %s, status4: %s, status5: %s, command1: %s = %s, command2: %s = %s, command3: %s = %s, command4: %s = %s, command5: %s = %s, command6: %s = %s, output1: %s, output2: %s, output3: %s, output4: %s"), enabled, rpt1Callsign.c_str(), rpt2Callsign.c_str(), shutdown.c_str(), startup.c_str(), status[0].c_str(), status[1].c_str(), status[2].c_str(), status[3].c_str(), status[4].c_str(), command[0].c_str(), m_commandLine[0].c_str(), command[1].c_str(), m_commandLine[1].c_str(), command[2].c_str(), m_commandLine[2].c_str(), command[3].c_str(), m_commandLine[3].c_str(), command[4].c_str(), m_commandLine[4].c_str(), command[5].c_str(), m_commandLine[5].c_str(), output[0].c_str(), output[1].c_str(), output[2].c_str(), output[3].c_str()); bool logging; m_config->getLogging(logging); m_thread->setLogging(logging, m_audioDir); #if (wxUSE_GUI == 1) m_frame->setLogging(logging); #endif wxLogInfo("Frame logging set to %d, in %s", int(logging), m_audioDir.c_str()); #if defined(__WINDOWS__) wxFileName wlFilename(wxFileName::GetHomeDir(), PRIMARY_WHITELIST_FILE_NAME); #else wxFileName wlFilename(CONF_DIR, PRIMARY_WHITELIST_FILE_NAME); #endif bool exists = wlFilename.FileExists(); if (!exists) { #if defined(__WINDOWS__) wlFilename.Assign(wxFileName::GetHomeDir(), SECONDARY_WHITELIST_FILE_NAME); #else wlFilename.Assign(CONF_DIR, SECONDARY_WHITELIST_FILE_NAME); #endif exists = wlFilename.FileExists(); } if (exists) { CCallsignList* list = new CCallsignList(wlFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError("Unable to open white list file - %s", wlFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo("%u callsigns loaded into the white list", list->getCount()); m_thread->setWhiteList(list); } } #if defined(__WINDOWS__) wxFileName blFilename(wxFileName::GetHomeDir(), PRIMARY_BLACKLIST_FILE_NAME); #else wxFileName blFilename(CONF_DIR, PRIMARY_BLACKLIST_FILE_NAME); #endif exists = blFilename.FileExists(); if (!exists) { #if defined(__WINDOWS__) blFilename.Assign(wxFileName::GetHomeDir(), SECONDARY_BLACKLIST_FILE_NAME); #else blFilename.Assign(CONF_DIR, SECONDARY_BLACKLIST_FILE_NAME); #endif exists = blFilename.FileExists(); } if (exists) { CCallsignList* list = new CCallsignList(blFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError("Unable to open black list file - %s", blFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo("%u callsigns loaded into the black list", list->getCount()); m_thread->setBlackList(list); } } #if defined(__WINDOWS__) wxFileName glFilename(wxFileName::GetHomeDir(), GREYLIST_FILE_NAME); #else wxFileName glFilename(CONF_DIR, GREYLIST_FILE_NAME); #endif exists = glFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(glFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError("Unable to open grey list file - %s", glFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo("%u callsigns loaded into the grey list", list->getCount()); m_thread->setGreyList(list); } } m_thread->Create(); m_thread->SetPriority(wxPRIORITY_MAX); m_thread->Run(); }
void CSoundCardRepeaterApp::createThread() { wxString callsign, gateway; DSTAR_MODE mode; ACK_TYPE ack; bool restriction, rpt1Validation; getCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation); switch (mode) { case MODE_RXONLY: m_thread = new CSoundCardRepeaterRXThread; break; case MODE_TXONLY: m_thread = new CSoundCardRepeaterTXThread; break; case MODE_TXANDRX: m_thread = new CSoundCardRepeaterTXRXThread; break; default: m_thread = new CSoundCardRepeaterTRXThread; break; } m_thread->setCallsign(callsign, gateway, mode, ack, restriction, rpt1Validation); wxLogInfo(wxT("Callsign set to \"%s\", gateway set to \"%s\", mode: %d, ack: %d, restriction: %d, RPT1 validation: %d"), callsign.c_str(), gateway.c_str(), int(mode), int(ack), restriction, rpt1Validation); wxString gatewayAddress, localAddress; unsigned int gatewayPort, localPort; getNetwork(gatewayAddress, gatewayPort, localAddress, localPort); wxLogInfo(wxT("Gateway set to %s:%u, local set to %s:%u"), gatewayAddress.c_str(), gatewayPort, localAddress.c_str(), localPort); if (!gatewayAddress.IsEmpty()) { CRepeaterProtocolHandler* handler = new CRepeaterProtocolHandler(gatewayAddress, gatewayPort, localAddress, localPort); bool res = handler->open(); if (!res) wxLogError(wxT("Cannot open the protocol handler")); else m_thread->setProtocolHandler(handler); } unsigned int timeout, ackTime, hangTime; getTimes(timeout, ackTime, hangTime); m_thread->setTimes(timeout, ackTime, hangTime); wxLogInfo(wxT("Timeout set to %u secs, Ack time set to %u ms, Hang time set to %u ms"), timeout, ackTime, hangTime); unsigned int beaconTime; wxString beaconText; bool beaconVoice; TEXT_LANG language; getBeacon(beaconTime, beaconText, beaconVoice, language); m_thread->setBeacon(beaconTime, beaconText, beaconVoice, language); wxLogInfo(wxT("Beacon set to %u mins, text set to \"%s\", voice set to %d, language set to %d"), beaconTime / 60U, beaconText.c_str(), int(beaconVoice), int(language)); wxString readDevice, writeDevice; bool rxInvert, txInvert; wxFloat32 rxLevel, txLevel, squelchLevel; SQUELCH_MODE squelchMode; getRadio(readDevice, writeDevice, rxLevel, txLevel, squelchMode, squelchLevel, rxInvert, txInvert); wxLogInfo(wxT("Soundcard set to %s:%s, levels: %.2f:%.2f, GMSK Inversion set to %d:%d, squelch: mode: %d level: %.2f"), readDevice.c_str(), writeDevice.c_str(), rxLevel, txLevel, rxInvert, txInvert, int(squelchMode), squelchLevel); if (!readDevice.IsEmpty() && !writeDevice.IsEmpty()) { #if defined(__WINDOWS__) CSoundCardReaderWriter* soundcard = new CSoundCardReaderWriter(readDevice, writeDevice, DSTAR_RADIO_SAMPLE_RATE, DSTAR_RADIO_BLOCK_SIZE); #else CSoundCardReaderWriter* soundcard = new CSoundCardReaderWriter(readDevice, writeDevice, DSTAR_RADIO_SAMPLE_RATE, 64U); #endif soundcard->setCallback(m_thread, 0U); bool res = soundcard->open(); if (!res) wxLogError(wxT("Cannot open the sound card")); else m_thread->setSoundCard(soundcard, rxLevel, txLevel, squelchMode, squelchLevel, rxInvert, txInvert); } wxString type; unsigned int cfg; int pttDelay; bool pttInvert; getController(type, cfg, pttDelay, pttInvert); wxLogInfo(wxT("Controller set to %s, config: %u, ptt delay: %d ms, PTT Inversion set to %d"), type.c_str(), cfg, pttDelay * 20, pttInvert); CExternalController* controller = NULL; wxString port; if (type.StartsWith(wxT("Velleman K8055 - "), &port)) { unsigned long num; port.ToULong(&num); controller = new CExternalController(new CK8055Controller(num), pttInvert, false); } else if (type.StartsWith(wxT("URI USB - "), &port)) { unsigned long num; port.ToULong(&num); controller = new CExternalController(new CURIUSBController(num, false), pttInvert, false); } else if (type.StartsWith(wxT("Serial - "), &port)) { controller = new CExternalController(new CSerialController(port, cfg), pttInvert, false); } else { controller = new CExternalController(new CDummyController, pttInvert, false); } bool res = controller->open(); if (!res) wxLogError(wxT("Cannot open the hardware interface - %s"), type.c_str()); else m_thread->setController(controller, pttDelay); bool out1, out2, out3, out4; getOutputs(out1, out2, out3, out4); m_thread->setOutputs(out1, out2, out3, out4); m_frame->setOutputs(out1, out2, out3, out4); wxLogInfo(wxT("Output 1 = %d, output 2 = %d, output 3 = %d, output 4 = %d"), out1, out2, out3, out4); bool enabled; wxString rpt1Callsign, rpt2Callsign; wxString shutdown, startup; wxString status1, status2, status3, status4, status5; wxString command1, command1Line, command2, command2Line; wxString command3, command3Line, command4, command4Line; wxString output1, output2, output3, output4; getControl(enabled, rpt1Callsign, rpt2Callsign, shutdown, startup, status1, status2, status3, status4, status5, command1, command1Line, command2, command2Line, command3, command3Line, command4, command4Line, output1, output2, output3, output4); m_thread->setControl(enabled, rpt1Callsign, rpt2Callsign, shutdown, startup, status1, status2, status3, status4, status5, command1, command1Line, command2, command2Line, command3, command3Line, command4, command4Line, output1, output2, output3, output4); wxLogInfo(wxT("Control: enabled: %d, RPT1: %s, RPT2: %s, shutdown: %s, startup: %s, status1: %s, status2: %s, status3: %s, status4: %s, status5: %s, command1: %s = %s, command2: %s = %s, command3: %s = %s, command4: %s = %s, output1: %s, output2: %s, output3: %s, output4: %s"), enabled, rpt1Callsign.c_str(), rpt2Callsign.c_str(), shutdown.c_str(), startup.c_str(), status1.c_str(), status2.c_str(), status3.c_str(), status4.c_str(), status5.c_str(), command1.c_str(), command1Line.c_str(), command2.c_str(), command2Line.c_str(), command1.c_str(), command1Line.c_str(), command2.c_str(), command2Line.c_str(), command3.c_str(), command3Line.c_str(), command4.c_str(), command4Line.c_str(), output1.c_str(), output2.c_str(), output3.c_str(), output4.c_str()); unsigned int activeHangTime; getActiveHang(activeHangTime); m_thread->setActiveHang(activeHangTime); wxLogInfo(wxT("Active Hang: time: %u"), activeHangTime); bool logging; getLogging(logging); m_thread->setLogging(logging, ::wxGetHomeDir()); m_frame->setLogging(logging); wxLogInfo(wxT("Frame logging set to %d, in %s"), int(logging), ::wxGetHomeDir().c_str()); wxFileName wlFilename(wxFileName::GetHomeDir(), WHITELIST_FILE_NAME); bool exists = wlFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(wlFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open white list file - %s"), wlFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the white list"), list->getCount()); m_thread->setWhiteList(list); } } wxFileName blFilename(wxFileName::GetHomeDir(), BLACKLIST_FILE_NAME); exists = blFilename.FileExists(); if (exists) { CCallsignList* list = new CCallsignList(blFilename.GetFullPath()); bool res = list->load(); if (!res) { wxLogError(wxT("Unable to open black list file - %s"), blFilename.GetFullPath().c_str()); delete list; } else { wxLogInfo(wxT("%u callsigns loaded into the black list"), list->getCount()); m_thread->setBlackList(list); } } m_thread->start(); }