示例#1
0
enum MENU_code fAboutIni( void )
{
    MenuFirstDisplay = 1;

    // Set CircleOS into the wanted state.
    MENU_Remove();

    POINTER_SetMode( POINTER_OFF );
    BUTTON_SetMode( BUTTON_ONOFF );

    return MENU_CONTINUE_COMMAND;
}
示例#2
0
static void prvSetupHardware( void )
{
	/* Start with the clocks in their expected state. */
	RCC_DeInit();

	/* Enable HSE (high speed external clock). */
	RCC_HSEConfig( RCC_HSE_ON );

	/* Wait till HSE is ready. */
	while( RCC_GetFlagStatus( RCC_FLAG_HSERDY ) == RESET )
	{
	}

	/* 2 wait states required on the flash. */
	*( ( unsigned portLONG * ) 0x40022000 ) = 0x02;

	/* HCLK = SYSCLK */
	RCC_HCLKConfig( RCC_SYSCLK_Div1 );

	/* PCLK2 = HCLK */
	RCC_PCLK2Config( RCC_HCLK_Div1 );

	/* PCLK1 = HCLK/2 */
	RCC_PCLK1Config( RCC_HCLK_Div2 );

	/* PLLCLK = 12MHz * 6 = 72 MHz. */
	RCC_PLLConfig( RCC_PLLSource_HSE_Div1, RCC_PLLMul_6 );

	/* Enable PLL. */
	RCC_PLLCmd( ENABLE );

	/* Wait till PLL is ready. */
	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
	{
	}

	/* Select PLL as system clock source. */
	RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK );

	/* Wait till PLL is used as system clock source. */
	while( RCC_GetSYSCLKSource() != 0x08 )
	{
	}

	/* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE and AFIO clocks */
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
							| RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE );

	/* SPI2 Periph clock enable */
	RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );


	/* Set the Vector Table base address at 0x08000000 */
	NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0 );

	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
	
	/* Configure HCLK clock as SysTick clock source. */
	SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK );
	
	/* Misc initialisation, including some of the CircleOS features.  Note
	that CircleOS itself is not used. */
	vParTestInitialise();
	MEMS_Init();
	POINTER_Init();
	POINTER_SetMode( POINTER_RESTORE_LESS );
}
示例#3
0
enum MENU_code fTest_Mgr( void )
{
    int fRedrawn = 0;
    static bool fFirstTime = 1;
    static bool AUDIO_BuzzerOn_bak = 0;

    if ( fFirstTime )
    {
        fFirstTime = 0;
        MenuFirstDisplay = 1;
    }

    // Hide menu.
    CurrentMenu = 0;
    fDisplayTime = 0; // force display time - battery status

    // Character magnify.
    DRAW_SetCharMagniCoeff( 2 );

    // If screen orientation has changed, redraw screen.
    if ( MenuFirstDisplay == 0 )
    {
        if ( LCD_GetScreenOrientation() != previous_Screen_Orientation )
        {
            MenuFirstDisplay = 1;
        }
    }

    if ( MenuFirstDisplay )
    {
        previous_Screen_Orientation = LCD_GetScreenOrientation();
        POINTER_SetMode( POINTER_OFF );
        LCD_SetRotateScreen( 0 );
        LCD_SetScreenOrientation( V12 );

        // Red LED blinks at high frequency.
        LED_Set( LED_RED, LED_BLINKING_HF );

        // Green LED blinks at low frequency.
        LED_Set( LED_GREEN, LED_BLINKING_LF );

        // Draw a little message on the LCD screen.
        DRAW_SetDefaultColor();
        DRAW_DisplayStringWithMode( 0, Screen_Height - 2 * Char_Height, "Hardware Test", ALL_SCREEN, INVERTED_TEXT, CENTER );
        MenuFirstDisplay = 0;

        // Drawn that rectangle on the screen.
        LCD_FillRect_Circle( BAR_LEFT + 1, BAR_BOTTOM + 1, MAXLEVEL * WIDTH_SQUARE  , WIDTH_SQUARE - 2, RGB_YELLOW );
        LCD_DrawRect( BAR_LEFT, BAR_BOTTOM, MAXLEVEL * WIDTH_SQUARE + 2 , WIDTH_SQUARE, RGB_BLUE );

        // Restrict the move of the pointer to a rectangle.
        POINTER_SetRect( BAR_LEFT + 1, BAR_BOTTOM + 1, MAXLEVEL * WIDTH_SQUARE - POINTER_WIDTH - 2, WIDTH_SQUARE - POINTER_WIDTH - 2 );
        POINTER_SetMode( POINTER_ON );

        // Force buzzer activation
        AUDIO_BuzzerOn_bak = AUDIO_BuzzerOn;
        AUDIO_BuzzerOn = 1;

    } // end FirstDisplay

    // The button is pushed, let's get out of here!
    if ( BUTTON_GetState() == BUTTON_PUSHED )
    {
        int i;
    
        BUTTON_WaitForRelease();

        // Reset CircleOS state.
        MENU_ClearCurrentCommand();
        DRAW_SetDefaultColor();
        DRAW_Clear();
        POINTER_SetMode( POINTER_ON );
        BUTTON_SetMode( BUTTON_ONOFF_FORMAIN );
        POINTER_SetRectScreen();
        DRAW_SetCharMagniCoeff( 1 );

#if BACKLIGHT_INTERFACE
        // Reset backlight PWM rate to its default value.
        LCD_SetBackLight( 0 );
#endif // BACKLIGHT_INTERFACE

        // Switch LEDs off.
        LED_Set( LED_RED, LED_OFF );
        LED_Set( LED_GREEN, LED_OFF );

        fFirstTime  = 1;

        // Search if test aplication present in flash
        for ( i = 0; i < MAXAPP; i++ )
        {
            extern tMenuItem*(( *ApplicationTable )[] );
            tMenuItem*  curapp;
            unsigned addr;

            if (( *ApplicationTable )[ -i ] == APP_VOID ) //has been programmed
            {
                break;
            }
            else
            {
                addr   = ( long unsigned )( *ApplicationTable )[ -i ] ;
                addr &= 0x00FFFFFF;
                addr |= 0x08000000;
                curapp = ( tMenuItem* ) addr;
                if ( !strcmp( curapp->Text, "COMMTEST" ) )
                {
                    LCD_SetOffset( OFFSET_ON );
                    CurrentCommand = curapp;
                    CurrentMenu = 0;
                    BUTTON_SetMode( BUTTON_ONOFF );
                    return CurrentCommand ->Fct_Init();
                }
            }
        }

        LCD_SetRotateScreen( 1 );
        LCD_SetScreenOrientation( previous_Screen_Orientation );

        AUDIO_BuzzerOn = AUDIO_BuzzerOn_bak;

        return MENU_LEAVE;
    }

#if BACKLIGHT_INTERFACE
    // Increment the backlight PWM.
    Current_CCR_BackLightStart += 0x800;

    // If backlight PWM is too high, restart with a lower value.
    if ( Current_CCR_BackLightStart > 0xF000 )
    {
        Current_CCR_BackLightStart = 0x2000;
    }
#endif // BACKLIGHT_INTERFACE


    // Every 59th calls display battery voltage and replay melody sample.
    // Note: due to the fRedrawn == 0, the first time the % 59 == 0
    //       (when divider_coord is null), the code block isn't executed.
    if ((( menu_divider_coord++ % 37 ) == 0 ) && ( fRedrawn == 0 ) )
    {
        char TextBuffer[5];
        *TextBuffer = '%'; *( TextBuffer + 1 ) = 0; // YRT20080204 : to avoid memcpy

        DRAW_DisplayVbat( 20, 12 );
        UTIL_uint2str( TextBuffer + 1, PWR_BatteryLevel, 3, 0 );
        DRAW_DisplayString( 170, 12, TextBuffer, 4 );
    
        BUZZER_PlayMusic( Test_Melody );
    }
    return MENU_CONTINUE;
}
示例#4
0
  enum MENU_code fTest_Mgr( void )
{
    int fRedrawn = 0;
    static bool fFirstTime = 1;
    static s8 AUDIO_SpeakerOn_bak;
    static s8 AUDIO_Volume_bak;

    if ( fFirstTime )
    {
        AUDIO_SpeakerOn_bak = AUDIO_SpeakerOn;
        AUDIO_Volume_bak = AUDIO_Volume;
        AUDIO_Volume = AUDIO_MIN_ATTENUATION;
        AUDIO_SpeakerOn = 1;
        UTIL_SetPll( SPEED_VERY_HIGH );
        fFirstTime = 0;
        MenuFirstDisplay = 1;
    }

    // Hide menu.
    CurrentMenu = 0;
    fDisplayTime = 0; // force display time - battery status

    // Character magnify.
    DRAW_SetCharMagniCoeff( 2 );

    // If screen orientation has changed, redraw screen.
    if ( MenuFirstDisplay == 0 )
    {
        if ( LCD_GetScreenOrientation() != previous_Screen_Orientation )
        {
            MenuFirstDisplay = 1;
        }
    }

    if ( MenuFirstDisplay )
    {
        previous_Screen_Orientation = LCD_GetScreenOrientation();
        POINTER_SetMode( POINTER_OFF );
        LCD_SetRotateScreen( 0 );
        LCD_SetScreenOrientation( V12 );


        // Red LED blinks at high frequency.
        LED_Set( LED_RED, LED_BLINKING_HF );

        // Green LED blinks at low frequency.
        LED_Set( LED_GREEN, LED_BLINKING_LF );

        // Init daughter board LED
        DB_LED_Init();

        // Draw a little message on the LCD screen.
        DRAW_SetDefaultColor();
        DRAW_DisplayStringWithMode( 0, Screen_Height - 2 * Char_Height, "Hardware Test", ALL_SCREEN, INVERTED_TEXT, CENTER );
        MenuFirstDisplay = 0;

        // Drawn that rectangle on the screen.
        LCD_FillRect_Circle( BAR_LEFT + 1, BAR_BOTTOM + 1, MAXLEVEL * WIDTH_SQUARE  , WIDTH_SQUARE - 2, RGB_YELLOW );
        LCD_DrawRect( BAR_LEFT, BAR_BOTTOM, MAXLEVEL * WIDTH_SQUARE + 2 , WIDTH_SQUARE, RGB_BLUE );

        // Restrict the move of the pointer to a rectangle.
        POINTER_SetRect( BAR_LEFT + 1, BAR_BOTTOM + 1, MAXLEVEL * WIDTH_SQUARE - POINTER_WIDTH - 2, WIDTH_SQUARE - POINTER_WIDTH - 2 );
        POINTER_SetMode( POINTER_ON );


        fRedrawn = 1;
        RecordPlaySeq = -1;
        AUDIO_Welcome_Msg();
    } // end FirstDisplay

