Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.50 KB | None | 0 0
  1. //"Forced inline." :-p
  2. //This function may look odd.  That's because it is.
  3. //To see what's really going on in here, check lighthouse_clocking.c
  4. #define ProcessMachineState( dat ) \
  5.     { \
  6.         localstate = (localstate & 0x100) | dat; \
  7.         localstate = LHSM.carrierlut[localstate]; \
  8.         if( localstate & 0x4000 ) { \
  9.             LHSM.timebase += localstate & 0x0f; \
  10.             *(LHSM.edgetimeshead++) = LHSM.timebase; \
  11.         } \
  12.         if( localstate & 0x8000 ) { \
  13.             LHSM.timebase += localstate >> 4 & 0x0f; \
  14.             *(LHSM.edgetimeshead++) = LHSM.timebase; \
  15.         } \
  16.         LHSM.timebase += localstate >> 10 & 0x0f; \
  17.     }
  18.  
  19. int ProcessLighthouse()
  20. {
  21.     uint32_t * data;
  22.     int size_words;
  23.  
  24.     int remain = (buffer_head - buffer_tail + buffer_size) % buffer_size;
  25.     int remain_to_end = buffer_size - buffer_head;
  26.     //printf( "%d", remain/128 );
  27.  
  28.     if( remain > remain_to_end )
  29.         size_words = remain_to_end;
  30.     else
  31.         size_words = remain;
  32.  
  33.     data = buffer_data + buffer_tail;
  34.  
  35.     if( LHSM.debugbufferflag == 2 )
  36.     {
  37.         buffer_tail = (buffer_tail + size_words) % buffer_size;
  38.         return 0;
  39.     }
  40.  
  41.     int i;
  42.  
  43.     //Check to make sure we won't overflow our buffers.  Doing this here speeds us up,
  44.     //rather than having to do it every iteration.
  45.     uint32_t used_buffer = LHSM.debugbufferhead - LHSM.debugbufferbase; //Because of magic C pointer math, this returns elements.
  46.     if( used_buffer >= MAX_LHBUFF - size_words )
  47.     {
  48.         LHSM.debugbufferflag = 3; //3 = abort. (oversized frame)
  49.     }
  50.  
  51.     for( i = 0; i < size_words; i++ )
  52.     {
  53.         uint32_t r = data[i];
  54.         uint32_t is_interesting = r != 0x00000000 && r != 0xffffffff;
  55.         if( is_interesting | LHSM.last_was_interesting )
  56.         {
  57.             LHSM.last_was_interesting = is_interesting;
  58.             if( LHSM.debugbufferflag == 0 )
  59.             {
  60.                 ResetStateMachine();
  61.                 LHSM.debugbufferflag = 1;
  62.                 LHSM.debugbufferlen = 1;
  63.                 if( !LHSM.configure_state ) LHSM.configure_state = 1;
  64.             }
  65.  
  66.             if( LHSM.debugbufferflag == 1 )
  67.             {
  68.                 *(LHSM.debugbufferhead++) = r;
  69.  
  70.                 uint32_t used_edges = LHSM.edgetimeshead - LHSM.edgetimesbase;
  71.  
  72.                 //Check here instead of in each PSM. (performance speedup)
  73.                 if( used_edges >= MAX_EDGES - 9 ) //-9 = each PSM can initiate up to 2 edges.
  74.                 {
  75.                     LHSM.debugbufferflag = 3;  //Abort: Too many transitions.
  76.                     LHSM.timebase += 32;
  77.                     continue;
  78.                 }
  79.  
  80.                 uint16_t localstate = LHSM.statemachinestate;
  81.  
  82.                 //Actually process the data.
  83.                 ProcessMachineState( (r>>24&0xff) );
  84.                 ProcessMachineState( (r>>16&0xff) );
  85.                 ProcessMachineState( (r>>8&0xff) );
  86.                 ProcessMachineState( (r>>0&0xff) );
  87.  
  88.                 LHSM.statemachinestate = localstate;
  89.             }
  90.             else
  91.             {
  92.                 LHSM.timebase += 32;
  93.             }
  94.         }
  95.         else
  96.         {
  97.             if( LHSM.debugbufferflag == 3 )
  98.             {
  99.                 LHSM.debugbufferflag = 0;
  100.             }
  101.  
  102.             if( LHSM.debugbufferflag == 1 )
  103.             {
  104.                 //This may look odd, but what's going on
  105.                 //is we find out what the default value is
  106.                 //for the line, i.e. bias low or high.
  107.                 //Then we can use that for the defualt state.
  108.                 LHSM.defaultstate = (r & 0x100)>>8;
  109.                 LHSM.debugbufferlen = LHSM.debugbufferhead - LHSM.debugbufferbase;
  110.  
  111.                 if( LHSM.debugbufferlen < 5 )
  112.                 {
  113.                     LHSM.timebase += 32;
  114.                     LHSM.debugbufferflag = 0;
  115.                 }
  116.                 else
  117.                 {
  118.                     //Continue the state machine.
  119.                     uint16_t localstate = LHSM.statemachinestate;
  120.                     ProcessMachineState( r>>24 );   //We don't care about storing the output.  It just needs to finish.
  121.                     LHSM.timebase += 24;
  122.  
  123.                     //All edges are now populated.  We could operate on them.
  124.                     int transitionct = LHSM.edgetimeshead - LHSM.edgetimesbase;
  125.                     uint32_t * edgept = LHSM.edgetimesbase;
  126.                     LHSM.edgecount = transitionct;
  127.  
  128.                     struct LightEvent * le = &LHSM.dhle;
  129.                     le->gotlock = 0;
  130.  
  131.                     //Once we're here, we have properly formatted edges and everything!
  132.                     {
  133.                         int i;
  134.                         uint32_t first_transition = edgept[0];
  135.                         uint32_t average = 0; //Average
  136.                         uint32_t stg = 0;     //Strength
  137.  
  138.                         uint32_t center = 0;  //Units: Fs*2
  139.                         uint32_t centerlast = 0;
  140.                         uint16_t ending;
  141.                         //Also, calculate frequency.  How can we do this?
  142.  
  143.                         //Bins for caluclating
  144.                         #define FREQBINS 24
  145.                         uint32_t binsets[FREQBINS];
  146.                         uint32_t binqty[FREQBINS];
  147.                         int bestbin = 0;
  148.                         ets_memset( binsets, 0, sizeof( binsets ) );
  149.                         ets_memset( binqty, 0, sizeof( binqty ) );
  150.  
  151.                         uint32_t transitioni = edgept[0];
  152.                         le->t1mark = edgept[1] - transitioni;
  153.                         le->t2mark = edgept[2] - transitioni;
  154.                         le->t3mark = edgept[3] - transitioni;
  155.                         le->t4mark = edgept[4] - transitioni;
  156.  
  157.                         for( i = 0; i < transitionct; i+= 2 )
  158.                         {
  159.                             transitioni = edgept[0];
  160.                             uint32_t len = edgept[1] -= transitioni;
  161.                             uint32_t tt  = edgept[0]  = transitioni - first_transition; //Transition (as starting from virtual 0)
  162.                             ending = len + tt;
  163.                             edgept+=2;
  164.  
  165.                             average += len * tt;
  166.                             stg += len;
  167.                             center = tt*2 + len;
  168.                             if( i )
  169.                             {
  170.                                 int placing = center - centerlast;
  171.                                 int interval = placing>>2;
  172.  
  173.                                 if( interval < FREQBINS && interval > 0 )
  174.                                 {
  175.                                     binsets[interval] ++;
  176.                                     if( binsets[interval] > binsets[bestbin] ) bestbin = interval;
  177.                                     binqty[interval] += placing;
  178.                                 }
  179.                             }
  180.                             centerlast = center;
  181.                         }
  182.  
  183.                         int frequency = -1;
  184.                         if( bestbin >= 2 && bestbin < FREQBINS-2 )
  185.                         {
  186.                             uint32_t * bbminus2 = &binsets[bestbin-2];
  187.                             uint32_t totalset = bbminus2[0] + bbminus2[1] + bbminus2[2] + bbminus2[3] + bbminus2[4];
  188.                             bbminus2 = &binqty[bestbin-2];
  189.                             uint32_t totalqty = bbminus2[0] + bbminus2[1] + bbminus2[2] + bbminus2[3] + bbminus2[4];
  190.                             if( totalset > 4 ) //Make sure we don't have a runt frame.
  191.                             {
  192.                                 static int stset = 0;
  193.                                 //WE HAVE A LOCK on a frequency and good data. Time to populate!
  194.                                 le->gotlock = 1 + stset;
  195.                                 if( ++stset == 16 ) stset = 0;
  196.                                 le->firsttransition = first_transition;
  197.                                 le->average_numerator = average;
  198.                                 le->strength = stg;
  199.                                 le->full_length = ending;
  200.                                 le->freq_numerator = totalqty;
  201.                                 le->freq_denominator = totalset;
  202.                             }
  203.                         }
  204.                     }
  205.  
  206.                     if( le->gotlock )
  207.                     {
  208.                         SendPacket( le );
  209.                     }
  210.  
  211.                     if( !LHSM.debugmonitoring )
  212.                     {
  213.                         LHSM.debugbufferflag = 0;
  214.                     }
  215.                     else
  216.                     {
  217.                         LHSM.debugbufferflag = 2;
  218.                     }
  219.                 }
  220.             }
  221.         }
  222.     }
  223.  
  224.     if( buffer_overflows )
  225.     {
  226.         //printf( "*" );
  227.         buffer_overflows = 0;
  228.     }
  229.  
  230.     buffer_tail = (buffer_tail + size_words) % buffer_size;
  231.     if( size_words )
  232.         return 1;
  233.     else
  234.         return 0;
  235. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement