/*---------------------------------------------------------------------------*
  Project:  NitroSDK - MB - demos - fake_child
  File:     gmain.c

  Copyright 2003,2004 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.

  $Log: gmain.c,v $
  Revision 1.1  2004/11/22 13:01:10  takano_makoto
 Save as identical to multiboot-model file


  $NoKeywords: $
 *---------------------------------------------------------------------------*/


#include <nitro.h>

#include "gmain.h"
#include "common.h"
#include "disp.h"
#include "wh.h"



//============================================================================
//  Variable definitions
//============================================================================

//-----------------------
// For data sharing
//-----------------------
static u8   sSendBuf[256] ATTRIBUTE_ALIGN(32);  // Send buffer (need 32 byte align )
static u8   sRecvBuf[256] ATTRIBUTE_ALIGN(32);  // Sent buffer (need 32 byte align)
static BOOL sRecvFlag[ 1 + WM_NUM_MAX_CHILD ];  // Receive flag
static GShareData *sShareDataPtr;

//-----------------------
// For key sharing
//-----------------------
static WMKeySet sKeySet;


//============================================================================
//  Function defintions
//============================================================================

/*---------------------------------------------------------------------------*
  Name:         GInitDataShare

  Description:  Intializes the data sharing buffer settings 

  Arguments:    None

  Returns:      None
 *---------------------------------------------------------------------------*/
void GInitDataShare( void )
{
    sShareDataPtr = (GShareData *)sSendBuf;
    
    DC_FlushRange(sSendBuf, 4);

    // KT_Init(KT_KeyEntriesSample);
}


/*---------------------------------------------------------------------------*
  Name:         GStepDataShare

  Description:  Advances synchronization of data sharing by one. 

  Arguments:    None

  Returns:      None
 *---------------------------------------------------------------------------*/
void GStepDataShare( s32 frame )
{
    sShareDataPtr->count = frame;
    sShareDataPtr->key   = GetPressKey();
    
    switch ( WH_GetSystemState() )
    {
    //------------------------------
    // Data sharing communication
    case WH_SYSSTATE_DATASHARING:
        {
            u16 i;
            u8 *adr;
            
            if ( ! WH_StepDS( sSendBuf ) )
            {
                // Data sharing communication failed
                return;
            }
            
            for ( i = 0; i < 16; ++i )
            {
                adr = (u8*)WH_GetSharedDataAdr( i );
                if ( adr != NULL )
                {
                    MI_CpuCopy8( adr, &(sRecvBuf[ i * sizeof(GShareData) ]), sizeof(GShareData) );
                    sRecvFlag[i] = TRUE;
                }
                else
                {
                    sRecvFlag[i] = FALSE;
                }
            }
        }
        break;
    //------------------------------
    // Key sharing communication
    case WH_SYSSTATE_KEYSHARING:
        {
            (void)WH_GetKeySet( &sKeySet );
            if ((sKeySet.key[0] != 0) || (sKeySet.key[1] != 0))
            {
                OS_TPrintf("0 -> %04x 1 -> %04x\n", sKeySet.key[0], sKeySet.key[1]);
            }
        }
    }
}






/*---------------------------------------------------------------------------*
  Name:         GMain

  Description:  Main routine for both parent and child 

  Arguments:    None

  Returns:      None
 *---------------------------------------------------------------------------*/
void GMain( void )
{
    
    BgPrintStr( 4 , 3 , 0x4 , "Send:     %04x-%04x" ,
                 sShareDataPtr->key,
                 sShareDataPtr->count );
    BgPutString( 4 , 5 , 0x4 , "Receive:" );
    {
        s32     i;
    
        for ( i = 0 ; i < ( WM_NUM_MAX_CHILD + 1 ) ; i ++ )
        {
            if ( sRecvFlag[ i ] )
            {
                GShareData *sd;
                sd = (GShareData*)(&(sRecvBuf[ i * sizeof(GShareData) ]));
                
                BgPrintStr( 4 , (s16)( 6 + i ) , 0x4 ,
                             "Player%02d: %04x-%04x" ,
                             i ,
                             sd->key,
                             sd->count & 0xffff);
            }
            else
            {
                BgPutString( 4 , (s16)( 6 + i ) , 0x7 , "No child" );
            }
        }
    }
    
    if ( IS_PAD_TRIGGER( PAD_BUTTON_START ) )
    {
        //********************************
        (void)WH_Finalize();
        //********************************
    }
}