    // The button is pushed, let's get out of here!
    if ( BUTTON_GetState() == BUTTON_PUSHED )
    {
        int i;

        BUTTON_WaitForRelease();

        // Reset CircleOS state.
        MENU_ClearCurrentCommand();
        DRAW_SetDefaultColor();
        DRAW_Clear();
        POINTER_SetMode( POINTER_ON );
        BUTTON_SetMode( BUTTON_ONOFF_FORMAIN );
        POINTER_SetRectScreen();
        DRAW_SetCharMagniCoeff( 1 );

        // Reset backlight PWM rate to its default value.
        LCD_SetBackLight( 0 );

        // Switch LEDs off.
        LED_Set( LED_RED, LED_OFF );
        LED_Set( LED_GREEN, LED_OFF );
        GPIO_WriteBit( GPIOx_DB_LED, GPIO_Pin_DB_LED1, Bit_SET );
        GPIO_WriteBit( GPIOx_DB_LED, GPIO_Pin_DB_LED2, Bit_SET );

        // No sound
        AUDIO_Playback_status = NO_SOUND;
        AUDIO_Recording_status = NO_RECORD;

        // Restore default mode
        AUDIO_SetMode( AUDIO_MODE, LG_8_BITS, FRQ_16KHZ, MONO );

        // Restore the previous config
        AUDIO_SpeakerOn = AUDIO_SpeakerOn_bak;
        AUDIO_Volume = AUDIO_Volume_bak;
        fFirstTime  = 1;

        for ( i = 0; i < MAXAPP; i++ )
        {
            extern tMenuItem*(( *ApplicationTable )[] );
            tMenuItem*  curapp;
            unsigned addr;


            if (( *ApplicationTable )[ -i ] == APP_VOID ) //has been programmed
            {
                break;
            }
            else
            {
                addr   = ( long unsigned )( *ApplicationTable )[ -i ] ;
                addr &= 0x00FFFFFF;
                addr |= 0x08000000;
                curapp = ( tMenuItem* ) addr;
                if ( !strcmp( curapp->Text, "COMMTEST" ) )
                {
                    LCD_SetOffset( OFFSET_ON );
                    CurrentCommand = curapp;
                    CurrentMenu = 0;
                    BUTTON_SetMode( BUTTON_ONOFF );
                    return CurrentCommand ->Fct_Init();
                }
            }
        }
        LCD_SetRotateScreen( 1 );
        LCD_SetScreenOrientation( previous_Screen_Orientation );


        return MENU_LEAVE;
    }

    // Increment the backlight PWM.
    Current_CCR_BackLightStart += 0x800;

    //-- Parrot mode in order to test microphone and speaker
    if (( AUDIO_Playback_status == NO_SOUND ) && ( AUDIO_Recording_status == NO_RECORD ) )
    {

        // Values -1 and 2 for RecordPlaySeq correspond to the first loop.
        // Recording requires a delay (internal to the Codec?) before
        // getting non-zero values. The first cycle provides this delay

        if (( RecordPlaySeq == 0 ) || ( RecordPlaySeq == -1 ) )
        {
            // End of playback, launch the record
            if ( AUDIO_Playback_status == NO_SOUND )
            {
                AUDIO_SetMode( VOICE_MODE, LG_16_BITS, FRQ_16KHZ, MONO );
                // Take all the available memory for the record (= RAM_BASE - data size - 500 bytes for the stack)
                AUDIO_Record(( sound_type* ) RAM_BASE , (( CIRCLEOS_RAM_OFS ) / sizeof( voice_type ) ) - 500 ) ;
            }
            if ( RecordPlaySeq != -1 )
            {
                // Red LED blinks at high frequency.
                LED_Set( LED_GREEN, LED_OFF );
                LED_Set( LED_RED, LED_ON );
                DRAW_DisplayStringWithMode( 0, 160, "** RECORDING **", ALL_SCREEN, NORMAL_TEXT, CENTER );
                RecordPlaySeq = 1;
            }
            else
                RecordPlaySeq = 2;

        }
        else
        {
            if ( AUDIO_Recording_status == NO_RECORD )
            {
                // End of recording, launch the playback
                AUDIO_SetMode( AUDIO_MODE, LG_16_BITS, FRQ_16KHZ, MONO );
                AUDIO_Play(( sound_type* ) RAM_BASE , (( CIRCLEOS_RAM_OFS ) / sizeof( voice_type ) ) - 500 ) ;
            }
            if ( RecordPlaySeq != 2 )
            {
                // Red LED blinks at high frequency.
                LED_Set( LED_GREEN, LED_ON );
                LED_Set( LED_RED, LED_OFF );
                DRAW_DisplayStringWithMode( 0, 160, "** PLAYING **", ALL_SCREEN, NORMAL_TEXT, CENTER );
            }
            RecordPlaySeq = 0;
        }
    }

    if (( AUDIO_Recording_status == IS_RECORDING )  && (( AUDIO_RecordBuffer_GetStatus( 0 ) & HIGH_FULL ) ) )
        AUDIO_Record_Stop();


    // If backlight PWM is too high, restart with a lower value.
    if ( Current_CCR_BackLightStart > 0xF000 )
    {
        Current_CCR_BackLightStart = 0x2000;
    }

    // Every 59th calls display battery voltage and replay melody sample.
    // Note: due to the fRedrawn == 0, the first time the % 59 == 0
    //       (when divider_coord is null), the code block isn't executed.
    if ((( menu_divider_coord++ % 37 ) == 0 ) && ( fRedrawn == 0 ) )
    {
        char TextBuffer[5];
        *TextBuffer = '%'; *( TextBuffer + 1 ) = 0; // YRT20080204 : to avoid memcpy

        DRAW_DisplayVbat( 20, 12 );
        UTIL_uint2str( TextBuffer + 1, PWR_BatteryLevel, 3, 0 );
        DRAW_DisplayString( 170, 12, TextBuffer, 4 );
    }

    // Toggle daughter card leds
    if (( menu_divider_coord % 2 ) == 0 )
    {
        GPIO_WriteBit( GPIOx_DB_LED, GPIO_Pin_DB_LED1, Bit_SET );
        GPIO_WriteBit( GPIOx_DB_LED, GPIO_Pin_DB_LED2, Bit_RESET );
    }
    else
    {
        GPIO_WriteBit( GPIOx_DB_LED, GPIO_Pin_DB_LED1, Bit_RESET );
        GPIO_WriteBit( GPIOx_DB_LED, GPIO_Pin_DB_LED2, Bit_SET );
    }

    return MENU_CONTINUE;
}
/*******************************************************************************
*
*                                TOUCHSCR calibration
*
*******************************************************************************/
enum MENU_code TOUCHSCREEN_Calibration( void )
{
    s32 xpos = TOUCHSCR_Info.xRaw;
    s32 ypos = TOUCHSCR_Info.yRaw;

    // Avoid time display
    fDisplayTime = FALSE;

    // Cancel calibration, if central button pushed
    if ( BUTTON_GetState() == BUTTON_PUSHED )
    {
        BUTTON_WaitForRelease();
        TS_SeqCal = 8;
        return;
    }

    // Force mode when the function is called from the menu
    if ( TOUCHSCR_Info.Mode != TS_CALIBRATION )
    {
        TOUCHSCR_Info.Mode = TS_CALIBRATION;
        TS_SeqCal = 0;
        fTS_InitCal = 0;
    }

    switch ( TS_SeqCal )
    {
    case 0 :
        if ( fTS_InitCal == 0 )
        {
            // Do it only once
            fTS_InitCal = 1;

            // Don't display main screen and block rotation during calibration
            POINTER_SetMode( POINTER_OFF );
            BUTTON_SetMode( BUTTON_ONOFF );
            LCD_SetScreenOrientation( V12 );
            LCD_SetRotateScreen( 0 );

            // Title
            LCD_FillRect_Circle( 0, 0, Screen_Width, Screen_Height, RGB_WHITE );
            DRAW_SetCharMagniCoeff( 2 );
            DRAW_DisplayStringWithMode( 0, 180, "TOUCHSCREEN", ALL_SCREEN, NORMAL_TEXT, CENTER );
            DRAW_DisplayStringWithMode( 0, 150, "CALIBRATION", ALL_SCREEN, NORMAL_TEXT, CENTER );
            DRAW_SetCharMagniCoeff( 1 );

            // Ask for the first button touch
            DRAW_DisplayStringWithMode( 0, 70, "Press on",  ALL_SCREEN, NORMAL_TEXT, CENTER );
            DRAW_DisplayStringWithMode( 0, 55, "the black cross",  ALL_SCREEN, NORMAL_TEXT, CENTER );
            DRAW_DisplayStringWithMode( 0, 40, "with a stylus",  ALL_SCREEN, NORMAL_TEXT, CENTER );
            DRAW_Cross_Absolute( TS_RefSample[0].X, TS_RefSample[0].Y, RGB_BLACK, CROSS_SIZE );
        }

        // When starting calibration from config menu with touchsreen
        // the first point was entered immediately.
        if ( !TOUCHSCR_Info.TouchPress )
        {
            TS_SeqCal++;
        }
        break;

    case 1:
        // Store first touch informations
        if ( TOUCHSCR_Info.TouchPress )
        {
            TS_CalBuffer[0].X = xpos;
            TS_CalBuffer[0].Y = ypos;
            TS_SeqCal++;
        }
        break;

    case 2 :
        // Ask for the second button touch
        if ( !( TOUCHSCR_Info.TouchPress ) )
        {
            LCD_FillRect_Circle( TS_RefSample[0].X - CROSS_SIZE, TS_RefSample[0].Y - CROSS_SIZE,
            ( CROSS_SIZE * 2 ) + 1, ( CROSS_SIZE * 2 ) + 1, RGB_WHITE );
            DRAW_Cross_Absolute( TS_RefSample[1].X, TS_RefSample[1].Y, RGB_BLACK, CROSS_SIZE );
            TS_SeqCal++;
        }
        break;

    case 3:
        // Store second touch informations
        if ( TOUCHSCR_Info.TouchPress )
        {
            TS_CalBuffer[1].X = xpos;
            TS_CalBuffer[1].Y = ypos;
            TS_SeqCal++;
        }
        break;

    case 4:
        if ( !( TOUCHSCR_Info.TouchPress ) )
        {
            // Ask for the third button touch
            LCD_FillRect_Circle( TS_RefSample[1].X - CROSS_SIZE, TS_RefSample[1].Y - CROSS_SIZE,
            ( CROSS_SIZE * 2 ) + 1, ( CROSS_SIZE * 2 ) + 1, RGB_WHITE );
            DRAW_Cross_Absolute( TS_RefSample[2].X, TS_RefSample[2].Y, RGB_BLACK, CROSS_SIZE );
            TS_SeqCal++;
        }
        break;

    case 5 :
        // Store third touch informations
        if ( TOUCHSCR_Info.TouchPress )
        {
            TS_CalBuffer[2].X = xpos;
            TS_CalBuffer[2].Y = ypos;

            TS_SeqCal++;
        }
        break;

    case 6 :
        // End of calibration
        if ( !( TOUCHSCR_Info.TouchPress ) )
        {
            // Calculate and update the coefficients
            TOUCHSCR_CalculateCalibration( TS_CalBuffer );

            // Save the calibration points
            UTIL_WriteBackupRegister( BKP_TS_X0, TS_CalBuffer[0].X );
            UTIL_WriteBackupRegister( BKP_TS_Y0, TS_CalBuffer[0].Y );
            UTIL_WriteBackupRegister( BKP_TS_X1, TS_CalBuffer[1].X );
            UTIL_WriteBackupRegister( BKP_TS_Y1, TS_CalBuffer[1].Y );
            UTIL_WriteBackupRegister( BKP_TS_X2, TS_CalBuffer[2].X );
            UTIL_WriteBackupRegister( BKP_TS_Y2, TS_CalBuffer[2].Y );

            LCD_FillRect_Circle( 0, 0, Screen_Width, Screen_Height, RGB_WHITE );
            DRAW_DisplayStringWithMode( 0, 55, "Calibration", ALL_SCREEN, NORMAL_TEXT, CENTER );
            DRAW_DisplayStringWithMode( 0, 40, "done.", ALL_SCREEN, NORMAL_TEXT, CENTER );
            DRAW_DisplayStringWithMode( 0, 15, "Touch the screen..", ALL_SCREEN, NORMAL_TEXT, CENTER );
            TS_SeqCal++;
        }
        break;

    case 7:
        if ( TOUCHSCR_Info.TouchPress )
            TS_SeqCal++;
        break;

    case 8:
    {
        // Restore normal conditions
        TS_SeqCal = 0;
        TOUCHSCR_Info.Mode = TS_NORMAL;

        // Can display main screen
        POINTER_SetMode( POINTER_ON );
        BUTTON_SetMode( BUTTON_ONOFF_FORMAIN );
        LCD_SetRotateScreen( 1 );
        DRAW_Clear();
    }
    break;

    } // switch ( TS_SeqCal )
} // end function