Page 1 of 3

Drivewire... -> DWLOAD Server in Python

Posted: Tue Sep 30, 2014 3:08 pm
by jedie
I would like to implement a minimal Drivewire Server in Python... Just to show how it really works. (And i didn't like Java... :P )

Does anyone have done this? Where are good documentation around Drivewire?

Re: Drivewire...

Posted: Tue Sep 30, 2014 4:13 pm
by pser1
hello,

maybe this link could shine a bit of light on this project:
https://sites.google.com/site/drivewire4/

good luck
regards
pere

Re: Drivewire...

Posted: Tue Sep 30, 2014 5:37 pm
by KenH
See also

DriveWire Lite: a reimplementation in C of the server side of the DriveWire 3 protocol.
http://sourceforge.net/projects/dwlite/

and the DriveWire 3 Protocol Specification document:
http://www.frontiernet.net/~mmarlette/C ... cation.pdf

Re: Drivewire...

Posted: Tue Sep 30, 2014 8:48 pm
by jedie
Thanks for the links!

I didn't know that there is a DriveWire lite written in C!

Re: Drivewire...

Posted: Tue Nov 11, 2014 9:14 am
by jedie
Now i think it would be good to implement a DriveWire Server specialy for DWLOAD...
That can handle the save file and skip the padding stuff...

Don't know how many work will this be...

Re: Drivewire...

Posted: Tue Nov 11, 2014 8:03 pm
by jedie
Currently i ask myself if it possible to have a dynamic AUTOLOAD.DWL ?!?

The default AUTOLOAD.DWL from the examples (dwload-demo-files.tar.xz.zip from: viewtopic.php?f=5&t=4964 ) is nice.

It's a simple static BASIC program. Would be nice if the file select menu is dynamic, isn't it?

Why not collect all DWEEB filenames and "compile" a AUTOLOAD.DWL on-the-fly... Maybe it will be possible to add subdirectory support and pageing?!?

Re: Drivewire...

Posted: Wed Nov 12, 2014 12:28 pm
by jedie
I started to implement...

But i didn't understand the complete communication. In DriveWire 4 Server i enabled the raw bytes logging with:

Code: Select all

<LogDeviceBytes category="logging,advanced" type="boolean">true</LogDeviceBytes>
in the config.xml

Requesting AUTOLOAD.DWL via DLOAD looks like this:

Code: Select all

12 Nov 2014 10:56:54 DEBUG [dwproto-0-10  ] READ1: 0
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] READ1: 1
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] READ1: 12
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] READ 12:  65 85 84 79 76 79 65 68 46 68 87 76
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] WRITE1: 255
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] READ1: 210
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] READ 4:  255 0 0 0
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] WRITE 256: 85 1 30 1 2 92 30 1 170 30 12 0 5 58 131 65 65 65 65 0 30 18 0 7 135 0 30 38 0 10 135 34 49 32 32 80 76 65 83 77 65 32 32 32 34 0 30 54 0 20 135 34 50 32 32 83 84 85 68 68 34 0 30 76 0 30 135 34 51 32 32 70 76 65 71 79 78 32 66 73 82 68 34 0 30 98 0 40 135 34 52 32 32 68 79 78 75 69 89 32 75 73 78 71 34 0 30 115 0 50 135 34 53 32 32 90 65 88 88 79 78 34 0 30 134 0 60 135 34 54 32 32 69 76 67 72 65 78 67 69 34 0 30 166 0 80 135 34 56 32 32 73 78 73 84 32 87 80 32 56 48 45 67 79 76 83 32 66 79 65 82 68 34 0 30 182 0 90 135 34 57 32 32 69 76 73 83 65 34 0 30 201 0 100 135 34 78 32 32 78 73 84 82 79 83 45 57 34 0 30 219 0 110 135 34 72 32 32 72 68 66 45 68 79 83 34 0 30 229 0 200 65 36 203 255 154 0 30 248 0 205 133 32 65 36 203 34 34 32 129 188 32 50 48 48 0
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] READ 2:  60 213
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] WRITE1: 0
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] READ1: 210
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] READ 4:  255 0 0 1
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] WRITE 256: 31 16 0 210 133 32 65 36 203 34 49 34 191 32 185 34 80 76 65 83 77 65 34 0 31 39 0 220 133 32 65 36 203 34 50 34 191 32 185 34 83 84 85 68 68 34 0 31 61 0 230 133 32 65 36 203 34 51 34 191 32 185 34 70 76 65 80 34 0 31 83 0 240 133 32 65 36 203 34 52 34 191 32 185 34 75 73 78 71 34 0 31 107 0 250 133 32 65 36 203 34 53 34 191 32 185 34 90 65 88 88 79 78 34 0 31 127 1 4 133 32 65 36 203 34 54 34 32 129 188 32 53 48 48 0 31 160 1 24 133 32 65 36 203 34 56 34 191 32 150 50 48 48 44 38 72 55 68 70 70 58 185 34 87 80 84 34 0 31 187 1 34 133 32 65 36 203 34 57 34 191 32 185 34 69 76 73 83 65 46 66 65 83 34 0 31 209 1 44 133 32 65 36 203 34 78 34 191 32 185 34 68 79 83 78 34 0 31 230 1 54 133 32 65 36 203 34 72 34 191 32 185 34 72 68 66 34 0 31 249 1 134 133 32 65 36 204 202 34 32 34 32 129 188 32 55
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] READ 2:  75 95
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] WRITE1: 0
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] READ1: 210
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] READ 4:  255 0 0 2
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] WRITE 256: 0 32 20 1 144 135 34 84 89 80 69 32 39 82 85 78 39 32 70 79 82 32 77 69 78 85 34 0 32 26 1 154 138 0 32 35 1 244 183 52 44 49 0 32 52 1 254 185 78 34 69 76 67 72 65 78 67 69 34 0 32 61 2 8 174 49 44 49 0 32 80 2 18 133 32 255 154 203 34 34 32 129 188 32 53 51 48 0 32 89 2 28 129 188 32 55 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 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 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
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] READ 2:  24 245
12 Nov 2014 10:56:55 DEBUG [dwproto-0-10  ] WRITE1: 0

In my current code ( https://gist.github.com/jedie/c6a066c102b3048c4d69 ) it looks like this:

Code: Select all

C:\Python34\python.exe V:/workspace/DwLoadServer/dwload_server.py
194       INFO dwload_server 64 Root directory is: 'dwload-demo-files'
Settings for serial 'COM3':
            baudrate : 57600
            bytesize : 8
              dsrdtr : False
    interCharTimeout : None
              parity : N
              rtscts : False
            stopbits : 1
             timeout : None
        writeTimeout : None
             xonxoff : False
257      DEBUG dwload_server 112 Serve forever
257      DEBUG dwload_server 48 READ 1:
13321    DEBUG dwload_server 50 	dez: 1
13321    DEBUG dwload_server 51 	hex: $01
13321    DEBUG dwload_server 114 Request type: $01
13321    DEBUG dwload_server 116 Request a file.
13321    DEBUG dwload_server 48 READ 1:
13321    DEBUG dwload_server 50 	dez: 12
13321    DEBUG dwload_server 51 	hex: $0c
13321    DEBUG dwload_server 88 Read block with a length of 12
13321    DEBUG dwload_server 48 READ 12:
13322    DEBUG dwload_server 50 	dez: 65 85 84 79 76 79 65 68 46 68 87 76
13322    DEBUG dwload_server 51 	hex: $41 $55 $54 $4f $4c $4f $41 $44 $2e $44 $57 $4c
13322    DEBUG dwload_server 94 Filename has 12 Bytes.
13322    DEBUG dwload_server 96 Filename: 'AUTOLOAD.DWL'
13322    DEBUG dwload_server 55 WRITE 1:
13322    DEBUG dwload_server 56 	dez: 255
13322    DEBUG dwload_server 57 	hex: $ff
13322    DEBUG dwload_server 48 READ 1:
13324    DEBUG dwload_server 50 	dez: 210
13324    DEBUG dwload_server 51 	hex: $d2
13324    DEBUG dwload_server 48 READ 4:
13324    DEBUG dwload_server 50 	dez: 255 0 0 0
13324    DEBUG dwload_server 51 	hex: $ff $00 $00 $00
13324    DEBUG dwload_server 103 Use filepath: 'dwload-demo-files\\AUTOLOAD.DWL'
13332    DEBUG dwload_server 108 File content are 768 bytes.
Traceback (most recent call last):
  File "V:/workspace/DwLoadServer/dwload_server.py", line 142, in <module>
    dwload.serve_forever()
  File "V:/workspace/DwLoadServer/dwload_server.py", line 118, in serve_forever
    raise NotImplementedError()
NotImplementedError


What i understand from the origin Logging (here a cut version):
READ1: 0
READ1: 1 <- request type (here read a file)
READ1: 12 <- filename byte count
READ 12: 65 85 84 79 76 79 65 68 46 68 87 76 <- filename, here: 'AUTOLOAD.DWL'
WRITE1: 255 <- maybe start transfer?!?
READ1: 210 <- == $D2 for read extended transaction!?!?
READ 4: 255 0 0 0 <- 255=Drive Number and 0 0 0 are LSN (Logical Sector Number) a 24 bit value
WRITE 256: 85 1 30 ... 48 48 0 <- 256 byte block of the file content
READ 2: 60 213 <- maybe the 16 bit checksum computed by Dragon?!?
WRITE1: 0 <- maybe confirm the checksum?!?
READ1: 210 <- == $D2 for read extended transaction!?!?
READ 4: 255 0 0 1 <- 255=Drive Number and 0 0 1 are LSN (Logical Sector Number) a 24 bit value
WRITE 256: 31 16 0 ... 188 32 55 <- 256 byte block of the file content
READ 2: 75 95 <- maybe the 16 bit checksum computed by Dragon?!?
WRITE1: 0 <- maybe confirm the checksum?!?
READ1: 210 <- == $D2 for read extended transaction!?!?
READ 4: 255 0 0 2 <- 255=Drive Number and 0 0 2 are LSN (Logical Sector Number) a 24 bit value
WRITE 256: 0 32 20 ... 0 0 0 <- 256 byte block of the file content
READ 2: 24 245 <- maybe the 16 bit checksum computed by Dragon?!?
WRITE1: 0 <- maybe confirm the checksum?!?
Between the block should be a block length and a checksum and some more meta information...
The "DriveWire 3 Specification.pdf" didn't help me... Is there somewhere other documentations?

EDIT: Add some more suggestions in last log...

Re: Drivewire...

Posted: Wed Nov 12, 2014 1:53 pm
by jedie
OK, file sending works now!!!

I create a repro for it: https://github.com/DWLOAD/DwLoadServer

I use the github opensource organization: https://github.com/DWLOAD for it, see: viewtopic.php?f=5&t=4971 (Maybe it makes sence to mege it, if implementation is more useable...)

Logging output of two file Requests is here: https://gist.github.com/jedie/43245bd5ecb80eeeac87

Re: Drivewire...

Posted: Thu Nov 13, 2014 12:42 pm
by jedie

Re: Drivewire...

Posted: Thu Nov 13, 2014 8:43 pm
by tormod
Great stuff. It is always nice to have several options...

I think a nice milestone would be that you can run NitrOS-9 through your server. You basically need the read and write support (OP_WRITE, OP_REWRITE, OP_READEX, OP_REREADEX) and OP_TIME to provide the clock. And empty OP_SERREAD, OP_GETSTAT, OP_INIT, OP_DWINIT to keep it happy. I know this by experience, more on that later :p