Example #1
0
/* ==================================== */
void empilevoisins(int32_t x, int32_t rs, int32_t N, Fifo *FIFOna, Fifo *FIFOea, Fifo *FIFOsa, Fifo *FIFOoa)
/* ==================================== */
{
  int32_t y, z, k;

  /* x est un point qui vient de passer a 0 */
  for (k = 0; k < 8; k++)
  {
    y = voisin(x, k, rs, N);
    if ((y!=-1) && !IsSet(y,MINI) && !IsSet(y,EN_FIFO) && nonbord(y,rs,N))
    { 
      z = voisin(y, NORD, rs, N);
      if ((z != 0) && IsSet(z, MINI))
      { FifoPush(FIFOna, y); Set(y, EN_FIFO); goto nextk; }
      z = voisin(y, SUD, rs, N);
      if ((z != 0) && IsSet(z, MINI))
      { FifoPush(FIFOsa, y); Set(y, EN_FIFO); goto nextk; }
      z = voisin(y, EST, rs, N);
      if ((z != 0) && IsSet(z, MINI))
      { FifoPush(FIFOea, y); Set(y, EN_FIFO); goto nextk; }
      z = voisin(y, OUEST, rs, N);
      if ((z != 0) && IsSet(z, MINI))
      { FifoPush(FIFOoa, y); Set(y, EN_FIFO); goto nextk; }
    }
nextk: ;
  }
} /* empilevoisins() */
void FifoPushLastFinished()
{
    if (skiersFinished == 0)
    {
        FifoPush(skierDB[MAX_SKIERS_ON_DB - 1]);
    }
    else
    {
        FifoPush(skierDB[skiersFinished-1]);    
    }
}
Example #3
0
/* ==================================== */
void testmini(uint8_t *SOURCE, int32_t x, int32_t rs, int32_t N, Fifo *FIFO)
/* ==================================== */
{
  int32_t k, y, kk, yy, w;
  uint8_t valmin;

#ifdef REGULARISE
  for (k = 0; k < 8; k += 2)               /* parcourt les voisins en 4-connexite */
  {                                        /* pour voir s'il existe un minimum voisin */
    y = voisin(x, k, rs, N);               /* a un niveau > a celui atteint par x */
    if ((y != -1) && (IsSet(y, MINI)) && (SOURCE[y] > SOURCE[x])) 
    {                                      /* ce n'est plus un minimum */
      FifoPush(FIFO, y);
      UnSet(y, MINI);
      valmin = SOURCE[y];
      while (! FifoVide(FIFO)) /* parcours pour demarquer l'ex minimum */
      {
        w = FifoPop(FIFO);
        for (kk = 0; kk < 8; kk += 2)
        {
          yy = voisin(w, kk, rs, N);
          if ((yy != -1) && (SOURCE[yy] == valmin) && (IsSet(yy, MINI)))
          { 
            FifoPush(FIFO, yy);
	    UnSet(yy, MINI);
          }
        } /* for kk ... */
      } /* while (! FifoVide(FIFO)) */
    } /* if ((y != -1) && (IsSet(y, MINI)) && (SOURCE[y] > SOURCE[x])) */
  } /* for k */
#endif

  for (k = 0; k < 8; k += 2)  /* parcourt les voisins en 4-connexite */
  {                           /* pour voir s'il existe un minimum */
    y = voisin(x, k, rs, N);  /* au niveau atteint par x */
    if ((y != -1) && (IsSet(y, MINI)) && (SOURCE[y] == SOURCE[x])) 
    { 
      Set(x, MINI); 
      break; 
    }
  } /* for k */
} /* testmini() */
uint8_t UartMcuPutChar( Uart_t *obj, uint8_t data )
{
    if( IsFifoFull( &obj->FifoTx ) == false )
    {
        __disable_irq( );
        FifoPush( &obj->FifoTx, data );
        __enable_irq( );
        // Enable the USART Transmit interrupt
        USART_ITConfig( USART1, USART_IT_TXE, ENABLE );
        return 0; // OK
    }
    return 1; // Busy
}
Example #5
0
/*************************************************************************
 * Function Name: Uart2Isr
 * Parameters: none
 *
 * Return: none
 *
 * Description: UART 2 interrupt routine
 *
 *************************************************************************/
void Uart2Isr(void)
{
Int8U Data;
  // Recognizing the interrupt event
  if(USART_GetFlagStatus(USART2,USART_FLAG_ORE))
  {
    USART_ClearFlag(USART2,USART_FLAG_ORE);
    // Overrun Error
    Uart2LineEvents.bOE = TRUE;
  }
  if(USART_GetFlagStatus(USART2,USART_FLAG_FE))
  {
    USART_ClearFlag(USART2,USART_FLAG_FE);
    // Framing Error
    Uart2LineEvents.bFE = TRUE;
  }
  if(USART_GetFlagStatus(USART2,USART_FLAG_NE))
  {
    USART_ClearFlag(USART2,USART_FLAG_NE);
    // Noise Error
    Uart2LineEvents.bFE = TRUE;
  }
  if(USART_GetFlagStatus(USART2,USART_FLAG_PE))
  {
    USART_ClearFlag(USART2,USART_FLAG_PE);
    // Parity Error
    Uart2LineEvents.bPE = TRUE;
  }
  // Push a new data into the receiver buffer
  if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE))
  {
    // Push a new data into the receiver buffer
    if(!FifoPush(pUart2RxFifo,USART_ReceiveData(USART2)))
    {
      // the FIFO is full
      Uart2LineEvents.bOE = TRUE;
    }
  }
  if(   USART_GetFlagStatus(USART2,USART_FLAG_TXE)
     && (USART_GetITStatus (USART2,USART_IT_TXE) == SET))
  {
    if(FifoPop(pUart2TxFifo,&Data))
    {
      USART_SendData(USART2,Data);
    }
    else
    {
      USART_ITConfig(USART2,USART_IT_TXE ,DISABLE);
    }
  }
}
/**
  * @brief  VCP_DataRx
  *         Data received over USB OUT endpoint are sent over CDC interface 
  *         through this function.
  *           
  *         @note
  *         This function will block any OUT packet reception on USB endpoint 
  *         untill exiting this function. If you exit this function before transfer
  *         is complete on CDC interface (ie. using DMA controller) it will result 
  *         in receiving more data while previous ones are still not sent.
  *                 
  * @param  Buf: Buffer of data to be received
  * @param  Len: Number of data received (in bytes)
  * @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL
  */
static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len)
{
    uint32_t i;
  
	if( IsFifoEmpty( &FifoRx ) == true )
	{
		for( i = 0; i < Len; i++ )
		{
			FifoPush( &FifoRx, Buf[i] );
		}
	}
 
  return USBD_OK;
}
Example #7
0
void USART1_IRQHandler( void )
{
    uint8_t data;

    if( USART_GetITStatus( USART1, USART_IT_TXE ) != RESET )
    {
		//GpioWrite( &LedRed, 0 );
        if( IsFifoEmpty( &Uart1.FifoTx ) == false )
        {
            data = FifoPop( &Uart1.FifoTx );
            //  Write one byte to the transmit data register
            USART_SendData( USART1, data );
        }
        else
        {
            // Disable the USART Transmit interrupt
            USART_ITConfig( USART1, USART_IT_TXE, DISABLE );
        }
        if( Uart1.IrqNotify != NULL )
        {
            Uart1.IrqNotify( UART_NOTIFY_TX );
        }
		//GpioWrite( &LedRed, 1 );
    }

    if( USART_GetITStatus( USART1, USART_IT_ORE_RX ) != RESET )
    {
        USART_ReceiveData( USART1 );
    }

    if( USART_GetITStatus( USART1, USART_IT_RXNE ) != RESET )
    {
		//UartPrintf( &Uart1, "USART_GetITStatus( USART1, USART_IT_RXNE )\n" );
		//GpioWrite( &LedGreen, 0 );
        data = USART_ReceiveData( USART1 );
        if( IsFifoFull( &Uart1.FifoRx ) == false )
        {
            // Read one byte from the receive data register
            FifoPush( &Uart1.FifoRx, data );
        }
        if( Uart1.IrqNotify != NULL )
        {
            Uart1.IrqNotify( UART_NOTIFY_RX );
        }
		//GpioWrite( &LedGreen, 1 );
    }
}
uint8_t UartUsbPutChar( Uart_t *obj, uint8_t data )
{
    if( UsbMcuIsDeviceConfigured( ) == false )
    {
        return 2;
    }

    if( IsFifoFull( &obj->FifoTx ) == false )
    {
        __disable_irq( );
        FifoPush( &obj->FifoTx, data );
        __enable_irq( );

        if( UsbPacketTx == 1 )
        {
            /*Sent flag*/
            UsbPacketTx = 0;
            SetEPTxCount( ENDP1, 0 );
            SetEPTxValid( ENDP1 );
        }
        return 0; // OK
    }
    return 1; // Busy
//    if( UsbPacketTx == 1 )
//    {
//        /*Sent flag*/
//        UsbPacketTx = 0;
//        /* send  packet to PMA*/
//        UserToPMABufferCopy( ( unsigned char* )&data, ENDP1_TXADDR, 1 );
//        SetEPTxCount( ENDP1, 1 );
//        SetEPTxValid( ENDP1 );
//        return 0; // OK
//    }
//    else
//    {
//        if( IsFifoFull( &obj->FifoTx ) == false )
//        {
//            __disable_irq( );
//            FifoPush( &obj->FifoTx, data );
//            __enable_irq( );
//            return 0; // OK
//        }
//    }
//    return 1; // Busy
}
Example #9
0
/*************************************************************************
 * Function Name: UartWrite
 * Parameters:  UartNum_t Uart, pInt8U pBuffer, Int32U BufferSize
 *
 * Return: Int32U
 *
 * Description: Write a data to UART. Return number of successful
 *  transmitted bytes
 *
 *************************************************************************/
Int32U UartWrite(UartNum_t Uart, pInt8U pBuffer, Int32U BufferSize)
{
Int32U Count = 0;
pUartFifo_t pUartFifo;
USART_TypeDef * pUart;

  switch(Uart)
  {
  case UART_1:
    pUart = USART1;
    pUartFifo = pUart1TxFifo;
    break;
  case UART_2:
    pUart = USART2;
    pUartFifo = pUart2TxFifo;
    break;
  case UART_3:
    pUart = USART3;
    pUartFifo = pUart3TxFifo;
    break;
  default:
    return(0);
  }

  if(BufferSize != 0)
  {
    ENTR_CRT_SECTION();
    if(pUartFifo->PopIndx == pUartFifo->PushIndx)
    {
      USART_SendData(pUart,*pBuffer);
      USART_ITConfig(pUart,USART_IT_TXE ,ENABLE);
      ++Count;
    }

    for ( ; Count < BufferSize; ++Count)
    {
      if(!FifoPush(pUartFifo,*(pBuffer+Count)))
      {
        break;
      }
    }
    EXT_CRT_SECTION();
  }
  return(Count);
}
Example #10
0
/**
  * @brief  CDC_Receive_FS
  *         Data received over USB OUT endpoint are sent over CDC interface 
  *         through this function.
  *           
  *         @note
  *         This function will block any OUT packet reception on USB endpoint 
  *         untill exiting this function. If you exit this function before transfer
  *         is complete on CDC interface (ie. using DMA controller) it will result 
  *         in receiving more data while previous ones are still not sent.
  *                 
  * @param  Buf: Buffer of data to be received
  * @param  Len: Number of data received (in bytes)
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{
    uint8_t i;

    for( i = 0; i < *Len; i++ )
    {
        if( IsFifoFull( &UartObj->FifoRx ) == false )
        {
            // Read one byte from the receive data register
            FifoPush( &UartObj->FifoRx, Buf[i] );
        }
    }
    if( UartObj->IrqNotify != NULL )
    {
        UartObj->IrqNotify( UART_NOTIFY_RX );
    }
    USBD_CDC_SetRxBuffer(hUsbDevice_0, Buf);
    USBD_CDC_ReceivePacket(hUsbDevice_0);
    return (USBD_OK);
}
void EP3_OUT_Callback(void)
{
    uint8_t i;
    
    UsbRxLength = GetEPRxCount( ENDP3 );
    PMAToUserBufferCopy( ( unsigned char* )UsbRxBuffer, ENDP3_RXADDR, UsbRxLength );
    
    for( i = 0; i < UsbRxLength; i++ )
    {
        if( IsFifoFull( &UartUsb.FifoRx ) == false )
        {
            // Read one byte from the receive data register
            FifoPush( &UartUsb.FifoRx, UsbRxBuffer[i] );
        }
    }

    if( UartUsb.IrqNotify != NULL )
    {
        UartUsb.IrqNotify( UART_NOTIFY_RX );
    }
}
Example #12
0
uint8_t UartMcuPutChar( Uart_t *obj, uint8_t data )
{
    if( IsFifoFull( &obj->FifoTx ) == false )
    {
        __disable_irq( );
        FifoPush( &obj->FifoTx, data );
        __enable_irq( );
        // Enable the USART Transmit interrupt
        switch ( obj->UartId )
        {
        case UART_1:
            USART_ITConfig( USART1, USART_IT_TXE, ENABLE );
            break;
        case UART_2:
            USART_ITConfig( USART2, USART_IT_TXE, ENABLE );
            break;
        }
        //USART_ITConfig( USART1, USART_IT_TXE, ENABLE );
        return 0; // OK
    }
    return 1; // Busy
}
Example #13
0
/* ==================================== */
int32_t lselectcomp(
        struct xvimage *f,
        int32_t connex,
        int32_t x, 
        int32_t y, 
        int32_t z) 
/* extrait la composante connexe de f (image binaire) 
   qui contient le point (x,y,z) */
/* connex : 4, 8 (en 2D), 6, 18, 26 (en 3D) */
/* connex : 60, 260 (en 3D): idem 6 et 26 mais dans le plan xy seulement */
/* ==================================== */
#undef F_NAME 
#define F_NAME "lselectcomp"
{
  int32_t i;                       /* index muet de pixel */
  int32_t j;                       /* index muet (generalement un voisin de x) */
  int32_t k;                       /* index muet */
  int32_t rs = rowsize(f);         /* taille ligne */
  int32_t cs = colsize(f);         /* taille colonne */
  int32_t ds = depth(f);           /* nb plans */
  int32_t ps = rs * cs;            /* taille plan */
  int32_t N = ps * ds;             /* taille image */
  uint8_t *F = UCHARDATA(f);
  Fifo * FIFO;
  int32_t incr_vois;

  switch (connex)
  {
    case 4: incr_vois = 2; break;
    case 8: incr_vois = 1; break;
  } /* switch (connex) */

  FIFO = CreeFifoVide(N);
  if (FIFO == NULL)
  {   fprintf(stderr,"%s : CreeFifoVide failed\n", F_NAME);
      return(0);
  }

  for (i = 0; i < N; i++) if (F[i]) F[i] = 254;
  i = z*ps + y*rs + x;
  if (F[i]) { FifoPush(FIFO, i); F[i] += 1; }

  if ((connex == 4) || (connex == 8))
  {
    if (ds != 1)
    {   fprintf(stderr,"%s : connexity 4 or 8 not defined for 3D\n", F_NAME);
        return(0);
    }
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 0; k < 8; k += incr_vois)
      {
        j = voisin(i, k, rs, N);
        if ((j != -1) && (F[j]==254)) { FifoPush(FIFO, j); F[j] += 1; }
      } /* for k */
    } /* while ! FifoVide */
  } 
  else if (connex == 6)
  {
    if (ds == 1)
    {   fprintf(stderr,"%s : connexity 6 not defined for 2D\n", F_NAME);
        return(0);
    }
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 0; k <= 10; k += 2)
      {
        j = voisin6(i, k, rs, ps, N);
        if ((j != -1) && (F[j]==254)) { FifoPush(FIFO, j); F[j] += 1; }
      } /* for k */
    } /* while ! FifoVide */
  } 
  else if (connex == 18)
  {
    if (ds == 1)
    {   fprintf(stderr,"%s : connexity 18 not defined for 2D\n", F_NAME);
        return(0);
    }
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 0; k < 18; k += 1)
      {
        j = voisin18(i, k, rs, ps, N);
        if ((j != -1) && (F[j]==254)) { FifoPush(FIFO, j); F[j] += 1; }
      } /* for k */
    } /* while ! FifoVide */
  } 
  else if (connex == 26)
  {
    if (ds == 1)
    {   fprintf(stderr,"%s : connexity 26 not defined for 2D\n", F_NAME);
        return(0);
    }
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 0; k < 26; k += 1)
      {
        j = voisin26(i, k, rs, ps, N);
        if ((j != -1) && (F[j]==254)) { FifoPush(FIFO, j); F[j] += 1; }
      } /* for k */
    } /* while ! FifoVide */
  } 
  else if (connex == 60)
  {
    if (ds == 1)
    {   fprintf(stderr,"%s : connexity 6 not defined for 2D\n", F_NAME);
        return(0);
    }
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 0; k <= 6; k += 2)
      {
        j = voisin6(i, k, rs, ps, N);
        if ((j != -1) && (F[j]==254)) { FifoPush(FIFO, j); F[j] += 1; }
      } /* for k */
    } /* while ! FifoVide */
  } 
  else if (connex == 260)
  {
    if (ds == 1)
    {   fprintf(stderr,"%s : connexity 26 not defined for 2D\n", F_NAME);
        return(0);
    }
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 9; k <= 16; k += 1)
      {
        j = voisin26(i, k, rs, ps, N);
        if ((j != -1) && (F[j]==254)) { FifoPush(FIFO, j); F[j] += 1; }
      } /* for k */
    } /* while ! FifoVide */
  } 
  FifoTermine(FIFO);
  for (i = 0; i < N; i++) if (F[i] != 255) F[i] = 0;
  return 1;
} /* lselectcomp() */
Example #14
0
/* ==================================== */
int32_t lsquel(struct xvimage *image, int32_t seuil, int32_t niseuil)
/* ==================================== */
{ 
  int32_t x;                       /* index muet de pixel */
  int32_t y;                       /* index muet (generalement un voisin de x) */
  int32_t rs = rowsize(image);     /* taille ligne */
  int32_t cs = colsize(image);     /* taille colonne */
  int32_t N = rs * cs;             /* taille image */
  uint8_t *SOURCE = UCHARDATA(image);      /* l'image de depart */
  struct xvimage *lab;
  int32_t *M;            /* l'image d'etiquettes de composantes connexes */
  int32_t nminima;                 /* nombre de minima differents */
  Fifo * FIFOn;
  Fifo * FIFOs;
  Fifo * FIFOe;
  Fifo * FIFOo;
  Fifo * FIFOna;
  Fifo * FIFOsa;
  Fifo * FIFOea;
  Fifo * FIFOoa;
  Fifo * FIFOtmp;
  Fifo * FIFO;
  int32_t niter;
#ifdef PERF
  chrono chrono1;
#endif

  if (depth(image) != 1) 
  {
    fprintf(stderr, "lsquel: cette version ne traite pas les images volumiques\n");
    exit(0);
  }

#ifdef PERF  
  start_chrono(&chrono1);  /* pour l'analyse de performances */
#endif

  lab = allocimage(NULL, rs, cs, 1, VFF_TYP_4_BYTE);
  if (lab == NULL)
  {   
    fprintf(stderr, "lhtkern: allocimage failed\n");
    return 0;
  }
  M = SLONGDATA(lab);

  if (!llabelextrema(image, 4, LABMIN, lab, &nminima))
  {   
    fprintf(stderr, "lhtkern: llabelextrema failed\n");
    return 0;
  }

  IndicsInit(N);

  FIFO = CreeFifoVide(N);
  FIFOn = CreeFifoVide(N/2);
  FIFOs = CreeFifoVide(N/2);
  FIFOe = CreeFifoVide(N/2);
  FIFOo = CreeFifoVide(N/2);
  if ((FIFO == NULL) && (FIFOn == NULL) && (FIFOs == NULL) && (FIFOe == NULL) && (FIFOo == NULL))
  {   fprintf(stderr, "lsquel() : CreeFifoVide failed\n");
      return(0);
  }

  /* ================================================ */
  /*                  DEBUT ALGO                      */
  /* ================================================ */

  /* ========================================================= */
  /*   INITIALISATION DES FIFOs: empile les voisins des minima */
  /* ========================================================= */

  for (x = 0; x < N; x++)
  {
    if (M[x] != 0)                  /* le pixel appartient a un minimum */
    {
        Set(x, MINI);
        y = voisin(x, NORD, rs, N);
        if ((y!=-1) && (M[y]==0) && !IsSet(y,EN_FIFO) && nonbord(y,rs,N))
          { FifoPush(FIFOn, y); Set(y, EN_FIFO); }
#ifdef DIAG
        y = voisin(x, NORD+1, rs, N);
        if ((y!=-1) && (M[y]==0) && !IsSet(y,EN_FIFO) && nonbord(y,rs,N))
          { FifoPush(FIFOn, y); Set(y, EN_FIFO); }
#endif
        y = voisin(x, EST, rs, N);
        if ((y!=-1) && (M[y]==0) && !IsSet(y,EN_FIFO) && nonbord(y,rs,N))
          { FifoPush(FIFOe, y); Set(y, EN_FIFO); }
#ifdef DIAG
        y = voisin(x, EST+1, rs, N);
        if ((y!=-1) && (M[y]==0) && !IsSet(y,EN_FIFO) && nonbord(y,rs,N))
          { FifoPush(FIFOe, y); Set(y, EN_FIFO); }
#endif
        y = voisin(x, SUD, rs, N);
        if ((y!=-1) && (M[y]==0) && !IsSet(y,EN_FIFO) && nonbord(y,rs,N))
          { FifoPush(FIFOs, y); Set(y, EN_FIFO); }
#ifdef DIAG
        y = voisin(x, SUD+1, rs, N);
        if ((y!=-1) && (M[y]==0) && !IsSet(y,EN_FIFO) && nonbord(y,rs,N))
          { FifoPush(FIFOs, y); Set(y, EN_FIFO); }
#endif
        y = voisin(x, OUEST, rs, N);
        if ((y!=-1) && (M[y]==0) && !IsSet(y,EN_FIFO) && nonbord(y,rs,N))
          { FifoPush(FIFOo, y); Set(y, EN_FIFO); }
#ifdef DIAG
        y = voisin(x, OUEST+1, rs, N);
        if ((y!=-1) && (M[y]==0) && !IsSet(y,EN_FIFO) && nonbord(y,rs,N))
          { FifoPush(FIFOo, y); Set(y, EN_FIFO); }
#endif
    } /* if (M[x] != 0) */
  } /* for x */

  freeimage(lab);

  FIFOna = CreeFifoVide(N/4);
  FIFOsa = CreeFifoVide(N/4);
  FIFOea = CreeFifoVide(N/4);
  FIFOoa = CreeFifoVide(N/4);
  if ((FIFOna == NULL) && (FIFOsa == NULL) && (FIFOea == NULL) && (FIFOoa == NULL))
  {   fprintf(stderr, "lsquel() : CreeFifoVide failed\n");
      return(0);
  }

  /* ================================================ */
  /*                  DEBUT SATURATION                */
  /* ================================================ */

  niter = 0;
  while (! (FifoVide(FIFOn) && FifoVide(FIFOe) && FifoVide(FIFOs) && FifoVide(FIFOo)))
  {
    niter++;
    while (! FifoVide(FIFOn))
    {
      x = FifoPop(FIFOn);
      UnSet(x, EN_FIFO);
      if (testabaisse(SOURCE, x, rs, N, seuil, niter, niseuil))
      {                                    /* modifie l'image le cas echeant */
        testmini(SOURCE, x, rs, N, FIFO);        /* reactualise l'image MINI */
        empilevoisins(x, rs, N, FIFOna, FIFOea, FIFOsa, FIFOoa);
      } /* if (testabaisse(SOURCE, x, rs, N, seuil, niter, niseuil)) */
    } /* while (! FifoVide(FIFOn)) */

    while (! FifoVide(FIFOs))
    {
      x = FifoPop(FIFOs);
      UnSet(x, EN_FIFO);
      if (testabaisse(SOURCE, x, rs, N, seuil, niter, niseuil))
      {                                    /* modifie l'image le cas echeant */
        testmini(SOURCE, x, rs, N, FIFO);        /* reactualise l'image MINI */
        empilevoisins(x, rs, N, FIFOna, FIFOea, FIFOsa, FIFOoa);
      } /* if (testabaisse(SOURCE, x, rs, N, seuil, niter, niseuil)) */
    } /* while (! FifoVide(FIFOs)) */

    while (! FifoVide(FIFOe))
    {
      x = FifoPop(FIFOe);
      UnSet(x, EN_FIFO);
      if (testabaisse(SOURCE, x, rs, N, seuil, niter, niseuil))
      {                                    /* modifie l'image le cas echeant */
        testmini(SOURCE, x, rs, N, FIFO);        /* reactualise l'image MINI */
        empilevoisins(x, rs, N, FIFOna, FIFOea, FIFOsa, FIFOoa);
      } /* if (testabaisse(SOURCE, x, rs, N, seuil, niter, niseuil)) */
    } /* while (! FifoVide(FIFOe)) */

    while (! FifoVide(FIFOo))
    {
      x = FifoPop(FIFOo);
      UnSet(x, EN_FIFO);
      if (testabaisse(SOURCE, x, rs, N, seuil, niter, niseuil))
      {                                    /* modifie l'image le cas echeant */
        testmini(SOURCE, x, rs, N, FIFO);        /* reactualise l'image MINI */
        empilevoisins(x, rs, N, FIFOna, FIFOea, FIFOsa, FIFOoa);
      } /* if (testabaisse(SOURCE, x, rs, N, seuil, niter, niseuil)) */
    } /* while (! FifoVide(FIFOo)) */

    FIFOtmp = FIFOn; FIFOn = FIFOna; FIFOna = FIFOtmp;
    FIFOtmp = FIFOe; FIFOe = FIFOea; FIFOea = FIFOtmp;
    FIFOtmp = FIFOs; FIFOs = FIFOsa; FIFOsa = FIFOtmp;
    FIFOtmp = FIFOo; FIFOo = FIFOoa; FIFOoa = FIFOtmp;

  } /* while (! (FifoVide(FIFOn) && FifoVide(FIFOe) && FifoVide(FIFOs) && FifoVide(FIFOo))) */

  /* ================================================ */
  /* UN PEU DE MENAGE                                 */
  /* ================================================ */

  IndicsTermine();
  FifoTermine(FIFO);
  FifoTermine(FIFOn);
  FifoTermine(FIFOe);
  FifoTermine(FIFOs);
  FifoTermine(FIFOo);
  FifoTermine(FIFOna);
  FifoTermine(FIFOea);
  FifoTermine(FIFOsa);
  FifoTermine(FIFOoa);

#ifdef PERF
  save_time(N, read_chrono(&chrono1), "lsquel", image->name);    
#endif
  return(1);
}
Example #15
0
// As called from above
void SamplerTasks(void)
{
	if ((status.streaming) && (settings.sampleRate != 0))
	{
		static char* start = NULL;
		unsigned char conType;
		#ifdef SAMPLE_LED
			SAMPLE_LED=LED_TURN_ON;
		#endif

		// Grab a sample with cached sample time
		currentSample.sampleCount = sampleCount;
		currentSample.sampleTicks = sampleTicks;

		// Read sensor values
		MultiSingleSample(&currentSample.sensor);

		// For BR connections -> put over serial link
		conType = HciConType(bluetoothConnection);
		if(conType == HCI_CONN_TYPE_BR)
		{
			// Convert to an outgoing data packet 
			unsigned short num = MakeDataPacket(&currentSample, settings.dataMode, (void*)&start);
			
			// Ensure it was successful
			if ((num == 0) || (start == NULL)) return;
		
			// Try to copy to out buffer - if not enough room then skip this sample	
			if (FifoFree(&streamerFifo)>=num)
			{	
				FifoPush(&streamerFifo, start, num);
				status.newXdata = 0; // Indicate new extended data was sent
			}
		}
		#ifndef DISABLE_LE_MODES
		// For BLE connections -> indicate if turned on, overides notify
		else if ((conType == HCI_CONN_TYPE_LE) && (dataOutHandle.dataFlag != 1) && (dataOutHandle.attCfg & ATT_CFG_INDICATE))
		{
			// Convert to an outgoing data packet 
			unsigned short num = MakeDataPacket(&currentSample, 2, (void*)&start); // 20 byte binary packet

			// Ensure it was successful
			if ((num == 0) || (start == NULL)) return;

			dataOutHandle.dataFlag = 1;
			dataOutHandle.attLen = num;
			dataOutHandle.attData = (unsigned char*)start;
			EventTrigger();
		}
		// For BLE connections -> notify if space and not already indicating
		else if ((conType == HCI_CONN_TYPE_LE) && (dataOutHandle.dataFlag != 1) && (dataOutHandle.attCfg & ATT_CFG_NOTIFY))
		{
			// Convert to an outgoing data packet 
			unsigned short num = MakeDataPacket(&currentSample, 2, (void*)&start); // 20 byte binary packet

			// Ensure it was successful
			if ((num == 0) || (start == NULL)) return;

			dataOutHandle.dataFlag = 1;
			dataOutHandle.attLen = num;
			dataOutHandle.attData = (unsigned char*)start;
			EventTrigger();
		}
		#endif//ENABLE_LE_MODE
		// On returning, if there is another sample triggered - this will be called again 	
	}
}
Example #16
0
/* ==================================== */
int32_t lgeoeros3d(
        struct xvimage *g,
        struct xvimage *f,
        int32_t connex,
        int32_t niter) 
/* reconstruction de g sous f */
/* g : image marqueur */
/* f : image masque */
/* connex : 6 ou 18 ou 26 */
/* niter : nombre d'iterations (ou -1 pour saturation) */
/* resultat dans g */
/* ==================================== */
#undef F_NAME 
#define F_NAME "lgeoeros3d"
{
  int32_t nbchang, iter;
  int32_t x;                       /* index muet de pixel */
  int32_t y;                       /* index muet (generalement un voisin de x) */
  int32_t k;                       /* index muet */
  int32_t rs = rowsize(g);         /* taille ligne */
  int32_t cs = colsize(g);         /* taille colonne */
  int32_t d = depth(g);            /* nombre plans */           
  int32_t n = rs * cs;             /* taille plan */
  int32_t N = n * d;               /* taille image */
  uint8_t *G = UCHARDATA(g);      /* l'image marqueur */
  uint8_t *F = UCHARDATA(f);      /* l'image masque */
  uint8_t *H;                     /* image de travail */
  uint8_t *temp;
  uint8_t inf;
  Fifo * FIFO[2];

  if ((rowsize(f) != rs) || (colsize(f) != cs) || (depth(f) != d))
  {
    fprintf(stderr, "%s: incompatible sizes\n", F_NAME);
    return 0;
  }

  FIFO[0] = CreeFifoVide(N);
  FIFO[1] = CreeFifoVide(N);
  if ((FIFO[0] == NULL) || (FIFO[1] == NULL))
  {   fprintf(stderr,"%s : CreeFifoVide failed\n", F_NAME);
      return(0);
  }

  IndicsInit(N);

  for (x = 0; x < N; x++)      /* mise en fifo initiale de tous les points */    {
    FifoPush(FIFO[1], x);
    Set(x, 1);
  }

  H = (uint8_t *)calloc(1,N*sizeof(char));
  if (H == NULL)
  {   fprintf(stderr,"%s : malloc failed for H\n", F_NAME);
      return(0);
  }

  for (x = 0; x < N; x++)      /* force G à être >= F */    
    if (G[x] < F[x]) G[x] = F[x];

  if (connex == 26)
  {
    iter = 0;
    do
    {
      iter += 1;
      nbchang = 0;
      while (! FifoVide(FIFO[iter % 2]))
      {
        x = FifoPop(FIFO[iter % 2]);
        UnSet(x, iter % 2);
        inf = G[x];
        for (k = 0; k < 26; k += 1)
        {
          y = voisin26(x, k, rs, n, N);
          if ((y != -1) && (G[y] < inf)) inf = G[y];
        } /* for k */
  
        inf = mcmax(inf, F[x]);
        if (G[x] != inf)
        {  /* changement: on enregistre x ainsi que ses voisins */
          nbchang += 1;
          if (! IsSet(x, (iter + 1) % 2))
          {
            FifoPush(FIFO[(iter + 1) % 2], x);
            Set(x, (iter + 1) % 2);
  	  }
          for (k = 0; k < 26; k += 1)
          {
            y = voisin26(x, k, rs, n, N);
            if ((y != -1) && (! IsSet(y, (iter + 1) % 2)))
            {
              FifoPush(FIFO[(iter + 1) % 2], y);
              Set(y, (iter + 1) % 2);
            }
          } /* for k */
        }
        H[x] = inf;
      } /* while ! FifoVide */
      temp = G; /* echange les roles de G et H */
      G = H;
      H = temp;
#ifdef VERBOSE
      printf("iteration %d, nbchang %d\n", iter, nbchang);
#endif
    } while (((niter == -1) || (iter < niter)) && (nbchang != 0));
  }
  else if (connex == 18)
  {
    iter = 0;
    do
    {
      iter += 1;
      nbchang = 0;
      while (! FifoVide(FIFO[iter % 2]))
      {
        x = FifoPop(FIFO[iter % 2]);
        UnSet(x, iter % 2);
        inf = G[x];
        for (k = 0; k < 18; k += 1)
        {
          y = voisin18(x, k, rs, n, N);
          if ((y != -1) && (G[y] < inf)) inf = G[y];
        } /* for k */
  
        inf = mcmax(inf, F[x]);
        if (G[x] != inf)
        {  /* changement: on enregistre x ainsi que ses voisins */
          nbchang += 1;
          if (! IsSet(x, (iter + 1) % 2))
          {
            FifoPush(FIFO[(iter + 1) % 2], x);
            Set(x, (iter + 1) % 2);
  	  }
          for (k = 0; k < 18; k += 1)
          {
            y = voisin18(x, k, rs, n, N);
            if ((y != -1) && (! IsSet(y, (iter + 1) % 2)))
            {
              FifoPush(FIFO[(iter + 1) % 2], y);
              Set(y, (iter + 1) % 2);
            }
          } /* for k */
        }
        H[x] = inf;
      } /* while ! FifoVide */
      temp = G; /* echange les roles de G et H */
      G = H;
      H = temp;
#ifdef VERBOSE
      printf("iteration %d, nbchang %d\n", iter, nbchang);
#endif
    } while (((niter == -1) || (iter < niter)) && (nbchang != 0));
  }
  else if (connex == 6)
  {
    iter = 0;
    do
    {
      iter += 1;
      nbchang = 0;
      while (! FifoVide(FIFO[iter % 2]))
      {
        x = FifoPop(FIFO[iter % 2]);
        UnSet(x, iter % 2);
        inf = G[x];
        for (k = 0; k <= 10; k += 2)
        {
          y = voisin6(x, k, rs, n, N);
          if ((y != -1) && (G[y] < inf)) inf = G[y];
        } /* for k */
  
        inf = mcmax(inf, F[x]);
        if (G[x] != inf)
        {  /* changement: on enregistre x ainsi que ses voisins */
          nbchang += 1;
          if (! IsSet(x, (iter + 1) % 2))
          {
            FifoPush(FIFO[(iter + 1) % 2], x);
            Set(x, (iter + 1) % 2);
  	  }
          for (k = 0; k <= 10; k += 2)
          {
            y = voisin6(x, k, rs, n, N);
            if ((y != -1) && (! IsSet(y, (iter + 1) % 2)))
            {
              FifoPush(FIFO[(iter + 1) % 2], y);
              Set(y, (iter + 1) % 2);
            }
          } /* for k */
        }
        H[x] = inf;
      } /* while ! FifoVide */
      temp = G; /* echange les roles de G et H */
      G = H;
      H = temp;
#ifdef VERBOSE
      printf("iteration %d, nbchang %d\n", iter, nbchang);
#endif
    } while (((niter == -1) || (iter < niter)) && (nbchang != 0));
  }
  else 
  {
    fprintf(stderr, "%s: bad connexity\n", F_NAME);
    return 0;
  }

  /* remet le resultat dans g si necessaire */
  if (G != UCHARDATA(g))
  {
    for (x = 0; x < N; x++)
      (UCHARDATA(g))[x] = G[x];
    free(G);
  }
  else
    free(H);

  FifoTermine(FIFO[0]);
  FifoTermine(FIFO[1]);
  IndicsTermine();
  return 1;
} // lgeoeros3d(
Example #17
0
/* ==================================== */
int32_t lgeodilat(
        struct xvimage *g,
        struct xvimage *f,
        int32_t connex,
        int32_t niter) 
