/*---------------------------------------------------------------------------* Project: TwlSDK - SPI - demos File: main.c Copyright 2003-2008 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Date:: 2008-09-18#$ $Rev: 8573 $ $Author: okubata_ryoma $ *---------------------------------------------------------------------------*/ #include #include "monkey.h" #include "snd_data.h" /*---------------------------------------------------------------------------* Constant Definitions *---------------------------------------------------------------------------*/ #define KEY_REPEAT_START 25 // Number of frames until key repeat starts #define KEY_REPEAT_SPAN 10 // Number of frames between key repeats /*---------------------------------------------------------------------------* Structure Definitions *---------------------------------------------------------------------------*/ // Key input data typedef struct KeyInformation { u16 cnt; // Unprocessed input value u16 trg; // Push trigger input u16 up; // Release trigger input u16 rep; // Press and hold repeat input } KeyInformation; /*---------------------------------------------------------------------------* Internal Function Definitions *---------------------------------------------------------------------------*/ static void Init3D(void); static void Draw3D(void); static void DrawLine(s16 sx, s16 sy, s16 ex, s16 ey, GXRgb color); static void VBlankIntr(void); static void KeyRead(KeyInformation * pKey); /*---------------------------------------------------------------------------* Internal Variable Definitions *---------------------------------------------------------------------------*/ static KeyInformation gKey; static MICAutoParam gMicAutoParam; static u16 gMicData[192]; static TPData gTpData[4]; /*---------------------------------------------------------------------------* Name: NitroMain Description: Initialization and main loop. Arguments: None. Returns: None. *---------------------------------------------------------------------------*/ void NitroMain(void) { // Various types of initialization OS_Init(); OS_InitThread(); OS_InitTick(); OS_InitAlarm(); FX_Init(); GX_Init(); GX_DispOff(); GXS_DispOff(); GX_SetDispSelect(GX_DISP_SELECT_SUB_MAIN); // Initializes display settings GX_SetBankForLCDC(GX_VRAM_LCDC_ALL); MI_CpuClearFast((void *)HW_LCDC_VRAM, HW_LCDC_VRAM_SIZE); (void)GX_DisableBankForLCDC(); MI_CpuFillFast((void *)HW_OAM, 192, HW_OAM_SIZE); MI_CpuClearFast((void *)HW_PLTT, HW_PLTT_SIZE); MI_CpuFillFast((void *)HW_DB_OAM, 192, HW_DB_OAM_SIZE); MI_CpuClearFast((void *)HW_DB_PLTT, HW_DB_PLTT_SIZE); // 3D-related initialization Init3D(); // Interrupt settings OS_SetIrqFunction(OS_IE_V_BLANK, VBlankIntr); (void)OS_EnableIrqMask(OS_IE_V_BLANK); (void)OS_EnableIrq(); (void)OS_EnableInterrupts(); (void)GX_VBlankIntr(TRUE); // Start thread for device sampling MonkeyInit(); // Initialize sound { SND_Init(); SND_AssignWaveArc((SNDBankData *)sound_bank_data, 0, (SNDWaveArc *)sound_wave_data); SND_StartSeq(0, sound_seq_data, 0, (SNDBankData *)sound_bank_data); } // LCD display start GX_DispOn(); GXS_DispOn(); // Debug string output OS_Printf("ARM9: SPI parallel sampling demo \"spiMonkey\" started.\n"); // Empty call for getting key input data (strategy for pressing A button in the IPL) KeyRead(&gKey); // Main loop while (TRUE) { // Get key input data KeyRead(&gKey); // Get mic and touch panel input information MonkeyGetNewMicData(192, gMicData); MonkeyGetNewTpData(4, gTpData); // Render Draw3D(); // Sound while (SND_RecvCommandReply(SND_COMMAND_NOBLOCK) != NULL) { } (void)SND_FlushCommand(SND_COMMAND_NOBLOCK); // Waiting for the V-Blank OS_WaitVBlankIntr(); } } /*---------------------------------------------------------------------------* Name: Init3D Description: Initialization for 3D display. Arguments: None. Returns: None. *---------------------------------------------------------------------------*/ static void Init3D(void) { G3X_Init(); G3X_InitMtxStack(); G3_SwapBuffers(GX_SORTMODE_AUTO, GX_BUFFERMODE_W); GX_SetGraphicsMode(GX_DISPMODE_GRAPHICS, GX_BGMODE_0, GX_BG0_AS_3D); GX_SetVisiblePlane(GX_PLANEMASK_BG0); G2_SetBG0Priority(0); G3X_SetShading(GX_SHADING_TOON); G3X_AlphaTest(FALSE, 0); G3X_AlphaBlend(TRUE); G3X_AntiAlias(TRUE); G3X_EdgeMarking(FALSE); G3X_SetFog(FALSE, (GXFogBlend)0, (GXFogSlope)0, 0); G3X_SetClearColor(0, 0, 0x7fff, 63, FALSE); G3_ViewPort(0, 0, 255, 191); } /*---------------------------------------------------------------------------* Name: Draw3D Description: Displays waveforms in 3D. Arguments: None. Returns: None. *---------------------------------------------------------------------------*/ static void Draw3D(void) { G3X_Reset(); G3_MtxMode(GX_MTXMODE_PROJECTION); G3_Identity(); G3_MtxMode(GX_MTXMODE_POSITION_VECTOR); G3_Identity(); G3_PolygonAttr(GX_LIGHTMASK_NONE, GX_POLYGONMODE_MODULATE, GX_CULL_NONE, 0, 31, 0); { s32 i; // Waveform display of mic data for (i = 0; i < 191; i++) { DrawLine((s16)(gMicData[i] >> 8), (s16)(i), (s16)(gMicData[i + 1] >> 8), (s16)(i + 1), GX_RGB(31, 31, 0)); } // Display Touch Panel contact as '+' mark for (i = 0; i < 4; i++) { if (gTpData[i].touch == TP_TOUCH_ON) { if (!(gTpData[i].validity & TP_VALIDITY_INVALID_X)) { // Display the x coordinate with a line DrawLine((s16)(gTpData[i].x), (s16)(0), (s16)(gTpData[i].x), (s16)(191), GX_RGB(31 - (i * 6), 31 - (i * 6), 31 - (i * 6))); } if (!(gTpData[i].validity & TP_VALIDITY_INVALID_Y)) { // Display the y coordinate with a line DrawLine((s16)(0), (s16)(gTpData[i].y), (s16)(255), (s16)(gTpData[i].y), GX_RGB(31 - (i * 6), 31 - (i * 6), 31 - (i * 6))); } } } } G3_SwapBuffers(GX_SORTMODE_AUTO, GX_BUFFERMODE_W); } /*---------------------------------------------------------------------------* Name: DrawLine Description: Renders lines with triangular polygons. Arguments: sx: X-coordinate of line's starting point sy: Y-coordinate of line's starting point ex: X-coordinate of line's ending point ey: Y-coordinate of line's ending point color: Color of line drawn Returns: None. *---------------------------------------------------------------------------*/ static void DrawLine(s16 sx, s16 sy, s16 ex, s16 ey, GXRgb color) { fx16 fsx; fx16 fsy; fx16 fex; fx16 fey; fsx = (fx16)(((sx - 128) * 0x1000) / 128); fsy = (fx16)(((96 - sy) * 0x1000) / 96); fex = (fx16)(((ex - 128) * 0x1000) / 128); fey = (fx16)(((96 - ey) * 0x1000) / 96); G3_Begin(GX_BEGIN_TRIANGLES); { G3_Color(color); G3_Vtx(fsx, fsy, 0); G3_Color(color); G3_Vtx(fex, fey, 0); G3_Color(color); G3_Vtx(fsx, fsy, 1); } G3_End(); } /*---------------------------------------------------------------------------* Name: VBlankIntr Description: V-Blank interrupt vector. Arguments: None. Returns: None. *---------------------------------------------------------------------------*/ static void VBlankIntr(void) { // Sets the IRQ check flag OS_SetIrqCheckFlag(OS_IE_V_BLANK); } /*---------------------------------------------------------------------------* Name: KeyRead Description: Edits key input data. Detects press trigger, release trigger, and press-and-hold repeat. Arguments: pKey: Structure that holds key input data to be edited Returns: None. *---------------------------------------------------------------------------*/ static void KeyRead(KeyInformation * pKey) { static u16 repeat_count[12]; int i; u16 r; r = PAD_Read(); pKey->trg = 0x0000; pKey->up = 0x0000; pKey->rep = 0x0000; for (i = 0; i < 12; i++) { if (r & (0x0001 << i)) { if (!(pKey->cnt & (0x0001 << i))) { pKey->trg |= (0x0001 << i); // Press trigger repeat_count[i] = 1; } else { if (repeat_count[i] > KEY_REPEAT_START) { pKey->rep |= (0x0001 << i); // Press-and-hold repeat repeat_count[i] = KEY_REPEAT_START - KEY_REPEAT_SPAN; } else { repeat_count[i]++; } } } else { if (pKey->cnt & (0x0001 << i)) { pKey->up |= (0x0001 << i); // Release trigger } } } pKey->cnt = r; // Unprocessed key input } /*---------------------------------------------------------------------------* End of file *---------------------------------------------------------------------------*/