Added options to print frame number and A5 frame count in message printer. Issue #127
diff --git a/lib/misc_utils/message_printer_impl.cc b/lib/misc_utils/message_printer_impl.cc
index 2599f65..1da65e9 100644
--- a/lib/misc_utils/message_printer_impl.cc
+++ b/lib/misc_utils/message_printer_impl.cc
@@ -28,6 +28,9 @@
 #include <stdio.h>
 #include "message_printer_impl.h"
 #include "grgsm/gsmtap.h"
+extern "C" {
+    #include <osmocom/gsm/a5.h>
+}
 
 namespace gr {
   namespace gsm {
@@ -37,10 +40,30 @@
         pmt::pmt_t message_plus_header_blob = pmt::cdr(msg);
         uint8_t * message_plus_header = (uint8_t *)pmt::blob_data(message_plus_header_blob);
         size_t message_plus_header_len=pmt::blob_length(message_plus_header_blob);
-        
         gsmtap_hdr * header = (gsmtap_hdr *)message_plus_header;
+        uint32_t frame_nr = be32toh(header->frame_number);
         
         std::cout << d_prepend_string;
+        if (d_prepend_fnr)
+        {
+            std::cout << frame_nr;
+        }
+
+        if (d_prepend_fnr && d_prepend_frame_count)
+        {
+            std::cout << " ";
+        }
+
+        if (d_prepend_frame_count)
+        {
+            // calculate fn count using libosmogsm
+            std::cout << osmo_a5_fn_count(frame_nr);
+        }
+
+        if (d_prepend_fnr || d_prepend_frame_count)
+        {
+            std::cout << ": ";
+        }
         
         int start_index = sizeof(gsmtap_hdr);
         
@@ -57,21 +80,26 @@
     }
 
     message_printer::sptr
-    message_printer::make(pmt::pmt_t prepend_string, bool print_gsmtap_header)
+    message_printer::make(pmt::pmt_t prepend_string, bool prepend_fnr,
+        bool prepend_frame_count, bool print_gsmtap_header)
     {
       return gnuradio::get_initial_sptr
-        (new message_printer_impl(prepend_string, print_gsmtap_header));
+        (new message_printer_impl(prepend_string, prepend_fnr,
+            prepend_frame_count, print_gsmtap_header));
     }
 
     /*
      * The private constructor
      */
-    message_printer_impl::message_printer_impl(pmt::pmt_t prepend_string, bool print_gsmtap_header)
+    message_printer_impl::message_printer_impl(pmt::pmt_t prepend_string, bool prepend_fnr,
+        bool prepend_frame_count, bool print_gsmtap_header)
       : gr::block("message_printer",
               gr::io_signature::make(0, 0, 0),
               gr::io_signature::make(0, 0, 0))
     {
         d_prepend_string = prepend_string;
+        d_prepend_fnr = prepend_fnr;
+        d_prepend_frame_count = prepend_frame_count;
         d_print_gsmtap_header = print_gsmtap_header;
         message_port_register_in(pmt::mp("msgs"));
         set_msg_handler(pmt::mp("msgs"), boost::bind(&message_printer_impl::message_print, this, _1));
diff --git a/lib/misc_utils/message_printer_impl.h b/lib/misc_utils/message_printer_impl.h
index e44288b..86d27d7 100644
--- a/lib/misc_utils/message_printer_impl.h
+++ b/lib/misc_utils/message_printer_impl.h
@@ -33,9 +33,12 @@
      private:
       void message_print(pmt::pmt_t msg);
       pmt::pmt_t d_prepend_string;
+      bool d_prepend_fnr;
+      bool d_prepend_frame_count;
       bool d_print_gsmtap_header;
      public:
-      message_printer_impl(pmt::pmt_t prepend_string, bool print_gsmtap_header=false);
+      message_printer_impl(pmt::pmt_t prepend_string, bool prepend_fnr=false,
+        bool prepend_frame_count=false, bool print_gsmtap_header=false);
       ~message_printer_impl();
     };