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

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

More minor improvements to the serial server, in particular improved timeout recovery.

File size: 5.2 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        "SerDrive - XTIDE Universal BIOS Serial Drive Server",
24        "Version 1.2.0_wip, Built " __DATE__,
25        "",
26        "usage: SerDrive [options] imagefile [[slave-options] slave-imagefile]",
27        "",
28        "  -g cyl:sect:head  Geometry in cylinders, sectors per cylinder, and heads",
29        "                    (default is 65:63:16 for a 32 MB disk)",
30        "",
31        "  -n [megabytes]    Create new disk with given size or use -g geometry",
32        "",
33        "  -p                Named Pipe mode for emulators (pipe is '" PIPENAME "')",
34        "",
35        "  -c COMPortNumber  COM Port to use (default is first found)",
36        "",
37        "  -b BaudRate       Baud rate to use on the COM port ",
38        "                    Without a rate multiplier: 2400, 9600, 38400, 115200",
39        "                    With a 2x rate multiplier: 4800, 19200, 76800, 230400",
40        "                    With a 4x rate multiplier: 9600, 38400, 153600, 460800",
41        "                    Abbreviations also accepted (ie, '460K', '38.4K', etc)",
42        "                    (default is 38400, 115200 in named pipe mode)",
43        "",
44        "  -t                Disable timeout, useful for long delays when debugging",
45        "",
46        "  -r                Read Only disk, do not allow writes",
47        "",
48        "  -v [level]        Reporting level 1-6, with increasing information",
49        "",
50        "On the client computer, a serial port can be configured for use as a hard disk",
51        "with xtidecfg.com.  Or one can hold down the ALT key at the end of the normal",
52        "IDE hard disk scan and the XTIDE Universal BIOS will scan COM1-7, at each of",
53        "the four speeds given above for BaudRate.  Note that hardware rate multipliers",
54        "must be taken into account on the server end, but are invisible on the client.",
55        NULL };
56
57    for( int t = 0; usageStrings[t]; t++ )
58        fprintf( stderr, "%s\n", usageStrings[t] );
59
60    exit( 1 );
61}
62
63int verbose = 0;
64
65int main(int argc, char* argv[])
66{
67    DWORD len;
68
69    unsigned long check;
70    unsigned char w;
71
72    unsigned short wbuff[256];
73
74    Serial *serial;
75    Image *img;
76    struct baudRate *baudRate = NULL;
77
78    int timeoutEnabled = 1;
79
80    char *ComPort = NULL, ComPortBuff[20];
81
82    _fmode = _O_BINARY;
83
84    unsigned long cyl = 0, sect = 0, head = 0;
85    int readOnly = 0, createFile = 0, explicitGeometry = 0;
86
87    int imagecount = 0;
88    Image *images[2] = { NULL, NULL };
89
90    for( int t = 1; t < argc; t++ )
91    {
92        if( argv[t][0] == '/' || argv[t][0] == '-' )
93        {
94            char *c;
95            unsigned long a;
96            for( c = &argv[t][1]; *c && !isdigit( *c ); c++ ) 
97                ;
98            a = atol(c);
99
100            switch( argv[t][1] )
101            {
102            case 'c': case 'C':
103                a = atol( argv[++t] );
104                if( a < 1 )
105                    usage();
106                sprintf( ComPortBuff, "COM%d", a );
107                ComPort = &ComPortBuff[0];
108                break;
109            case 'v': case 'V':
110                if( atol(argv[t+1]) != 0 )
111                    verbose = atol(argv[++t]);
112                else
113                    verbose = 1;
114                break;
115            case 'r': case 'R':
116                readOnly = 1;
117                break;
118            case 'p': case 'P':
119                ComPort = "PIPE";
120                if( !baudRate )
121                    baudRate = baudRateMatchString( "115200" );
122                break;           
123            case 'g': case 'G':
124                if( !Image::parseGeometry( argv[++t], &cyl, &sect, &head ) )
125                    usage();
126                explicitGeometry = 1;
127                break;
128            case 'h': case 'H': case '?':
129                usage();
130                break;
131            case 'n': case 'N':
132                createFile = 1;
133                if( atol(argv[t+1]) != 0 )
134                {
135                    unsigned long size = atol(argv[++t]);
136                    sect = 63;
137                    head = 16;
138                    cyl = (size*1024*2) / (16*63);
139                    explicitGeometry = 1;
140                }
141                break;
142            case 't': case 'T':
143                timeoutEnabled = 0;
144                break;
145            case 'b': case 'B':
146                if( !(baudRate = baudRateMatchString( argv[++t] )) )
147                {
148                    fprintf( stderr, "Unknown Baud Rate %s\n\n", argv[t] );
149                    usage();
150                }
151                break;
152            default:
153                fprintf( stderr, "Unknown Option: %s\n\n", argv[t] );
154                usage();
155            }
156        }
157        else if( imagecount < 2 )
158        {
159            images[imagecount] = new FlatImage( argv[t], readOnly, imagecount, createFile, cyl, sect, head );
160            imagecount++;
161            createFile = readOnly = cyl = sect = head = 0;
162        }
163        else
164            usage();
165    }
166
167    if( imagecount == 0 )
168        usage();
169
170    if( !baudRate )
171        baudRate = baudRateMatchString( "38400" );
172
173    do
174    {
175        serial = new Win32Serial( ComPort, baudRate );
176
177        processRequests( serial, images[0], images[1], timeoutEnabled, verbose );
178
179        delete serial;
180
181        if( serial->resetConnection )
182            log( 0, "Connection closed, reset..." );
183    }
184    while( serial->resetConnection );
185}
186
187void log( int level, char *message, ... )
188{
189    va_list args;
190
191    va_start( args, message );
192
193    if( level < 0 )
194    {
195        fprintf( stderr, "ERROR: " );
196        vfprintf( stderr, message, args );
197        fprintf( stderr, "\n" );
198        exit( 1 );
199    }
200    else if( verbose >= level )
201    {
202        vprintf( message, args );
203        printf( "\n" );
204    }
205
206    va_end( args );
207}
208
209unsigned long GetTime(void)
210{
211    return( GetTickCount() );
212}
213
214unsigned long GetTime_Timeout(void)
215{
216    return( 1000 );
217}
Note: See TracBrowser for help on using the repository browser.