Skip to content

Commit

Permalink
Repeat text and callsign
Browse files Browse the repository at this point in the history
  • Loading branch information
kantooon committed Dec 4, 2017
1 parent 6e0a2bb commit b72d0c9
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 51 deletions.
95 changes: 50 additions & 45 deletions gr/gr_modem.cpp
Expand Up @@ -290,20 +290,20 @@ void gr_modem::setRepeater(bool value)
_repeater = value;
}

void gr_modem::sendCallsign(int size, QString callsign)
void gr_modem::sendCallsign(QString callsign)
{
std::vector<unsigned char> *send_callsign = new std::vector<unsigned char>;
QVector<std::vector<unsigned char>*> callsign_frames;

send_callsign->push_back(0x8C);
send_callsign->push_back(0xC8);
send_callsign->push_back(0xDD);
for(int i = 0;i<size;i++)
for(int i = 0;i<callsign.size();i++)
{
send_callsign->push_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);
}
Expand All @@ -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<unsigned char> *tx_start = new std::vector<unsigned char>;
Expand All @@ -325,14 +325,14 @@ void gr_modem::startTransmission(QString callsign, int size)
QVector<std::vector<unsigned char>*> 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<unsigned char> *tx_end = new std::vector<unsigned char>;
tx_end->push_back(0x4C);
tx_end->push_back(0x8A);
Expand All @@ -355,6 +355,30 @@ void gr_modem::processAudioData(unsigned char *data, int size)
delete[] data;
}

void gr_modem::textData(QString text)
{
QStringList list;
QVector<std::vector<unsigned char>*> frames;
for( int k=0;k<text.length();k+=_frame_length)
{
list.append(text.mid(k,_frame_length));
}

for(int o = 0;o < list.length();o++)
{
QString chunk=list.at(o);
unsigned char *data = new unsigned char[_frame_length];
memset(data, 0, _frame_length);
memcpy(data,chunk.toStdString().c_str(),chunk.length());
std::vector<unsigned char> *one_frame = frame(data,_frame_length, FrameTypeText);

frames.append(one_frame);

delete[] data;
}
transmit(frames);
}

void gr_modem::processPCMAudio(std::vector<float> *audio_data)
{

Expand Down Expand Up @@ -465,31 +489,6 @@ std::vector<unsigned char>* gr_modem::frame(unsigned char *encoded_audio, int da

}

void gr_modem::textData(QString text)
{
QStringList list;
QVector<std::vector<unsigned char>*> frames;
for( int k=0;k<text.length();k+=_frame_length)
{
list.append(text.mid(k,_frame_length));
}

for(int o = 0;o < list.length();o++)
{
QString chunk=list.at(o);
unsigned char *data = new unsigned char[_frame_length];
memset(data, 0, _frame_length);
memcpy(data,chunk.toStdString().c_str(),chunk.length());
std::vector<unsigned char> *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)
Expand Down Expand Up @@ -637,15 +636,6 @@ void gr_modem::synchronize(int v_size, std::vector<unsigned char> *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;
Expand Down Expand Up @@ -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)
Expand All @@ -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 )
Expand All @@ -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 )
Expand All @@ -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;
}
Expand Down
6 changes: 3 additions & 3 deletions gr/gr_modem.h
Expand Up @@ -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<float>* pcm);
void digitalAudio(unsigned char *c2data, int size);
Expand All @@ -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);
Expand Down
7 changes: 4 additions & 3 deletions radioop.cpp
Expand Up @@ -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);
}
}

Expand All @@ -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)))
{
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit b72d0c9

Please sign in to comment.