diff --git a/examples/test_morse_decoder.grc b/examples/test_morse_decoder.grc
index 4fd0e55..23d9000 100644
--- a/examples/test_morse_decoder.grc
+++ b/examples/test_morse_decoder.grc
@@ -148,7 +148,7 @@
debug_seq
- "HELLO WORLD"
+ "HELLO EARTH WORLD"
diff --git a/include/satnogs/morse_tree.h b/include/satnogs/morse_tree.h
index 47a5a10..b879012 100644
--- a/include/satnogs/morse_tree.h
+++ b/include/satnogs/morse_tree.h
@@ -80,6 +80,10 @@ namespace gr
received_symbol (morse_symbol_t s);
std::string
get_word ();
+ size_t
+ get_max_word_len () const;
+ size_t
+ get_word_len ();
private:
const char d_unrecognized_symbol;
diff --git a/lib/morse_debug_source_impl.cc b/lib/morse_debug_source_impl.cc
index ceb59e6..1808b48 100644
--- a/lib/morse_debug_source_impl.cc
+++ b/lib/morse_debug_source_impl.cc
@@ -84,7 +84,7 @@ namespace gr {
size_t len = sentence.length();
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) {
/* Not the best approach, but hey, this is only for debug */
for(i = 0; i < len; i++){
@@ -103,12 +103,15 @@ namespace gr {
else{
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(400));
- message_port_pub(port, pmt::from_long(MORSE_S_SPACE));
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
+
+ /* 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));
}
}
diff --git a/lib/morse_decoder_impl.cc b/lib/morse_decoder_impl.cc
index 8b21600..fc014b5 100644
--- a/lib/morse_decoder_impl.cc
+++ b/lib/morse_decoder_impl.cc
@@ -40,24 +40,45 @@ namespace gr
void
morse_decoder_impl::symbol_msg_handler (pmt::pmt_t msg)
{
+ bool res;
+ std::string str;
morse_symbol_t s;
s = (morse_symbol_t) pmt::to_long (msg);
switch(s) {
case MORSE_DOT:
- LOG_DEBUG("Dot received");
- break;
case MORSE_DASH:
- LOG_DEBUG("Dash received");
- break;
case MORSE_S_SPACE:
- LOG_DEBUG("Short space received");
+ LOG_DEBUG("Received %d", s);
+ res = d_morse_tree.received_symbol(s);
break;
+ /*
+ * If a word separator occurs it is a good time to retrieve the decoded
+ * word
+ */
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;
default:
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");
}
}
diff --git a/lib/morse_tree.cc b/lib/morse_tree.cc
index ebeeed9..9d65eaa 100644
--- a/lib/morse_tree.cc
+++ b/lib/morse_tree.cc
@@ -41,7 +41,7 @@ namespace gr
d_current (d_root),
d_buff_len(4096),
d_word_len(0),
- d_word_buffer(new char(d_buff_len))
+ d_word_buffer(new char[d_buff_len])
{
construct_tree ();
}
@@ -57,7 +57,7 @@ namespace gr
d_current (d_root),
d_buff_len(4096),
d_word_len(0),
- d_word_buffer(new char(d_buff_len))
+ d_word_buffer(new char[d_buff_len])
{
construct_tree ();
}
@@ -197,6 +197,7 @@ namespace gr
morse_tree::received_symbol (morse_symbol_t s)
{
char c = 0;
+ bool ret = false;
/* Check for overflow */
if (d_word_len == d_buff_len) {
return false;
@@ -206,48 +207,51 @@ namespace gr
case MORSE_DOT:
if (d_current->get_left_child ()) {
d_current = d_current->get_left_child ();
- c = d_current->get_char ();
- }
- /*
- * There is no left child. Something went wrong. Let the caller decide
- */
- else {
- return false;
+ ret = true;
}
break;
case MORSE_DASH:
if (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.
- * Let the caller decide
+ * Some nodes are null transitions and do not correspond to
+ * a specific character
*/
- else {
- return false;
+ if (c != 0) {
+ d_word_buffer[d_word_len] = c;
+ d_word_len++;
+ ret = true;
}
break;
default:
LOG_ERROR("Unsupported Morse symbol");
return false;
}
-
- /*
- * 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;
+ return ret;
}
std::string
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