📄 otg_demo.c
字号:
char bf[ 64 ];
unsigned short rx_size;
unsigned char key;
unsigned char i;
if ( OTG_grab_far_end_device() )
return;
mprintf( LIGHTCYAN, CONTINUE, "\r\n\r\nOTG feature demo : " );
mprintf( WHITE, CONTINUE, "Play music on remote peer\r\n" );
if ( OTG_command_to_device( bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_CTRL_AUDIO, OTG_DEMO_SUB_COMMAND_AUDIO_STATE | 0, 1, &rx_size, 1 ) )
{
OTG_release_far_end_device();
return;
}
if ( ((*bf) & 0xC) != 0xC ) // "0xC" means playing beep
{
if ( !((*bf) & 0x1) )
{
mprintf( LIGHTGRAY, CONTINUE, "\r\n remote peer " );
mprintf( LIGHTGREEN, CONTINUE, "%s", g_far_end.id_name );
mprintf( LIGHTGRAY, CONTINUE, " have " );
mprintf( LIGHTRED, CONTINUE, "no audio device\r\n\r\n" );
OTG_release_far_end_device();
return;
}
else if ( ((*bf) & 0x2) )
{
if ( OTG_command_to_device( bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_CTRL_AUDIO, OTG_DEMO_SUB_COMMAND_AUDIO_START | 0, 1, &rx_size, 1 ) )
{
OTG_release_far_end_device();
return;
}
mprintf( LIGHTGRAY, CONTINUE, "\r\n remote peer " );
mprintf( LIGHTGREEN, CONTINUE, "%s", g_far_end.id_name );
mprintf( LIGHTGRAY, CONTINUE, " music play " );
mprintf( LIGHTRED, CONTINUE, "cancelled\r\n\r\n" );
OTG_release_far_end_device();
return;
}
}
/*
* Get audio file list on remote
*/
mprintf( WHITE, CONTINUE, "\r\n remote peer " );
mprintf( LIGHTGREEN, CONTINUE, "%s", g_far_end.id_name );
mprintf( WHITE, CONTINUE, " audio file list.\r\n" );
for ( i = 0; i < MAX_NUM_OF_AUDIO_FILES; i++ )
{
if ( OTG_command_to_device( bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_CTRL_AUDIO, OTG_DEMO_SUB_COMMAND_LIST_ITEM | i, 64, &rx_size, 1 ) )
{
OTG_release_far_end_device();
return;
}
if ( rx_size == 0 )
break;
*(bf + rx_size) = 0;
mprintf( YELLOW, CONTINUE, " [%d] ", i );
mprintf( WHITE, CONTINUE, "%s\r\n", bf );
}
num_of_items = i;
for ( ; i < MAX_NUM_OF_AUDIO_FILES; i++ )
mprintf( BROWN, CONTINUE, " [%d]\r\n", i );
do
{
mprintf( WHITE, CONTINUE, " Type a number [0-%u] >> ", num_of_items - 1 );
key = ui_key_wait() - '0';
mprintf( WHITE, CONTINUE, "%c\r\n", key + '0' );
if ( key < num_of_items )
{
if ( OTG_command_to_device( bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_CTRL_AUDIO, OTG_DEMO_SUB_COMMAND_AUDIO_START | key, 1, &rx_size, 1 ) )
return;
else
break;
}
}
while ( 0 );
mprintf( WHITE, CONTINUE, "Play start command issued to remote\r\n" );
do
{
if ( OTG_command_to_device( bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_CTRL_AUDIO, OTG_DEMO_SUB_COMMAND_AUDIO_STATE | 0, 1, &rx_size, 1 ) )
{
OTG_release_far_end_device();
return;
}
if ( *bf & 0x1 )
break;
}
while ( 1 );
OTG_release_far_end_device();
}
// 999 999 999 999 999 999 999
// 9 9 9 9 9 9 9 9 9 9 9 9 9 9
// 9 9 9 9 9 9 9 9 9 9 9 9 9 9
// 9999 9999 9999 9999 9999 9999 9999
// 9 9 9 9 9 9 9
// 999 999 999 999 999 999 999
// PPPP EEEE RRRR I PPPP H H PPPP EEEE RRRR I PPPP H H PPPP EEEE RRRR I PPPP H H
// P P E R R I P P H H P P E R R I P P H H P P E R R I P P H H
// P P EEE R R I P P HHHHH P P EEE R R I P P HHHHH P P EEE R R I P P HHHHH
// PPP E RRRR I PPPP H H PPP E RRRR I PPPP H H PPP E RRRR I PPPP H H
// P EEEE R R I P H H P EEEE R R I P H H P EEEE R R I P H H
/*
** OTG demo applet "Get audio list item"
**
** Peripheral side service
*/
unsigned char OTG_demo_peripheral_side_9_0( char *s, unsigned short *length, unsigned char index )
{
unsigned char audio_start_flag = False;
switch ( index & 0x70 )
{
case OTG_DEMO_SUB_COMMAND_LIST_ITEM :
Dc_printf( WHITE, CONTINUE, "Music file list item #%d (string) returned. by request from remote\r\n", index & 0xF );
if ( !(*gp_sing_file_strings[ index & 0xF ].file_path_and_name) )
{
sprintf( s, "" );
*length = 0;
}
else
{
if ( *(gp_sing_file_strings[ index ].file_comment) != 0 )
strncpy( s, gp_sing_file_strings[ index ].file_comment, 63 );
else
strncpy( s, gp_sing_file_strings[ index ].file_path_and_name, 63 );
*(s + 63) = 0;
*length = strlen( s );
}
break;
case OTG_DEMO_SUB_COMMAND_AUDIO_START :
*s = 0;
*length = 0x1;
audio_start_flag = True;
break;
case OTG_DEMO_SUB_COMMAND_AUDIO_STATE :
*s = ((is_audio_beep_play() << 3) | (is_audio_active() ? 0x4 : 0x0)| (is_audio_in_play() << 1) | is_audio_exist() );
*length = 1;
break;
default :
break;
}
return ( audio_start_flag );
}
void OTG_demo_peripheral_side_9_11( unsigned char index )
{
index &= 0xF;
audio_main( index );
mprintf( WHITE, CONTINUE, "Audio play started from remote\r\n" );
}
// 000 000 000 000 000 000 000
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 000 000 000 000 000 000 000
// H H OOO SSSS TTTTT H H OOO SSSS TTTTT H H OOO SSSS TTTTT H H OOO SSSS TTTTT
// H H O O S T H H O O S T H H O O S T H H O O S T
// HHHHH O O SSS T HHHHH O O SSS T HHHHH O O SSS T HHHHH O O SSS T
// H H O O S T H H O O S T H H O O S T H H O O S T
// H H OOO SSSS T H H OOO SSSS T H H OOO SSSS T H H OOO SSSS T
/********* ********** ********** ********** ********** ********** ********** ********** ********** **********
OTG demo applet "Executable update through OTG"
********* ********** ********** ********** ********** ********** ********** ********** ********** **********/
#define OTG_DEMO_SUB_COMMAND_DATA_REQUEST 0x00
#define OTG_DEMO_SUB_COMMAND_GET_TRANSFER_STATUS 0x01
#define OTG_DEMO_SUB_COMMAND_TRANSFER_RESET 0x02
#define OTG_DEMO_SUB_COMMAND_GET_FILE_MODIFIED_TIME 0x03
#define OTG_DEMO_SUB_COMMAND_GET_BUILD_INFO 0x04
#define OTG_DEMO_SUB_COMMAND_GET_SIZE_AND_CHECKSUM 0x05
unsigned long get_application_file_time( void );
unsigned long file_modified_time( int fh );
/*
** OTG demo applet "Executable update through OTG"
**
** Host side service
*/
void OTG_demo_host_side_0( void )
{
char bf[ 64 ];
unsigned short rx_size;
char status_bf[ 65 ];
unsigned short status_rx_size;
unsigned short wt_size;
unsigned long total_size = 0;
char tmp_file_name[] = "test.exe";
int err;
int file_handle;
unsigned long checksum;
unsigned short i = 0;
unsigned char ci;
char key;
#if 0
unsigned long local_file_time = 0;
unsigned long remote_file_time = 0;
#endif
if ( OTG_grab_far_end_device() )
return;
mprintf( LIGHTCYAN, CONTINUE, "\r\n\r\nOTG feature demo : " );
mprintf( WHITE, CONTINUE, "Updating application. Copy from remote... \r\n" );
mprintf( LIGHTGRAY, CONTINUE, " remote peer " );
mprintf( LIGHTGREEN, CONTINUE, "%s", g_far_end.id_name );
mprintf( LIGHTGRAY, CONTINUE, " >>>" );
mprintf( LIGHTRED, CONTINUE, "copy" );
mprintf( LIGHTGRAY, CONTINUE, ">>>" );
mprintf( LIGHTGRAY, CONTINUE, " local peer name " );
mprintf( LIGHTGREEN, CONTINUE, "%s\r\n", gp_id_string );
#if 0
/*
** Check remote and local file time
*/
status_rx_size = sizeof( unsigned long );
if ( devep_std_request( (unsigned char *)status_bf, dvi_ptr, 0xC003, (OTG_DEMO_APP_UPDATE << 8) | (OTG_DEMO_SUB_COMMAND_GET_FILE_MODIFIED_TIME & 0xFF), 0, &status_rx_size ) )
;
remote_file_time = *((unsigned long *)status_bf);
if ( !remote_file_time )
mprintf( LIGHTRED, CONTINUE, "error for remote side file\r\n" );
local_file_time = get_application_file_time();
mprintf( LIGHTGREEN, CONTINUE, "%lu %lu %lu \r\n", local_file_time, remote_file_time, time( NULL ) );
if ( local_file_time == remote_file_time )
mprintf( LIGHTGREEN, CONTINUE, " These files may be same %lu - %lu ^ %lu\r\n", local_file_time, remote_file_time, time( NULL ) );
else if ( local_file_time > remote_file_time )
mprintf( LIGHTGREEN, CONTINUE, " Local file may be newer then remote %lu - %lu\r\n", local_file_time, remote_file_time );
else
mprintf( LIGHTGREEN, CONTINUE, " Remote file may be newer then local %lu - %lu\r\n", local_file_time, remote_file_time );
strftime( status_bf, 64, "%d-%b-%Y %H:%M:%S", localtime( &local_file_time ) );
mprintf( LIGHTGREEN, CONTINUE, " Local file (%s) ", status_bf );
strftime( status_bf, 64, "%d-%b-%Y %H:%M:%S", localtime( &remote_file_time ) );
mprintf( LIGHTGREEN, CONTINUE, " Remote file (%s) ", status_bf );
#endif
if ( OTG_command_to_device( status_bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_APP_UPDATE, OTG_DEMO_SUB_COMMAND_GET_BUILD_INFO, 64, &status_rx_size, 1 ) )
{
OTG_release_far_end_device();
return;
}
*(status_bf + status_rx_size) = 0;
mprintf( WHITE, CONTINUE, " remote side app version / build time : " );
mprintf( YELLOW, CONTINUE, "%s\r\n", status_bf );
mprintf( WHITE, CONTINUE, " local side app version / build time : " );
mprintf( YELLOW, CONTINUE, "v %s / %s, %s\r\n", VERSION_NUMBER, __DATE__, __TIME__ );
mprintf( LIGHTGREEN, CONTINUE, "\r\n press [y] to continue\r\n" );
if ( 'y' != (ui_key_wait() & 0xFF) )
{
OTG_release_far_end_device();
return;
}
mprintf( LIGHTGREEN, CONTINUE, "\r\n" );
/*
** Open local file
**
*/
_fmode = O_BINARY;
if ( 0 != (err = _dos_creat( tmp_file_name, _A_NORMAL, &file_handle )) )
{
mprintf( LIGHTGREEN, CONTINUE, "\r\n error @ opening print source file \"%s\" in OTG_demo_host_side_0() err=%d\r\n", tmp_file_name, err );
return;
}
/*
** File transfer reset for remote side
**
*/
if ( OTG_command_to_device( status_bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_APP_UPDATE, OTG_DEMO_SUB_COMMAND_TRANSFER_RESET, 0, &status_rx_size, 1 ) )
{
OTG_release_far_end_device();
return;
}
/*
** File transfer process
**
*/
checksum = 0;
do
{
if ( OTG_command_to_device( bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_APP_UPDATE, OTG_DEMO_SUB_COMMAND_DATA_REQUEST, 64, &rx_size, 3 ) )
{
OTG_release_far_end_device();
return;
}
for ( ci = 0; ci < rx_size; ci++ )
checksum += (unsigned long)*((unsigned char *)bf + ci);
_dos_write( file_handle, bf, rx_size, (unsigned *)(&wt_size) );
total_size += rx_size;
if ( !(i++ & 0x3F) )
{
status_rx_size = 64;
if ( OTG_command_to_device( status_bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_APP_UPDATE, OTG_DEMO_SUB_COMMAND_GET_TRANSFER_STATUS, 64, &status_rx_size, 1 ) )
return;
*(status_bf + status_rx_size) = 0;
mprintf( WHITE, CONTINUE, " file transfer state : %s\r", status_bf );
}
}
while ( rx_size == 64 );
status_rx_size = 64;
if ( OTG_command_to_device( status_bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_APP_UPDATE, OTG_DEMO_SUB_COMMAND_GET_TRANSFER_STATUS, 64, &status_rx_size, 1 ) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -