Esempio n. 1
0
/**
 * @brief 		Screening thread
 * @param   	pvParameters is void pointer.
 * @return 		None
 */
void vScreeningTask(void *pvParameters) {



	if(xTaskCreate(vRefreshingTask,"Refreshing",128, NULL, (tskIDLE_PRIORITY + 2UL),NULL))
	{
		#if defined (__DEBUG_ON)
		printf("Refreshing Task created successfully.. \n");
		#endif
	}

	if(xTaskCreate(vKeyListenerTask,"KeyListener",128, NULL, (tskIDLE_PRIORITY + 2UL),NULL))
	{
		#if defined (__DEBUG_ON)
		printf("KeyListener Task created successfully.. \n");
		#endif
	}


	while(1){
	DSP_write(); /*update environmental condition on screen*/
	//	ver donde va!!!  xSemaphoreGive( xSaveEnvironmentalSemaphore );
	}

}
Esempio n. 2
0
static void SPC_load_state( THIS, struct cpu_regs_t const* cpu_state,
        const void* new_ram, const void* dsp_state )
{
    ci->memcpy(&(this->r),cpu_state,sizeof this->r);
        
    /* ram */
    ci->memcpy( RAM, new_ram, sizeof RAM );
    ci->memcpy( this->extra_ram, RAM + ROM_ADDR, sizeof this->extra_ram );
    
    /* boot rom (have to force enable_rom() to update it) */
    this->rom_enabled = !(RAM [0xF1] & 0x80);
    SPC_enable_rom( this, !this->rom_enabled );
    
    /* dsp */
    /* some SPCs rely on DSP immediately generating one sample */
    this->extra_cycles = 32; 
    DSP_reset( &this->dsp );
    int i;
    for ( i = 0; i < REGISTER_COUNT; i++ )
        DSP_write( &this->dsp, i, ((uint8_t const*) dsp_state) [i] );
    
    /* timers */
    for ( i = 0; i < TIMER_COUNT; i++ )
    {
        struct Timer* t = &this->timer [i];
        
        t->next_tick = -EXTRA_CLOCKS;
        t->enabled = (RAM [0xF1] >> i) & 1;
        if ( !t->enabled )
            t->next_tick = TIMER_DISABLED_TIME;
        t->count = 0;
        t->counter = RAM [0xFD + i] & 15;
        
        int p = RAM [0xFA + i];
        if ( !p )
            p = 0x100;
        t->period = p;
    }
    
    /* Handle registers which already give 0 when read by
       setting RAM and not changing it.
       Put STOP instruction in registers which can be read,
       to catch attempted execution. */
    RAM [0xF0] = 0;
    RAM [0xF1] = 0;
    RAM [0xF3] = 0xFF;
    RAM [0xFA] = 0;
    RAM [0xFB] = 0;
    RAM [0xFC] = 0;
    RAM [0xFD] = 0xFF;
    RAM [0xFE] = 0xFF;
    RAM [0xFF] = 0xFF;
}
Esempio n. 3
0
void SPC_write( THIS, unsigned addr, int data, long const time )
{
    /* first page is very common */
    if ( addr < 0xF0 )
    {
        RAM [addr] = (uint8_t) data;
    }
    else switch ( addr )
    {
        /* RAM */
        default:
            if ( addr < ROM_ADDR )
            {
                RAM [addr] = (uint8_t) data;
            }
            else
            {
                this->extra_ram [addr - ROM_ADDR] = (uint8_t) data;
                if ( !this->rom_enabled )
                    RAM [addr] = (uint8_t) data;
            }
            break;
        
        /* DSP */
        /*case 0xF2:*/ /* mapped to RAM */
        case 0xF3: {
            SPC_run_dsp( this, time );
            int reg = RAM [0xF2];
            if ( reg < REGISTER_COUNT ) {
                DSP_write( &this->dsp, reg, data );
            }
            else {
                /*dprintf( "DSP write to $%02X\n", (int) reg ); */
            }
            break;
        }
        
        case 0xF0: /* Test register */
            /*dprintf( "Wrote $%02X to $F0\n", (int) data ); */
            break;
        
        /* Config */
        case 0xF1:
        {
            int i;
            /* timers */
            for ( i = 0; i < TIMER_COUNT; i++ )
            {
                struct Timer * t = this->timer+i;
                if ( !(data & (1 << i)) )
                {
                    t->enabled = 0;
                    t->next_tick = TIMER_DISABLED_TIME;
                }
                else if ( !t->enabled )
                {
                    /* just enabled */
                    t->enabled = 1;
                    t->counter = 0;
                    t->count = 0;
                    t->next_tick = time;
                }
            }
            
            /* port clears */
            if ( data & 0x10 )
            {
                RAM [0xF4] = 0;
                RAM [0xF5] = 0;
            }
            if ( data & 0x20 )
            {
                RAM [0xF6] = 0;
                RAM [0xF7] = 0;
            }
            
            SPC_enable_rom( this, (data & 0x80) != 0 );
            break;
        }
        
        /* Ports */
        case 0xF4:
        case 0xF5:
        case 0xF6:
        case 0xF7:
            /* to do: handle output ports */
            break;

        /* verified on SNES that these are read/write (RAM) */
        /*case 0xF8: */
        /*case 0xF9: */
        
        /* Timers */
        case 0xFA:
        case 0xFB:
        case 0xFC: {
            int i = addr - 0xFA;
            struct Timer* t = &this->timer [i];
            if ( (t->period & 0xFF) != data )
            {
                Timer_run( t, time );
                this->timer[i].period = data ? data : 0x100;
            }
            break;
        }
        
        /* Counters (cleared on write) */
        case 0xFD:
        case 0xFE:
        case 0xFF:
            /*dprintf( "Wrote to counter $%02X\n", (int) addr ); */
            this->timer [addr - 0xFD].counter = 0;
            break;
    }
}
Esempio n. 4
0
// Panel task: interaction with the Chameleon panel
static rtems_task panel_task(rtems_task_argument argument)
{
    static rtems_signed32 volume_table[128];
    static rtems_signed32 linear_table[128];
    rtems_unsigned32  	key_bits;
    rtems_unsigned32	dummy=0xFFFFFFFF;
    rtems_unsigned8 	potentiometer;
    rtems_unsigned8 	encoder;
    rtems_signed8	increment;
    char		text[17];
    
    rtems_unsigned8 value;
    int i;
    float dB;


    TRACE("Project work template for sample-based audio input and output\n");

    // Precalculate gain values for different volume settings
    for (i=0; i<128 ;i++) {
    	if (i < 27)
            dB = -90.0 + (float) 40.0*i/27.0;
        else
            dB = -50.0 + (float) 50.0*(i-27)/100.0;
        volume_table[i] = float_to_fix_round(pow(10.0, dB/20.0));
    }
    volume_table[0] = 0;
    
    // Precalculate a linear table to scale the potentiometer values linearily between 0..~1
    for (i=1; i<128 ;i++) 
    {
    	linear_table[i]=float_to_fix_round((float)i/127.0);	
    }
	
    // Main loop
    while (TRUE) 
    {

        // *** Write your panel interaction code here ***
	//Poll for panel events
        if (!panel_in_new_event(panel, TRUE))
        	Error("ERROR: unexpected exit waiting new panel event.\n");
        if (panel_in_potentiometer(panel, &potentiometer, &value)) 
        {
		switch (potentiometer)
		{
	             	case PANEL01_POT_VOLUME:	
	                	DSP_write(PANEL01_POT_VOLUME,volume_table[value]);
			       	panel_out_lcd_print(panel, 0, 0, "Volume:         ");
			       	break;
	                case PANEL01_POT_CTRL1:		
	                    	DSP_write(PANEL01_POT_CTRL1,linear_table[value]);
			    	panel_out_lcd_print(panel, 0, 0, "Ctrl1:          ");
			       	break;
	                case PANEL01_POT_CTRL2:		
                	    	DSP_write(PANEL01_POT_CTRL2,linear_table[value]);
                	    	panel_out_lcd_print(panel, 0, 0, "Ctrl2:          ");
			       	break;
		      	case PANEL01_POT_CTRL3:		
	                    	DSP_write(PANEL01_POT_CTRL3,linear_table[value]);
	                	panel_out_lcd_print(panel, 0, 0, "Ctrl3:          ");
			       	break;
			
	                default:
	                	break;
        	}
                       
        }
        else if (panel_in_keypad(panel, &key_bits))
	{
	
		key_bits>>=8;	//NOTE! shift 8 bits to fit in 24bits in the dsp
		DSP_write(KEYPAD_EVENT,key_bits);
		panel_out_lcd_print(panel, 0, 0, "Keypad:         ");
			
	}
	else if (panel_in_encoder(panel, &encoder, &increment))