Fix bug at Morse debug source block

The Morse decoder seems that works properly now. However, there is no
recovery strategy yet from undecodeable symbol sequences.
This commit is contained in:
Manolis Surligas 2016-01-23 22:23:19 +02:00
parent ebd07215d0
commit 52411357a7
5 changed files with 68 additions and 36 deletions

View File

@ -148,7 +148,7 @@
</param> </param>
<param> <param>
<key>debug_seq</key> <key>debug_seq</key>
<value>"HELLO WORLD"</value> <value>"HELLO EARTH WORLD"</value>
</param> </param>
</block> </block>
<block> <block>

View File

@ -80,6 +80,10 @@ namespace gr
received_symbol (morse_symbol_t s); received_symbol (morse_symbol_t s);
std::string std::string
get_word (); get_word ();
size_t
get_max_word_len () const;
size_t
get_word_len ();
private: private:
const char d_unrecognized_symbol; const char d_unrecognized_symbol;

View File

@ -84,7 +84,7 @@ namespace gr {
size_t len = sentence.length(); size_t len = sentence.length();
pmt::pmt_t port = pmt::mp("out"); pmt::pmt_t port = pmt::mp("out");
std::this_thread::sleep_for(std::chrono::milliseconds(1000)); std::this_thread::sleep_for(std::chrono::milliseconds(2000));
while(d_run) { while(d_run) {
/* Not the best approach, but hey, this is only for debug */ /* Not the best approach, but hey, this is only for debug */
for(i = 0; i < len; i++){ for(i = 0; i < len; i++){
@ -103,12 +103,15 @@ namespace gr {
else{ else{
message_port_pub(port, pmt::from_long(MORSE_DASH)); message_port_pub(port, pmt::from_long(MORSE_DASH));
} }
/* Send also a character delimiter after waiting a little */ std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::this_thread::sleep_for(std::chrono::milliseconds(400));
message_port_pub(port, pmt::from_long(MORSE_S_SPACE));
} }
/* Send also a character delimiter after waiting a little */
std::this_thread::sleep_for(std::chrono::milliseconds(200));
message_port_pub(port, pmt::from_long(MORSE_S_SPACE));
} }
} }
message_port_pub(port, pmt::from_long(MORSE_L_SPACE));
std::this_thread::sleep_for(std::chrono::milliseconds(1000)); std::this_thread::sleep_for(std::chrono::milliseconds(1000));
} }
} }

View File

@ -40,24 +40,45 @@ namespace gr
void void
morse_decoder_impl::symbol_msg_handler (pmt::pmt_t msg) morse_decoder_impl::symbol_msg_handler (pmt::pmt_t msg)
{ {
bool res;
std::string str;
morse_symbol_t s; morse_symbol_t s;
s = (morse_symbol_t) pmt::to_long (msg); s = (morse_symbol_t) pmt::to_long (msg);
switch(s) { switch(s) {
case MORSE_DOT: case MORSE_DOT:
LOG_DEBUG("Dot received");
break;
case MORSE_DASH: case MORSE_DASH:
LOG_DEBUG("Dash received");
break;
case MORSE_S_SPACE: case MORSE_S_SPACE:
LOG_DEBUG("Short space received"); LOG_DEBUG("Received %d", s);
res = d_morse_tree.received_symbol(s);
break; break;
/*
* If a word separator occurs it is a good time to retrieve the decoded
* word
*/
case MORSE_L_SPACE: case MORSE_L_SPACE:
LOG_DEBUG("Long space received"); str = d_morse_tree.get_word();
d_morse_tree.reset();
std::cout << "Received word: " << str << std::endl;
break; break;
default: default:
LOG_ERROR("Unknown Morse symbol"); LOG_ERROR("Unknown Morse symbol");
return;
}
/*
* If the decoding return false, it means that either an non decode-able
* character situation occurred or the maximum word limit reached
*/
if (!s) {
if(d_morse_tree.get_max_word_len() == d_morse_tree.get_word_len()){
str = d_morse_tree.get_word();
d_morse_tree.reset();
std::cout << "Received word: " << str << std::endl;
}
}
else{
LOG_DEBUG("Something went wrong");
} }
} }

View File

@ -41,7 +41,7 @@ namespace gr
d_current (d_root), d_current (d_root),
d_buff_len(4096), d_buff_len(4096),
d_word_len(0), d_word_len(0),
d_word_buffer(new char(d_buff_len)) d_word_buffer(new char[d_buff_len])
{ {
construct_tree (); construct_tree ();
} }
@ -57,7 +57,7 @@ namespace gr
d_current (d_root), d_current (d_root),
d_buff_len(4096), d_buff_len(4096),
d_word_len(0), d_word_len(0),
d_word_buffer(new char(d_buff_len)) d_word_buffer(new char[d_buff_len])
{ {
construct_tree (); construct_tree ();
} }
@ -197,6 +197,7 @@ namespace gr
morse_tree::received_symbol (morse_symbol_t s) morse_tree::received_symbol (morse_symbol_t s)
{ {
char c = 0; char c = 0;
bool ret = false;
/* Check for overflow */ /* Check for overflow */
if (d_word_len == d_buff_len) { if (d_word_len == d_buff_len) {
return false; return false;
@ -206,48 +207,51 @@ namespace gr
case MORSE_DOT: case MORSE_DOT:
if (d_current->get_left_child ()) { if (d_current->get_left_child ()) {
d_current = d_current->get_left_child (); d_current = d_current->get_left_child ();
c = d_current->get_char (); ret = true;
}
/*
* There is no left child. Something went wrong. Let the caller decide
*/
else {
return false;
} }
break; break;
case MORSE_DASH: case MORSE_DASH:
if (d_current->get_right_child ()) { if (d_current->get_right_child ()) {
d_current = d_current->get_right_child (); d_current = d_current->get_right_child ();
c = d_current->get_char (); ret = true;
} }
break;
case MORSE_S_SPACE:
c = d_current->get_char ();
d_current = d_root;
/* /*
* There is no right child. Something went wrong. * Some nodes are null transitions and do not correspond to
* Let the caller decide * a specific character
*/ */
else { if (c != 0) {
return false; d_word_buffer[d_word_len] = c;
d_word_len++;
ret = true;
} }
break; break;
default: default:
LOG_ERROR("Unsupported Morse symbol"); LOG_ERROR("Unsupported Morse symbol");
return false; return false;
} }
return ret;
/*
* Some nodes are null transitions and do not correspond to
* a specific character
*/
if (c != 0) {
d_word_buffer[d_word_len] = c;
d_word_len++;
}
return true;
} }
std::string std::string
morse_tree::get_word () morse_tree::get_word ()
{ {
return std::string(d_word_buffer.get(), d_buff_len); return std::string(d_word_buffer.get(), d_word_len);
}
size_t
morse_tree::get_max_word_len () const
{
return d_buff_len;
}
size_t
morse_tree::get_word_len ()
{
return d_word_len;
} }
void void