diff --git a/gr/gr_modem.cpp b/gr/gr_modem.cpp index 58ad2a04..01ab7830 100644 --- a/gr/gr_modem.cpp +++ b/gr/gr_modem.cpp @@ -290,7 +290,7 @@ void gr_modem::setRepeater(bool value) _repeater = value; } -void gr_modem::sendCallsign(int size, QString callsign) +void gr_modem::sendCallsign(QString callsign) { std::vector *send_callsign = new std::vector; QVector*> callsign_frames; @@ -298,12 +298,12 @@ void gr_modem::sendCallsign(int size, QString callsign) send_callsign->push_back(0x8C); send_callsign->push_back(0xC8); send_callsign->push_back(0xDD); - for(int i = 0;ipush_back(callsign.toStdString().c_str()[i]); } - for(int i = 0;i<_frame_length-size;i++) + for(int i = 0;i<_frame_length-callsign.size();i++) { send_callsign->push_back(0x00); } @@ -313,7 +313,7 @@ void gr_modem::sendCallsign(int size, QString callsign) transmit(callsign_frames); } -void gr_modem::startTransmission(QString callsign, int size) +void gr_modem::startTransmission(QString callsign) { _transmitting = true; std::vector *tx_start = new std::vector; @@ -325,14 +325,14 @@ void gr_modem::startTransmission(QString callsign, int size) QVector*> frames; frames.append(tx_start); transmit(frames); - sendCallsign(size, callsign); + sendCallsign(callsign); } -void gr_modem::endTransmission(QString callsign, int size) +void gr_modem::endTransmission(QString callsign) { _frame_counter = 0; _transmitting = false; - sendCallsign(size, callsign); + sendCallsign(callsign); std::vector *tx_end = new std::vector; tx_end->push_back(0x4C); tx_end->push_back(0x8A); @@ -355,6 +355,30 @@ void gr_modem::processAudioData(unsigned char *data, int size) delete[] data; } +void gr_modem::textData(QString text) +{ + QStringList list; + QVector*> frames; + for( int k=0;k *one_frame = frame(data,_frame_length, FrameTypeText); + + frames.append(one_frame); + + delete[] data; + } + transmit(frames); +} + void gr_modem::processPCMAudio(std::vector *audio_data) { @@ -465,31 +489,6 @@ std::vector* gr_modem::frame(unsigned char *encoded_audio, int da } -void gr_modem::textData(QString text) -{ - QStringList list; - QVector*> frames; - for( int k=0;k *one_frame = frame(data,_frame_length, FrameTypeText); - - frames.append(one_frame); - - delete[] data; - } - transmit(frames); - endTransmission("",0); -} - static void packBytes(unsigned char *pktbuf, const unsigned char *bitbuf, int bitcount) { for(int i = 0; i < bitcount; i += 8) @@ -637,15 +636,6 @@ void gr_modem::synchronize(int v_size, std::vector *data) unsigned char *frame_data = new unsigned char[frame_length]; packBytes(frame_data,_bit_buf,_bit_buf_index); - if(_repeater && (_current_frame_type == gr_modem::FrameTypeVoice)) - { - unsigned char *repeated_frame = new unsigned char[frame_length]; - if(_modem_type_rx == gr_modem_types::ModemTypeBPSK1000) - memcpy(repeated_frame, frame_data, _frame_length); - else - memcpy(repeated_frame, frame_data+1, _frame_length); // take into account reserved data - processAudioData(repeated_frame, frame_length); // TODO: clean up - } processReceivedData(frame_data, _current_frame_type); _sync_found = false; _shift_reg = 0; @@ -730,8 +720,12 @@ void gr_modem::processReceivedData(unsigned char *received_data, int current_fra break; } } - - emit textReceived( QString::fromLocal8Bit(text_data,string_length)); + QString text = QString::fromLocal8Bit(text_data,string_length); + if(_repeater) + { + textData(text); + } + emit textReceived(text); delete[] text_data; } else if (current_frame_type == FrameTypeCallsign) @@ -750,8 +744,12 @@ void gr_modem::processReceivedData(unsigned char *received_data, int current_fra string_length--; } } - - emit callsignReceived( QString::fromLocal8Bit(text_data,string_length)); + QString callsign = QString::fromLocal8Bit(text_data,string_length); + if(_repeater) + { + sendCallsign(callsign); + } + emit callsignReceived(callsign); delete[] text_data; } else if (current_frame_type == FrameTypeVoice ) @@ -764,6 +762,12 @@ void gr_modem::processReceivedData(unsigned char *received_data, int current_fra memcpy(codec2_data, received_data, _frame_length); else memcpy(codec2_data, received_data+1, _frame_length); + if(_repeater) + { + unsigned char *repeated_frame = new unsigned char[_frame_length]; + memcpy(repeated_frame, codec2_data, _frame_length); + processAudioData(repeated_frame, _frame_length); + } emit digitalAudio(codec2_data,_frame_length); } else if (current_frame_type == FrameTypeVideo ) @@ -781,6 +785,7 @@ void gr_modem::processReceivedData(unsigned char *received_data, int current_fra unsigned char *net_data = new unsigned char[_frame_length]; memcpy(net_data, received_data, _frame_length); emit netData(net_data,_frame_length); + // poke repeater here } delete[] received_data; } diff --git a/gr/gr_modem.h b/gr/gr_modem.h index 41b7c80e..a96c8d18 100644 --- a/gr/gr_modem.h +++ b/gr/gr_modem.h @@ -88,7 +88,7 @@ class gr_modem : public QObject long _requested_frequency_hz; void demodulateAnalog(); - void sendCallsign(int size, QString callsign); + void sendCallsign(QString callsign); signals: void pcmAudio(std::vector* pcm); void digitalAudio(unsigned char *c2data, int size); @@ -108,8 +108,8 @@ public slots: void processVideoData(unsigned char *data, int size); void processNetData(unsigned char *data, int size); void demodulate(); - void startTransmission(QString callsign, int size); - void endTransmission(QString callsign, int size); + void startTransmission(QString callsign); + void endTransmission(QString callsign); void textData(QString text); void initTX(int modem_type, std::string device_args, std::string device_antenna, int freq_corr); void initRX(int modem_type, std::string device_args, std::string device_antenna, int freq_corr); diff --git a/radioop.cpp b/radioop.cpp index 00917026..4e9da0c5 100644 --- a/radioop.cpp +++ b/radioop.cpp @@ -377,7 +377,7 @@ void RadioOp::startTx() _modem->tuneTx(_tune_center_freq + _tune_shift_freq); _tx_modem_started = false; if(_tx_radio_type == radio_type::RADIO_TYPE_DIGITAL) - _modem->startTransmission(_callsign,_callsign.size()); + _modem->startTransmission(_callsign); } } @@ -386,7 +386,7 @@ void RadioOp::stopTx() if(_tx_inited) { if(_tx_radio_type == radio_type::RADIO_TYPE_DIGITAL) - _modem->endTransmission(_callsign, _callsign.size()); + _modem->endTransmission(_callsign); if((_tx_radio_type == radio_type::RADIO_TYPE_ANALOG) && ((_tx_mode == gr_modem_types::ModemTypeNBFM2500) || (_tx_mode == gr_modem_types::ModemTypeNBFM5000))) { @@ -500,8 +500,9 @@ void RadioOp::run() startTx(); } _tx_modem_started = true; - _modem->startTransmission(_callsign,_callsign.size()); + _modem->startTransmission(_callsign); _modem->textData(_text_out); + _modem->endTransmission(_callsign); } if(!_repeat_text) {