📄 tmcons.c
字号:
// wait for keypress ebfore termination.#define DEFAULT_WAITFORKEY 1int main ( int argc, char *argv[] ){ TMSTD_VERSION_INFO Version; HANDLE hStartEvent; WORD wIdxArg;// INPUT_RECORD CarriageReturn[2]; CHAR szEventName[80]; CHAR szDeviceName[16]; BOOL fWaitForKey = TRUE; STATUS Status; TMMAN_DSP_CAPS Caps; fprintf ( stderr, "\r\nTriMedia Console - (c)Philips Semiconductors Version [%d.%d.%d]\r\n", verGetFileMajorVersion (), verGetFileMinorVersion (), verGetFileBuildVersion () ); Stdin = GetStdHandle ( STD_INPUT_HANDLE ); Stdout = GetStdHandle ( STD_OUTPUT_HANDLE ); Stderr = GetStdHandle ( STD_ERROR_HANDLE ); // initialize the command parameter structures StdInParam.Redirected = FALSE; StdOutParam.Redirected = FALSE; StdErrParam.Redirected = FALSE; /* process the command line arguments here */ for ( wIdxArg = 1; wIdxArg < argc ; wIdxArg++ ) { if( argv[wIdxArg][0] != '-' ) { goto mainExit1; } switch ( toupper ( argv[wIdxArg][1]) ) { case 'W' : { DWORD dwWindowLines; COORD ConsoleSize; sscanf(&argv[wIdxArg][2], "%x", &dwWindowLines ); ConsoleSize.X = 80; ConsoleSize.Y = (WORD)dwWindowLines; SetConsoleScreenBufferSize ( GetStdHandle ( STD_OUTPUT_HANDLE ), ConsoleSize ); } break; case 'D' : sscanf(&argv[wIdxArg][2], "%x", &DSPNumber ); // use the dsp number to link to the server event sprintf( szEventName, "TMConsStartEvent%x", DSPNumber ); // we signal the start event so that tmDSPLoadExecutable can go ahead // and start the excecutable. this needs to be done since the DSP // start up before tmcons is ready to service requests and screws up. if ( ( hStartEvent = OpenEvent ( EVENT_MODIFY_STATE, TRUE, szEventName ) ) == NULL ) { fprintf ( stderr, "\r\nTMCons : OpenEvent [%s] : FAIL[%x] \r\n" , szEventName, GetLastError() ); goto mainExit1; } break; case 'A' : fprintf ( stderr, "\nAuthor Tilakraj Roy : troy@trimedia.scs.philips.com\n"); break; case 'R' : // si se so if ( ( wIdxArg + 1 ) == argc ) { goto mainExit2; } switch ( toupper ( argv[wIdxArg][2] ) ) { case 'I' : if ( argv[wIdxArg + 1][0] == '-' ) { fprintf ( stderr, "\r\nTMCons : ERROR : Invalid Input Redirection File Name\r\n" ); break; } if ( ( StdInParam.Handle = (DWORD)_open ( argv[++wIdxArg], _O_BINARY | O_RDONLY ) ) == 0xffffffff ) { fprintf ( stderr, "\r\nTMCons : ERROR : Cannot Open StdIn Redirection File [%s]\r\n", argv[wIdxArg] ); break; } StdInParam.Redirected = TRUE; break; case 'O' : if ( argv[wIdxArg + 1][0] == '-' ) { fprintf ( stderr, "\r\nTMCons : ERROR : Invalid Output Redirection File Name\r\n" ); break; } if ( ( StdOutParam.Handle = (DWORD)_open ( argv[++wIdxArg], _O_BINARY | _O_CREAT | _O_TRUNC | _O_WRONLY ) ) == 0xffffffff ) { fprintf ( stderr, "\r\nTMCons : ERROR : Cannot Open StdOut Redirection File [%s]\r\n", argv[wIdxArg] ); break; } StdOutParam.Redirected = TRUE; break; case 'E' : if ( argv[wIdxArg + 1][0] == '-' ) { fprintf ( stderr, "\r\nTMCons : ERROR : Invalid Error Redirection File Name\r\n" ); break; } if ( ( StdErrParam.Handle = (DWORD)_open ( argv[++wIdxArg], _O_BINARY | _O_CREAT | _O_TRUNC | _O_WRONLY ) ) == 0xffffffff ) { fprintf ( stderr, "\r\nTMCons : ERROR : Cannot Open StdErr Redirection File [%s]\r\n", argv[wIdxArg] ); } StdErrParam.Redirected = TRUE; break; default : fprintf ( stderr, "\r\nTMCons : Cannot be invoked from command line\r\n" ); goto mainExit2; } } } Version.dwMajor = verGetFileMajorVersion(); Version.dwMinor = verGetFileMinorVersion(); if ( ( tmNegotiateVersion ( TMMAN_DEFAULT, &Version ) ) != TMOK ) { fprintf ( stderr, "\r\nTMCons : ERROR : Obsolete version of TMCons.exe : Terminating ... " ); goto mainExit3; } if ( ( Version.dwMajor < verGetFileMajorVersion() ) || ( Version.dwMinor < verGetFileMinorVersion()) ) { fprintf ( stderr, "\r\nTMCons : ERROR : Obsolete version of TMMan32.dll : Terminating ... " ); goto mainExit3; } if ( ( Status = tmDSPOpen ( DSPNumber, &DSPHandle ) ) != TMOK ) { fprintf ( stderr, "\r\nTMCons : tmDSPOpen:DSP[%x]:FAIL[%x]\r\n", DSPNumber, Status ); goto mainExit3; } if ( ( ThreadExitObject = CreateEvent (NULL, TRUE, FALSE, NULL) ) == NULL ) { fprintf ( stderr, "\r\nTMCons : Cannot Create Thread Event \r\n" ); goto mainExit3; } sprintf( szEventName, "TMConsExitEvent%x", DSPNumber ); if ( ( ExitObject = CreateEvent (NULL, TRUE, FALSE, szEventName ) ) == NULL ) { fprintf ( stderr, "\r\nTMCons : Alredy Running \r\n" ); goto mainExit3; } if (!TM1IF_init( (RPCServ_OpenFunc) OpenFunc, (RPCServ_OpenDllFunc) OpenDllFunc, (RPCServ_CloseFunc) CloseFunc, (RPCServ_ReadFunc) ReadFileFunc, (RPCServ_WriteFunc) WriteFileFunc, (RPCServ_SeekFunc) LseekFunc, (RPCServ_IsattyFunc) IsattyFunc, (RPCServ_FstatFunc) FstatFunc, (RPCServ_FcntlFunc) FcntlFunc, (RPCServ_StatFunc) _stat, (RPCServ_ExitFunc) ExitCodeFunc, LittleEndian /* no big endian support yet */ )) { fprintf( stdout, "\r\nTMCons: ERROR : Cannot Initialize RPCServ : CRT I/O calls will not work" ); goto mainExit3; } if ( ( Status = tmDSPGetCaps ( DSPHandle, &Caps ) ) != TMOK ) { fprintf ( stderr, "\r\nTMCons : tmDSPGetCaps:DSP[%x]:FAIL[%x]\r\n", DSPNumber, Status ); goto mainExit3; } if (!TM1IF_add_node_info(
0,
ArgCountFunc(DSPNumber),
ArgVectorFunc(DSPNumber), kLevel2StdinHandle,
kLevel2StdoutHandle,
kLevel2StderrHandle, Caps.SDRAM.dwLinear - Caps.SDRAM.dwPhysical, Caps.SDRAM.dwPhysical, Caps.SDRAM.dwPhysical + Caps.SDRAM.dwSize, (Pointer)DSPNumber ))
{ fprintf( stdout, "\r\nTMCons: ERROR : Cannot Add Node To RPCServ : CRT I/O calls will not work" ); goto mainExit3; } if ( TM1IF_start_serving() == TM1IF_Serving_Failed ) { fprintf( stdout, "\r\nTMCons: ERROR : Cannot Start RPCServ : CRT I/O calls will not work" ); goto mainExit3; } else { DWORD PathIdx; CHAR Key[0x10]; // HARDCODED max 16 bytes for key number CHAR Path[TMSTD_PATH_LENGTH]; for ( PathIdx = 0; PathIdx < MAX_PATH_INDEX ; PathIdx++ ) { sprintf ( Key, "%u", PathIdx ); GetPrivateProfileString ( "DLLPath", Key, "DEFAULT", Path, TMSTD_PATH_LENGTH, "tmman.ini" ); if( _stricmp ( Path, "DEFAULT" ) == 0 ) break; OpenDll_add_dll_path ( Path ); } fServerLoaded = TRUE; } SetEvent ( hStartEvent ); CloseHandle ( hStartEvent ); /* RPCServ should have created thread by now so we block here on our global event to be signalled */ WaitForSingleObject( ExitObject, INFINITE ); // perform thread clean up here fExitProcess = TRUE;/* // insert a CR in to the Stdin queue to release ReadFile // key down CarriageReturn[0].EventType = KEY_EVENT; CarriageReturn[0].Event.KeyEvent.bKeyDown = TRUE; CarriageReturn[0].Event.KeyEvent.wRepeatCount = 1; CarriageReturn[0].Event.KeyEvent.wVirtualKeyCode = 13; CarriageReturn[0].Event.KeyEvent.wVirtualScanCode = 28; CarriageReturn[0].Event.KeyEvent.dwControlKeyState = 0; // key up CarriageReturn[1] = CarriageReturn[0]; CarriageReturn[1].Event.KeyEvent.bKeyDown = FALSE; WriteConsoleInput( Stdin, CarriageReturn, 2, &Written );*/ SetEvent ( ThreadExitObject ); TM1IF_term(); CloseHandle ( ExitObject ); CloseHandle ( hStartEvent ); sprintf ( szDeviceName, "Device.%x", DSPNumber ); fWaitForKey = GetPrivateProfileInt ( szDeviceName, "WaitForKey", DEFAULT_WAITFORKEY, "tmman.ini" ); if ( fTargetExited && fWaitForKey ) { fprintf ( stdout, "\r\nTMCons : Press ENTER to terminate TriMedia Console >> " ); getchar(); } return 0;mainExit3: if ( StdErrParam.Redirected == TRUE ) { _close ( StdErrParam.Handle ); } if ( StdOutParam.Redirected == TRUE ) { _close ( StdOutParam.Handle ); } if ( StdInParam.Redirected == TRUE ) { _close ( StdInParam.Handle ); } CloseHandle ( ExitObject ); CloseHandle ( ThreadExitObject );mainExit2: SetEvent ( hStartEvent ); CloseHandle ( hStartEvent );mainExit1: sprintf ( szDeviceName, "Device.%x", DSPNumber ); fWaitForKey = GetPrivateProfileInt ( szDeviceName, "WaitForKey", DEFAULT_WAITFORKEY, "tmman.ini" ); if ( fWaitForKey ) { fprintf ( stdout, "\r\nTMCons : Press ENTER to terminate TriMedia Console >> " ); getchar(); } return 1;}/* StripCR Unix is a brain dead OS, it cannot undestrand input string terminated with CRLF. And of course trimedia will blindly follow what Unix does. So we have to strip all CR in the input that is being read from StdIn. This function does that and accordingly reduces the lenth of the string that is read in.*/VOID StripCR ( PCHAR pBuffer, DWORD *BytesRead ){ DWORD Idx, InnerIdx; DWORD OrigLength = *BytesRead; for ( Idx = 0; Idx < *BytesRead ; Idx++ ) { if ( ( pBuffer[Idx] == '\r' ) && ( pBuffer[Idx + 1] == '\n' ) ) { (*BytesRead)--; for ( InnerIdx = Idx ; InnerIdx < *BytesRead ; InnerIdx++ ) { pBuffer[InnerIdx] = pBuffer[InnerIdx+1]; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -