Added options to print frame number and A5 frame count in message printer. Issue #127
diff --git a/grc/misc_utils/gsm_message_printer.xml b/grc/misc_utils/gsm_message_printer.xml
index 7e390ed..0e93f1b 100644
--- a/grc/misc_utils/gsm_message_printer.xml
+++ b/grc/misc_utils/gsm_message_printer.xml
@@ -4,7 +4,8 @@
   <key>gsm_message_printer</key>
   <import>import grgsm</import>
   <import>import pmt</import>
-  <make>grgsm.message_printer(pmt.intern($prepend_string), $print_gsmtap_header)</make>
+  <make>grgsm.message_printer(pmt.intern($prepend_string), $prepend_fnr,
+    $prepend_frame_count, $print_gsmtap_header)</make>
 
   <param>
     <name>Prepend String</name>
@@ -14,6 +15,34 @@
     <hide>part</hide>
   </param>
   <param>
+    <name>Prepend Frame Number</name>
+    <key>prepend_fnr</key>
+    <value>False</value>
+    <type>bool</type>
+    <option>
+      <name>False</name>
+      <key>False</key>
+    </option>
+    <option>
+      <name>True</name>
+      <key>True</key>
+    </option>
+  </param>
+  <param>
+    <name>Prepend Frame Count</name>
+    <key>prepend_frame_count</key>
+    <value>False</value>
+    <type>bool</type>
+    <option>
+      <name>False</name>
+      <key>False</key>
+    </option>
+    <option>
+      <name>True</name>
+      <key>True</key>
+    </option>
+  </param>
+  <param>
     <name>Print GSMTap header</name>
     <key>print_gsmtap_header</key>
     <value>False</value>
diff --git a/include/grgsm/misc_utils/message_printer.h b/include/grgsm/misc_utils/message_printer.h
index d40352f..04aae94 100644
--- a/include/grgsm/misc_utils/message_printer.h
+++ b/include/grgsm/misc_utils/message_printer.h
@@ -48,7 +48,8 @@
        * class. gsm::message_printer::make is the public interface for
        * creating new instances.
        */
-      static sptr make(pmt::pmt_t prepend_string, bool print_gsmtap_header=false);
+      static sptr make(pmt::pmt_t prepend_string, bool prepend_fnr=false,
+        bool prepend_frame_count=false, bool print_gsmtap_header=false);
     };
 
   } // namespace gsm
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();
     };