Question on converting passing LONG pointer arrays, then copying to BYTE arrays
Chuck Rice
Posts: 210
.
Is the gotcha comment below correct, given that packetArg and packetBuf are defined elsewhere (in another object) as
and are called like:
I am away from my propeller right now, but I think that this is what has been causing
my problem with the dest field being set to $00 instead of the passed value of $01.
I was using byte instead of long in the pfSource and PFDest header bytes.
Is this correct or am I missing something basic?
The Enumerations defined in my global object are:
Post Edited (Chuck Rice) : 4/16/2008 3:40:28 AM GMT
Is the gotcha comment below correct, given that packetArg and packetBuf are defined elsewhere (in another object) as
long packetArg[noparse][[/noparse]g#maxPacketArgs] byte packetBuf[noparse][[/noparse]g#maxData]
and are called like:
longfill(@packetArg,0,g#maxPacketArgs) packetArg[noparse][[/noparse]g#pSource]:= cMyAddress packetArg[noparse][[/noparse]g#pDest] := dest rs[noparse][[/noparse]dest].sendPacket(command,g#query,@packetArg)
I am away from my propeller right now, but I think that this is what has been causing
my problem with the dest field being set to $00 instead of the passed value of $01.
I was using byte instead of long in the pfSource and PFDest header bytes.
Is this correct or am I missing something basic?
[b]pub[/b] sendPacket(packetFunc,packetType,packetArgPtr) | pBufPtr,pDataPtr,argPtr,n ' Build Packet Header ' gotcha here. The destination is a byte, but the ' argument is passed in a long array. So the index ' into the passed argument array must be long bassed, ' or multiplied by 4 to be byte based. [b]byte[/b][noparse][[/noparse]pBufBase][noparse][[/noparse]g#pfStart ] := g#stx 'Set Start-Of-Transmission [b]byte[/b][noparse][[/noparse]pBufBase][noparse][[/noparse]g#pfSource] := [b]long[/b][noparse][[/noparse]packetArgPtr][noparse][[/noparse]g#pSource] [b]byte[/b][noparse][[/noparse]pBufBase][noparse][[/noparse]g#pfDest ] := [b]long[/b][noparse][[/noparse]packetArgPtr][noparse][[/noparse]g#pDest] [b]byte[/b][noparse][[/noparse]pBufBase][noparse][[/noparse]g#pfFunc ] := packetFunc [b]byte[/b][noparse][[/noparse]pBufBase][noparse][[/noparse]g#pfType ] := packetType ' Build Packet Data Section argPtr := g#pArg1 'Set to first argument pBufPtr := pBufBase + g#pfData [b]repeat[/b] [b]if[/b] [b]long[/b][noparse][[/noparse]packetArgPtr][noparse][[/noparse]argPtr] <> 0 'Does this arg point to any data? pDataPtr := [b]long[/b][noparse][[/noparse]packetArgPtr][noparse][[/noparse]argPtr] 'Get the address of the data to send from the argument n := [b]strsize[/b]([b]long[/b][noparse][[/noparse]packetArgPtr][noparse][[/noparse]argPtr]) 'Calc its length [b]bytemove[/b](pBufPtr , pDataPtr , n) 'move the arg data into the buffer pBufPtr += n 'add the length of the data to the buffer pointer [b]while[/b] [b]long[/b][noparse][[/noparse]packetArgPtr][noparse][[/noparse]++argPtr] <> 0 ' Build Packet Trailer [b]byte[/b][noparse][[/noparse]pBufPtr] := g#ETX 'Add End-Of-Transmission byte ' Send the Packet pBufPtr := pBufBase [b]repeat[/b] tx([b]byte[/b][noparse][[/noparse]pBufBase][noparse][[/noparse]pBufPtr++]) [b]while[/b] [b]byte[/b][noparse][[/noparse]pBufBase][noparse][[/noparse]pBufPtr] <> g#ETX
The Enumerations defined in my global object are:
#1 'Packet Function Enumeration GetGPSinfo GetGPSinfo2 stopMotors GetCogs sendPosition getScanMap setTargetLatLon getDistanceAndBearing doTest steer identify #1 ' Source and Destination Enumerations NavBoard MotBoard ComBoard xxxBoard #$F0 ' Enumeration STX ETX #0 ' Packet Field Enumeration pfStart ' Packet Start pfSource ' Packet Source Address pfDest ' Packet Destination Address pfFunc ' Packet Function pfType ' Packet Type pfData ' Packet Payload pfEOT ' Packet End of Transmission #0 pSource 'Packet Argument Enumeration pDest pArg1 pArg2 pArg3 pArg4 pArg5
Post Edited (Chuck Rice) : 4/16/2008 3:40:28 AM GMT
Comments
Thanks. I will sleep better tonight! [noparse]:)[/noparse]
.