00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef INCLUDED_GR_CHECK_COUNTING_S_H
00023 #define INCLUDED_GR_CHECK_COUNTING_S_H
00024
00025 #include <gr_sync_block.h>
00026
00027 class gr_check_counting_s;
00028 typedef boost::shared_ptr<gr_check_counting_s> gr_check_counting_s_sptr;
00029
00030 gr_check_counting_s_sptr gr_make_check_counting_s (bool do_32bit=false);
00031
00039 class gr_check_counting_s : public gr_sync_block
00040 {
00041 friend gr_check_counting_s_sptr gr_make_check_counting_s (bool do_32bit);
00042
00043 enum state {
00044 SEARCHING,
00045 LOCKED
00046 };
00047
00048 state d_state;
00049 unsigned int d_history;
00050 unsigned short d_current_count;
00051 unsigned int d_current_count_32bit;
00052
00053 long d_total_errors;
00054 long d_total_shorts;
00055 bool d_do_32bit;
00056
00057 gr_check_counting_s (bool do_32bit);
00058
00059 void enter_SEARCHING ();
00060 void enter_LOCKED ();
00061
00062 void right (){
00063 d_history = (d_history << 1) | 0x1;
00064 }
00065
00066 void wrong (){
00067 d_history = (d_history << 1) | 0x0;
00068 d_total_errors++;
00069 }
00070
00071 bool right_three_times () { return (d_history & 0x7) == 0x7; }
00072 bool wrong_three_times () { return (d_history & 0x7) == 0x0; }
00073
00074 void log_error (unsigned short expected, unsigned short actual);
00075 void log_error_32bit (unsigned int expected, unsigned int actual);
00076
00077 int check_32bit (int noutput_items, unsigned short * in);
00078 int check_16bit (int noutput_items, unsigned short * in);
00079
00080 public:
00081
00082 int work (int noutput_items,
00083 gr_vector_const_void_star &input_items,
00084 gr_vector_void_star &output_items);
00085 };
00086
00087
00088 #endif