Exemplo n.º 1
0
//--------------------------------------------------------------------------
//	printf style debugging output
//--------------------------------------------------------------------------
void FDebugBreak (const char *format, ...)
{
	char string[kDebugPrintfBufferSize];
	va_list marker;
	va_start (marker, format);
	vsnprintf (string, kDebugPrintfBufferSize, format, marker);

	printDebugString (string);

	if (neverDebugger)
		return;
	if (AmIBeingDebugged ())
	{	
		// do not crash if no debugger present
		// If there  is an assertion handler defined then let this override the UI
		// and tell us whether we want to break into the debugger
		bool breakIntoDebugger = true;
		if (gAssertionHandler && gAssertionHandler (string) == false) 
		{
			breakIntoDebugger = false;
		} 

		if (breakIntoDebugger) 
		{
#if WINDOWS	
			__debugbreak (); // intrinsic version of DebugBreak() 
#elif __ppc64__ || __ppc__ || __arm__
			kill (getpid (), SIGINT);
#elif __i386__ || __x86_64__
			{ __asm__ volatile ("int3"); }
#endif
		}
	}
}
Exemplo n.º 2
0
//--------------------------------------------------------------------------
//	printf style debugging output
//--------------------------------------------------------------------------
void FDebugPrint (const char *format, ...)
{
	char string[kDebugPrintfBufferSize];
	va_list marker;
	va_start (marker, format);
	vsnprintf (string, kDebugPrintfBufferSize, format, marker);
	
	printDebugString (string);
}
Exemplo n.º 3
0
int main(int argc, char *argv[])
    {
    fd_set rset;
    struct timeval timeout;
    char c[BUFFER_SIZE];
    int csize;

    int mode;
    int x;
    int y;
    int args = 0;
    int tmp;
    int result;
    int blockerror = 0;

    char argSerial[] = "-serial";
    char argPort[]   = "-port";
    char argStrip[]  = "-strip";
    char argBaud[]   = "-baud";
    char argDebug[]  = "-debug";
    char argInDebug[]  = "-indebug";
    char argOutDebug[]  = "-outdebug";
    char argNonblock[]  = "-nonblock";
    char argAux[]  = "-aux";

    int SOCKET_PORT = 0;
    int BAUD = 0;
    int STRIP = 0;
    int NONBLOCK = 0;
    int AUX_PORT = 0;
    char SERIAL[100];
        
    for (x=1; x<argc; x++)
        {
        if (!strcmp(argSerial,argv[x]))
            {
            strcpy(SERIAL,argv[x+1]);
            x++;
            args++;
            }
        else if (!strcmp(argPort,argv[x]))
            {
            SOCKET_PORT = atoi(argv[x+1]);
            x++;
            args++;
            }
        else if (!strcmp(argBaud,argv[x]))
            {
            BAUD = parseBaudRates(argv[x+1]);
            if (!BAUD) return 1;
            x++;
            args++;
            }
        else if (!strcmp(argAux, argv[x]))
            {
            AUX_PORT = atoi(argv[x+1]);
            x++;
            }
        else if (!strcmp(argStrip,argv[x]))
            STRIP = 1;
        else if (!strcmp(argInDebug,argv[x]))
            INDEBUG = 1;
        else if (!strcmp(argOutDebug,argv[x]))
            OUTDEBUG = 1;
        else if (!strcmp(argDebug,argv[x]))
            INDEBUG = OUTDEBUG = 1;
        else if (!strcmp(argNonblock,argv[x]))
            NONBLOCK = 1;
        else { 
            printf("ERROR!: Unknown argument %s\n", argv[x]); 
            return 1; 
            }
        }

    if (args < 3)
        {
        printf("--------------------------------------------------------------\n");
        printf("------------------  GMU SerialDaemon  ------------------------\n");
        printf("--------------------------------------------------------------\n");
        printf("Usage:\n");
        printf("\tserialdaemon\n");
        printf("\t\t-serial [serialPort]\n");
        printf("\t\t-port   [TCP/IP Port]\n");
        printf("\t\t-aux    [auxiliary TCP/IP Port]\n");
        printf("\t\t-baud   [baudRate]\n");
        printf("\t\t\t500000    (available on Linux only)\n");
        printf("\t\t\t460800    (available on Linux only)\n");
        printf("\t\t\t230400\n");
        printf("\t\t\t115200\n");
        printf("\t\t\t57600\n");
        printf("\t\t\t38400\n");
        printf("\t\t\t19200\n");
        printf("\t\t\t9600\n");
        printf("\t\t-strip\n");
        printf("\t\t-indebug\n");
        printf("\t\t-outdebug\n");
        printf("\t\t-debug\n");
        printf("\t\t-nonblock\n");
        printf("\n");
        printf("Notes:\n");
        printf("1) If you have declared an auxiliary port, your client program\n");
        printf("   must connect to the primary TCP/IP port, THEN the auxiliary\n"); 
		printf("   port, and both must be connected before any traffic is sent\n");
        printf("2) Baud rates 460800 and 500000 are not available on OS/X\n");
        return(1);
        }

    if (INDEBUG || OUTDEBUG)
        printf ("DEBUG: debug mode on!\n");

    sockfd_pre = makeSocket(SOCKET_PORT);
    if (sockfd_pre <= 0)
        { 
        printf("ERROR: couldn't make TCP/IP socket!\n"); 
        closeAll(); 
        return; 
        }

    if (AUX_PORT != 0)
        {
        auxfd_pre = makeSocket(AUX_PORT);
        if (auxfd_pre <= 0)
            { 
            printf("ERROR: couldn't make TCP/IP socket!\n"); 
            closeAll(); 
            return; 
            }
        }

    serialfd = makeSerialPortFd(SERIAL, BAUD);
    if (serialfd <= 0)
        { 
        printf("ERROR: couldn't open serial port!\n"); 
        closeAll(); 
        return; 
        }

    if (argc <= 1)
        mode = 0;
    else
        mode = atoi(argv[1]);

    printf("Listening for data connections on port: %i\n",SOCKET_PORT);
    if (AUX_PORT != 0)
        {
        printf("Listening for aux  connections on port: %i\n",AUX_PORT);
        }

    while(1)
        {
        /* Wait for connection on data socket */
        sockfd = waitOnSocket(sockfd_pre);
        if (INDEBUG || OUTDEBUG)
            printf("DEBUG: New data socket opened.\n");
        if (sockfd < 0)
            {
            closeAll(); 
            return;
            }

        /* Set data socket to non-blocking */
        if (NONBLOCK)
            {
            if (fcntl(sockfd, F_SETFL, O_NONBLOCK) != 0)
                {
                printf("ERROR: couldn't make TCP/IP socket non-blocking!\n"); 
                closeAll(); 
                return; 
                }
            }

        /* Wait for connection on AUX socket (if specified) */
        if (auxfd_pre != NOTHING)
            {
            auxfd = waitOnSocket(auxfd_pre);
            if (INDEBUG || OUTDEBUG)
                printf("DEBUG: New aux  socket opened.\n");
            if (auxfd < 0)
                {
                closeAll(); 
                return;
                }
            }

        /* Must have a serial file descriptor (else, why are we running?) */
        if (serialfd < 0)
            {
            closeAll();
            return;
            }
    
        FD_ZERO(&rset);

        /* Main Loop */
        while(1)
            {
            /* Add connections to set */
            FD_SET(sockfd,&rset);
            if (auxfd!=NOTHING) FD_SET(auxfd,&rset);
            FD_SET(serialfd,&rset);

            /* Select on connection */
            select(max(max(sockfd,auxfd),serialfd)+1,&rset,NULL,NULL,NULL);
                        
            /* There's stuff to read on AUX */
            if (FD_ISSET(auxfd,&rset))
                { 
                if ((csize = readline(auxfd, c, BUFFER_SIZE)) >= 1)
                    {
                    c[csize] = '\0';  // after length, so no problem
                    char cmd = c[0];
                    if (c[1] != ' ')
                        printf("ERROR!: Malformed AUX command; ignoring\n");
                    char* data = &c[2];
                    switch (cmd)
                        {
                        case 'B':
                            if (INDEBUG)
                                {
                                printf("DEBUG: AUX baud change\n");
                                }
                            auxShiftBaud(data);
                            break;
                        default:
                            printf("ERROR!: Unknown AUX command; ignoring\n");
                            break;
                        }                                                       
                    }
                else break;             /* Failed */
                }
                        
            /* There's stuff to read on SOCKET */
            if (FD_ISSET(sockfd,&rset))
                {
                if ((csize= read(sockfd, c, BUFFER_SIZE)) >= 1)
                    {
                    y = csize;
                    if (STRIP==1)
                        {
                        for(x = 0, y = 0 ; x < csize; x++, y++)
                            {
                            if (c[x] == '\n')  { // get rid of it
                                y--;
                                if (OUTDEBUG) printf ("DEBUG: **STRIPPED**\n");
                                }
                            else c[y] = c[x];
                            }
                        }
                    if (OUTDEBUG)
                        {
                        c[y] = '\0';  // after length, so no problem
                        printf("DEBUG: serial <==");
                        printDebugString(c, y);
                        }
                    result = write(serialfd, c, y);
                    if (OUTDEBUG)
                        {
                        printf("DEBUG: wrote %d/%d\n", result, y);
                        }
                    }
                else break;             /* Failed */
                }
                        
            /* There's stuff to read on SERIAL */
            if (FD_ISSET(serialfd,&rset))
                {
                if ((csize = read(serialfd, c, BUFFER_SIZE)) >= 1)
                    {
                    if (STRIP==1)
                        {
                        for(x = 0 ; x < csize; x++)
                            {
                            if (c[x] == '\r' )  { // get rid of it
                                c[x] = '\n';
                                if (OUTDEBUG) printf ("DEBUG: **STRIPPED**\n");
                                }
                            else c[y] = c[x];
                            }
                        }
                    if (INDEBUG)
                        {
                        c[csize] = '\0';  // after length, so no problem
                        printf("DEBUG: serial ==>");
                        printDebugString(c, csize);
                        }
                    result = write(sockfd, c, csize);
                    if (result == EWOULDBLOCK)
                        {
                        if (!blockerror)
                            { 
                            blockerror = 1; 
                            printf("ERROR: dropping bytes writing to socket\n"); 
                            }
                        }
                    else if (INDEBUG)
                        {
                        printf("DEBUG: read %d/%d\n", result, csize);
                        }
                    }
                else break;             /* Failed */     
                }
            }

        /* Restart connection-wait loop */
        printf("Restarting\n");
        close(sockfd);  /* clean up */
        }
    }