/** * @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 ); } }
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; }
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; } }
// 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))