/* dilatation geodesique de g sous f */
/* g : image marqueur */
/* f : image masque */
/* connex : 4 ou 8 */
/* niter : nombre d'iterations (ou -1 pour saturation) */
/* resultat dans g */
/* ==================================== */
#undef F_NAME 
#define F_NAME "lgeodilat"
{
  int32_t nbchang, iter;
  int32_t x;                       /* index muet de pixel */
  int32_t y;                       /* index muet (generalement un voisin de x) */
  int32_t k;                       /* index muet */
  int32_t rs = rowsize(g);         /* taille ligne */
  int32_t cs = colsize(g);         /* taille colonne */
  int32_t N = rs * cs;             /* taille image */
  uint8_t *G = UCHARDATA(g);      /* l'image marqueur */
  uint8_t *F = UCHARDATA(f);      /* l'image masque */
  uint8_t *H;                     /* image de travail */
  uint8_t *temp;
  uint8_t sup;
  Fifo * FIFO[2];
  int32_t incr_vois;

  switch (connex)
  {
    case 4: incr_vois = 2; break;
    case 8: incr_vois = 1; break;
  } /* switch (connex) */

  if ((rowsize(f) != rs) || (colsize(f) != cs))
  {
    fprintf(stderr, "%s: incompatible sizes\n", F_NAME);
    return 0;
  }

  if (depth(f) != 1) 
  {
    fprintf(stderr, "%s: only works for 2d images\n", F_NAME);
    return 0;
  }

  FIFO[0] = CreeFifoVide(N);
  FIFO[1] = CreeFifoVide(N);
  if ((FIFO[0] == NULL) || (FIFO[1] == NULL))
  {   fprintf(stderr,"%s : CreeFifoVide failed\n", F_NAME);
      return(0);
  }

  IndicsInit(N);

  for (x = 0; x < N; x++)      /* mise en fifo initiale de tous les points */    
  {
    FifoPush(FIFO[1], x);
    Set(x, 1);
  }

  H = (uint8_t *)calloc(1,N*sizeof(char));
  if (H == NULL)
  {   fprintf(stderr,"%s : malloc failed for H\n", F_NAME);
      return(0);
  }

  for (x = 0; x < N; x++)      /* force G à être <= F */    
    if (G[x] > F[x]) G[x] = F[x];

  iter = 0;
  do
  {
    iter += 1;
    nbchang = 0;
    while (! FifoVide(FIFO[iter % 2]))
    {
      x = FifoPop(FIFO[iter % 2]);
      UnSet(x, iter % 2);
      sup = G[x];
      for (k = 0; k < 8; k += incr_vois)
      {
        y = voisin(x, k, rs, N);
        if ((y != -1) && (G[y] > sup)) sup = G[y];
      } /* for k */

      sup = mcmin(sup, F[x]);
      if (G[x] != sup) /* changement: on enregistre x ainsi que ses voisins */
      {
        nbchang += 1;
        if (! IsSet(x, (iter + 1) % 2))
        {
          FifoPush(FIFO[(iter + 1) % 2], x);
          Set(x, (iter + 1) % 2);
	}
        for (k = 0; k < 8; k += 1)
        {
          y = voisin(x, k, rs, N);
          if ((y != -1) && (! IsSet(y, (iter + 1) % 2)))
          {
            FifoPush(FIFO[(iter + 1) % 2], y);
            Set(y, (iter + 1) % 2);
          }
        } /* for k */
      }
      H[x] = sup;

    } /* while ! FifoVide */
    
    /* echange les roles de G et H */
    temp = G;
    G = H;
    H = temp;

#ifdef VERBOSE
    printf("iteration %d, nbchang %d\n", iter, nbchang);
#endif
  } while (((niter == -1) || (iter < niter)) && (nbchang != 0));

  /* remet le resultat dans g si necessaire */
  if (G != UCHARDATA(g))
  {
    for (x = 0; x < N; x++)
      (UCHARDATA(g))[x] = G[x];
    free(G);
  }
  else
    free(H);

  FifoTermine(FIFO[0]);
  FifoTermine(FIFO[1]);
  IndicsTermine();
  return 1;
} /* lgeodilat() */
Example #18
0
/* ==================================== */
int32_t lamont(
        struct xvimage *m,
        struct xvimage *f,
        int32_t connex,
        int32_t strict) 
/* connex : 4, 8 (en 2D), 6, 18, 26 (en 3D) */
/* ==================================== */
#undef F_NAME 
#define F_NAME "lamont"
{
  int32_t i, j, k;                 /* index muet de pixel */
  int32_t rs = rowsize(f);         /* taille ligne */
  int32_t cs = colsize(f);         /* taille colonne */
  int32_t ds = depth(f);           /* nb plans */
  int32_t ps = rs * cs;            /* taille plan */
  int32_t N = ps * ds;             /* taille image */
  int32_t *F = SLONGDATA(f);
  uint8_t *M = UCHARDATA(m);
  Fifo * FIFO;
  int32_t incr_vois;

  if ((rowsize(m) != rs) || (colsize(m) != cs) || (depth(m) != ds))
  {
    fprintf(stderr, "%s: incompatible sizes\n", F_NAME);
    return 0;
  }

  if ((datatype(m) != VFF_TYP_1_BYTE) || (datatype(f) != VFF_TYP_4_BYTE))
  {
    fprintf(stderr, "%s: incompatible types\n", F_NAME);
    return 0;
  }

  switch (connex)
  {
    case 4: incr_vois = 2; break;
    case 8: incr_vois = 1; break;
  } /* switch (connex) */

  FIFO = CreeFifoVide(N);
  if (FIFO == NULL)
  {   fprintf(stderr,"%s : CreeFifoVide failed\n", F_NAME);
      return(0);
  }

  for (i = 0; i < N; i++) if (M[i]) FifoPush(FIFO, i); 

  if ((connex == 4) || (connex == 8))
  {
    if (ds != 1)
    {
      fprintf(stderr,"%s : connexity 4 or 8 not defined for 3D\n", F_NAME);
      return(0);
    }
    if (strict)
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 0; k < 8; k += incr_vois)
      {
        j = voisin(i, k, rs, N);
        if ((j != -1) && !M[j] && (F[j] > F[i])) { FifoPush(FIFO, j); M[j] = 255; }
      } /* for k */
    } /* while ! FifoVide */
    else
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 0; k < 8; k += incr_vois)
      {
        j = voisin(i, k, rs, N);
//printf("i=%d ; j=%d ; Mj=%d ; Fj=%ld ; Fi=%ld\n", i, j, M[j], F[j], F[i]);
        if ((j != -1) && !M[j] && (F[j] >= F[i])) { FifoPush(FIFO, j); M[j] = 255; }
      } /* for k */
    } /* while ! FifoVide */
  } 
  else if (connex == 6)
  {
    if (ds == 1)
    {   fprintf(stderr,"%s : connexity 6 not defined for 2D\n", F_NAME);
        return(0);
    }
    if (strict)
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 0; k <= 10; k += 2)
      {
        j = voisin6(i, k, rs, ps, N);
        if ((j != -1) && !M[j] && (F[j] > F[i])) { FifoPush(FIFO, j); M[j] = 255; }
      } /* for k */
    } /* while ! FifoVide */
    else
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 0; k <= 10; k += 2)
      {
        j = voisin6(i, k, rs, ps, N);
        if ((j != -1) && !M[j] && (F[j] >= F[i])) { FifoPush(FIFO, j); M[j] = 255; }
      } /* for k */
    } /* while ! FifoVide */
  } 
  else if (connex == 18)
  {
    if (ds == 1)
    {   fprintf(stderr,"%s : connexity 18 not defined for 2D\n", F_NAME);
        return(0);
    }
    if (strict)
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 0; k < 18; k += 1)
      {
        j = voisin18(i, k, rs, ps, N);
        if ((j != -1) && !M[j] && (F[j] > F[i])) { FifoPush(FIFO, j); M[j] = 255; }

      } /* for k */
    } /* while ! FifoVide */
    else
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 0; k < 18; k += 1)
      {
        j = voisin18(i, k, rs, ps, N);
        if ((j != -1) && !M[j] && (F[j] >= F[i])) { FifoPush(FIFO, j); M[j] = 255; }

      } /* for k */
    } /* while ! FifoVide */
  } 
  else if (connex == 26)
  {
    if (ds == 1)
    {   fprintf(stderr,"%s : connexity 26 not defined for 2D\n", F_NAME);
        return(0);
    }
    if (strict)
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 0; k < 26; k += 1)
      {
        j = voisin26(i, k, rs, ps, N);
        if ((j != -1) && !M[j] && (F[j] > F[i])) { FifoPush(FIFO, j); M[j] = 255; }
      } /* for k */
    } /* while ! FifoVide */
    else
    while (! FifoVide(FIFO))
    {
      i = FifoPop(FIFO);
      for (k = 0; k < 26; k += 1)
      {
        j = voisin26(i, k, rs, ps, N);
        if ((j != -1) && !M[j] && (F[j] >= F[i])) { FifoPush(FIFO, j); M[j] = 255; }
      } /* for k */
    } /* while ! FifoVide */
  } 
  FifoTermine(FIFO);
  return 1;
} /* lamont() */