source: xtideuniversalbios/trunk/Serial_Server/win32/Win32.cpp @ 209

Last change on this file since 209 was 209, checked in by gregli@…, 12 years ago

Initial checkin for the Serial Server code, to be run on a host computer with a hard disk image file. Connected via a serial line, this provides the I/O for the serial port support in the XTIDE bios. At present, this is a Win32 command line program, run without parameters for usage information.

File size: 4.3 KB
Line 
1//======================================================================
2//
3// Project:     XTIDE Universal BIOS, Serial Port Server
4//
5// File:        Win32.cpp - Microsoft Windows 32-bit application
6//
7// This file contains the entry point for the Win32 version of the server.
8// It also handles log reporting, timers, and command line parameter parsing.
9//
10
11#include <stdio.h>
12#include <stdlib.h>
13#include <fcntl.h>
14#include <stdarg.h>
15
16#include "../library/library.h"
17#include "../library/flatimage.h"
18#include "Win32Serial.h"
19
20void usage(void)
21{
22    char *usageStrings[] = {
23        "usage: SerServe [options] master-imagefile [[slave-options] slave-imagefile]",
24        "  -g cyl:sect:head  Geometry in cylinders, sectors per cylinder, and heads",
25        "                    (default is 65:63:16 for a 32 MB disk)",
26        "  -n [megabytes]    New, Create new disk with given size or use -g geometry",
27        "  -p                Named pipe mode for emulators (pipe is " PIPENAME ")",
28        "  -c PortNumber     COM Port to use (default is first found)",
29        "  -b BaudRate       Baud rate to use on the COM port ",
30        "                    9600, 38400, 115200, 230400, or 460800",   
31        "                    (default 9600, 115200 in pipe mode)",
32        "  -t                Disable timeout, useful for long delays when debugging",
33        "  -r                Read Only disk",
34        "  -v [level]        Reporting level 1-6, increasing information",
35        NULL };
36
37    for( int t = 0; usageStrings[t]; t++ )
38        fprintf( stderr, "%s\n", usageStrings[t] );
39
40    exit( 1 );
41}
42
43int verbose = 1;
44
45int main(int argc, char* argv[])
46{
47    DWORD len;
48
49    unsigned long check;
50    unsigned char w;
51
52    unsigned short wbuff[256];
53
54    Serial *serial;
55    Image *img;
56    struct baudRate *baudRate;
57
58    int timeoutEnabled = 1;
59
60    char *ComPort = NULL, ComPortBuff[20];
61
62    _fmode = _O_BINARY;
63
64    unsigned long cyl = 0, sect = 0, head = 0;
65    int readOnly = 0, createFile = 0, explicitGeometry = 0;
66
67    int imagecount = 0;
68    Image *images[2] = { NULL, NULL };
69
70    baudRate = baudRateMatchString( "9600" );
71
72    for( int t = 1; t < argc; t++ )
73    {
74        if( argv[t][0] == '/' || argv[t][0] == '-' )
75        {
76            char *c;
77            unsigned long a;
78            for( c = &argv[t][1]; *c && !isdigit( *c ); c++ ) 
79                ;
80            a = atol(c);
81
82            switch( argv[t][1] )
83            {
84            case 'c': case 'C':
85                a = atol( argv[++t] );
86                if( a < 1 )
87                    usage();
88                sprintf( ComPortBuff, "COM%d", a );
89                ComPort = &ComPortBuff[0];
90                break;
91            case 'v': case 'V':
92                if( atol(argv[t+1]) != 0 )
93                    verbose = atol(argv[++t]);
94                else
95                    verbose = 2;
96                break;
97            case 'r': case 'R':
98                readOnly = 1;
99                break;
100            case 'p': case 'P':
101                ComPort = "PIPE";
102                baudRate = baudRateMatchString( "115200" );
103                break;           
104            case 'g': case 'G':
105                if( !Image::parseGeometry( argv[++t], &cyl, &sect, &head ) )
106                    usage();
107                explicitGeometry = 1;
108                break;
109            case 'h': case 'H': case '?':
110                usage();
111                break;
112            case 'n': case 'N':
113                createFile = 1;
114                if( atol(argv[t+1]) != 0 )
115                {
116                    unsigned long size = atol(argv[++t]);
117                    sect = 63;
118                    head = 16;
119                    cyl = (size*1024*2) / (16*63);
120                    explicitGeometry = 1;
121                }
122                break;
123            case 't': case 'T':
124                timeoutEnabled = 0;
125                break;
126            case 'b': case 'B':
127                if( !(baudRate = baudRateMatchString( argv[++t] )) )
128                {
129                        fprintf( stderr, "Unknown Baud Rate %s\n\n", argv[t] );
130                        usage();
131                }
132                break;
133            default:
134                fprintf( stderr, "Unknown Option: %s\n\n", argv[t] );
135                usage();
136            }
137        }
138        else if( imagecount < 2 )
139        {
140            images[imagecount] = new FlatImage( argv[t], readOnly, imagecount, createFile, cyl, sect, head );
141            imagecount++;
142            createFile = readOnly = cyl = sect = head = 0;
143        }
144        else
145            usage();
146    }
147
148    if( imagecount == 0 )
149        usage();
150
151    do
152    {
153        serial = new Win32Serial( ComPort, baudRate );
154
155        processRequests( serial, images[0], images[1], timeoutEnabled, verbose );
156
157        delete serial;
158
159        if( serial->resetConnection )
160            log( 1, "==== Resetting Connection ====" );
161    }
162    while( serial->resetConnection );
163}
164
165void log( int level, char *message, ... )
166{
167    va_list args;
168
169    va_start( args, message );
170
171    if( level == 0 )
172    {
173      vfprintf( stderr, message, args );
174      fprintf( stderr, "\n" );
175      exit( 1 );
176    }
177    else if( verbose >= level )
178    {
179      vprintf( message, args );
180      printf( "\n" );
181    }
182
183    va_end( args );
184}
185
186unsigned long GetTime(void)
187{
188    return( GetTickCount() );
189}
190
191unsigned long GetTime_Timeout(void)
192{
193    return( 1000 );
194}
Note: See TracBrowser for help on using the repository browser.