Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Sat Aug 18 05:00:32 2012 +0000
Revision:
12:d472f9811262
Parent:
10:3c93db1cfb12
Child:
13:7a1fb885a8e4
Fixed bug in throttling timers. Now evt stores dt of triggers but throttle works on dt of events. AfarTCP communication possibly done. Debug output put behind precompiler macros.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
uci1 2:e67f7c158087 1 #include "SnCommWin.h"
uci1 2:e67f7c158087 2
uci1 6:6f002d202f59 3 #include "SnHeaderFrame.h"
uci1 2:e67f7c158087 4 #include "SnConfigFrame.h"
uci1 8:95a325df1f6b 5 #include "SnEventFrame.h"
uci1 8:95a325df1f6b 6 #include "SnPowerFrame.h"
uci1 8:95a325df1f6b 7 #include "SnStatusFrame.h"
uci1 2:e67f7c158087 8 #include "SnSDUtils.h"
uci1 2:e67f7c158087 9
uci1 12:d472f9811262 10 bool SnCommWin::IsTimedOut(const uint32_t timeout_clock) const {
uci1 12:d472f9811262 11 if ( timeout_clock > 0 ) {
uci1 12:d472f9811262 12 if (time(0)>timeout_clock) {
uci1 12:d472f9811262 13 return true;
uci1 12:d472f9811262 14 }
uci1 12:d472f9811262 15 }
uci1 12:d472f9811262 16 return false;
uci1 12:d472f9811262 17 }
uci1 12:d472f9811262 18
uci1 2:e67f7c158087 19 SnCommWin::ECommWinResult SnCommWin::SendData(SnConfigFrame& conf,
uci1 2:e67f7c158087 20 SnEventFrame& evt,
uci1 8:95a325df1f6b 21 SnPowerFrame& pow,
uci1 2:e67f7c158087 22 char* const genBuf,
uci1 3:24c5f0f50bf1 23 const uint32_t bsize,
uci1 12:d472f9811262 24 const uint32_t timeout,
uci1 12:d472f9811262 25 const uint32_t handshakeTimeout) {
uci1 12:d472f9811262 26 #ifdef DEBUG
uci1 3:24c5f0f50bf1 27 printf("SnCommWin::SendData\r\n");
uci1 12:d472f9811262 28 #endif
uci1 2:e67f7c158087 29 ECommWinResult res = kUndefFail;
uci1 2:e67f7c158087 30 if (conf.IsSendingAllFiles()) {
uci1 12:d472f9811262 31 #ifdef DEBUG
uci1 3:24c5f0f50bf1 32 printf("sending all files\r\n");
uci1 12:d472f9811262 33 #endif
uci1 12:d472f9811262 34 res = SnSDUtils::SendAllFiles(this, timeout,
uci1 12:d472f9811262 35 genBuf, bsize, conf, evt, pow,
uci1 12:d472f9811262 36 handshakeTimeout);
uci1 2:e67f7c158087 37 } else {
uci1 2:e67f7c158087 38 if (conf.GetCommSendData()==0) {
uci1 12:d472f9811262 39 #ifdef DEBUG
uci1 3:24c5f0f50bf1 40 printf("no data to send\r\n");
uci1 12:d472f9811262 41 #endif
uci1 2:e67f7c158087 42 res = kOkNoMsg;
uci1 2:e67f7c158087 43 } else {
uci1 2:e67f7c158087 44 const uint32_t nev = (conf.GetCommSendData()>0) ?
uci1 3:24c5f0f50bf1 45 conf.GetCommSendData() // send N events
uci1 3:24c5f0f50bf1 46 : 0u; // send all events in last file
uci1 12:d472f9811262 47 #ifdef DEBUG
uci1 12:d472f9811262 48 printf("calling SendData. f=%x, nev=%u\r\n",SnSDUtils::GetCurFile(), nev);
uci1 12:d472f9811262 49 #endif
uci1 2:e67f7c158087 50 res = SendData(SnSDUtils::GetCurFile(), SnSDUtils::GetCurFileName(),
uci1 12:d472f9811262 51 conf, evt, pow, genBuf, bsize, nev, timeout, handshakeTimeout);
uci1 12:d472f9811262 52 #ifdef DEBUG
uci1 3:24c5f0f50bf1 53 printf("after send data cur file, res=%d\r\n",(int)res);
uci1 12:d472f9811262 54 #endif
uci1 2:e67f7c158087 55 }
uci1 2:e67f7c158087 56 }
uci1 2:e67f7c158087 57 return res;
uci1 2:e67f7c158087 58 }
uci1 2:e67f7c158087 59
uci1 2:e67f7c158087 60 SnCommWin::ECommWinResult SnCommWin::SendData(FILE* inf, const char* infn,
uci1 2:e67f7c158087 61 const SnConfigFrame& curConf,
uci1 2:e67f7c158087 62 SnEventFrame& evt,
uci1 8:95a325df1f6b 63 SnPowerFrame& pow,
uci1 2:e67f7c158087 64 char* const genBuf,
uci1 6:6f002d202f59 65 const uint32_t bsize,
uci1 2:e67f7c158087 66 const uint32_t nevts,
uci1 6:6f002d202f59 67 const uint32_t timeout_clock,
uci1 12:d472f9811262 68 const uint32_t handshakeTimeout) {
uci1 2:e67f7c158087 69 // nevts==0 ==> send all events
uci1 2:e67f7c158087 70
uci1 12:d472f9811262 71 #ifdef DEBUG
uci1 12:d472f9811262 72 printf("SnCommWin::SendData file (%p), fn=%s\r\n",inf,infn);
uci1 12:d472f9811262 73 #endif
uci1 2:e67f7c158087 74 ECommWinResult res = kUndefFail;
uci1 12:d472f9811262 75 bool didDel = false;
uci1 2:e67f7c158087 76 if (inf!=0) {
uci1 12:d472f9811262 77 #ifdef DEBUG
uci1 12:d472f9811262 78 printf("sending file name %s\r\n",infn);
uci1 12:d472f9811262 79 #endif
uci1 6:6f002d202f59 80 // send the file name
uci1 6:6f002d202f59 81 res = SendFilename(infn, genBuf, timeout_clock);
uci1 3:24c5f0f50bf1 82 if (res>kAllFails) {
uci1 6:6f002d202f59 83 if (genBuf!=0) {
uci1 12:d472f9811262 84 #ifdef DEBUG
uci1 12:d472f9811262 85 printf("calling send file contents\r\n");
uci1 12:d472f9811262 86 #endif
uci1 6:6f002d202f59 87 // send the contents
uci1 8:95a325df1f6b 88 res = SendFileContents(inf, curConf, evt, pow, genBuf,
uci1 12:d472f9811262 89 nevts, timeout_clock);
uci1 12:d472f9811262 90 #ifdef DEBUG
uci1 12:d472f9811262 91 printf("res=%d (fails=%d)\r\n",(int)res,(int)kAllFails);
uci1 12:d472f9811262 92 #endif
uci1 12:d472f9811262 93 if (res>kAllFails) {
uci1 12:d472f9811262 94 #ifdef DEBUG
uci1 12:d472f9811262 95 printf("calling wait handshake\r\n");
uci1 12:d472f9811262 96 #endif
uci1 6:6f002d202f59 97 // wait for handshake
uci1 6:6f002d202f59 98 uint8_t hndshk=0;
uci1 12:d472f9811262 99 res = WaitHandshake(handshakeTimeout, genBuf, bsize, hndshk);
uci1 6:6f002d202f59 100 if ( (res==SnCommWin::kOkWithMsg) // got handshake
uci1 6:6f002d202f59 101 && (nevts==0) // sent whole file
uci1 6:6f002d202f59 102 && curConf.IsDeletingFiles() // want to delete
uci1 12:d472f9811262 103 && (inf!=SnSDUtils::GetCurFile()) // not current file
uci1 6:6f002d202f59 104 && (hndshk==SnHeaderFrame::kHnShOkComplCode)) { // whole file received
uci1 6:6f002d202f59 105 // delete it
uci1 6:6f002d202f59 106 SnSDUtilsWhisperer::DeleteFile(inf, infn);
uci1 12:d472f9811262 107 didDel=true;
uci1 6:6f002d202f59 108 }
uci1 3:24c5f0f50bf1 109 }
uci1 2:e67f7c158087 110 }
uci1 2:e67f7c158087 111 }
uci1 12:d472f9811262 112 } else {
uci1 12:d472f9811262 113 #ifdef DEBUG
uci1 12:d472f9811262 114 printf("inf=0!\r\n");
uci1 12:d472f9811262 115 #endif
uci1 12:d472f9811262 116 }
uci1 12:d472f9811262 117 if ( (inf!=SnSDUtils::GetCurFile()) && (didDel==false) ) {
uci1 12:d472f9811262 118 SnSDUtils::CloseOutputFile(inf);
uci1 2:e67f7c158087 119 }
uci1 2:e67f7c158087 120 return res;
uci1 2:e67f7c158087 121 }
uci1 8:95a325df1f6b 122
uci1 8:95a325df1f6b 123 SnCommWin::ECommWinResult SnCommWin::WaitHandshake(const uint32_t timeout,
uci1 8:95a325df1f6b 124 char* const buf,
uci1 8:95a325df1f6b 125 const uint32_t bsize,
uci1 8:95a325df1f6b 126 uint8_t& hndShkCode) {
uci1 12:d472f9811262 127 // ensure we don't wait forever
uci1 12:d472f9811262 128 const uint32_t to = (timeout>0) ? timeout : kListenTimeout;
uci1 12:d472f9811262 129 #ifdef DEBUG
uci1 12:d472f9811262 130 printf("WaitHandshake, to=%u\r\n",to);
uci1 12:d472f9811262 131 #endif
uci1 8:95a325df1f6b 132
uci1 12:d472f9811262 133 const int mlen = ReceiveAll(buf, SnHeaderFrame::SizeOf(), to);
uci1 8:95a325df1f6b 134 if (mlen>0 && static_cast<uint32_t>(mlen) == SnHeaderFrame::SizeOf()) {
uci1 8:95a325df1f6b 135 uint32_t msgLen=0;
uci1 8:95a325df1f6b 136 const char* b = buf;
uci1 8:95a325df1f6b 137 SnHeaderFrame::ReadFrom(b, hndShkCode, msgLen);
uci1 12:d472f9811262 138 #ifdef DEBUG
uci1 12:d472f9811262 139 printf("got handshake code=%02x, len=%u\r\n",hndShkCode,msgLen);
uci1 12:d472f9811262 140 #endif
uci1 8:95a325df1f6b 141 if ((hndShkCode & SnHeaderFrame::kHndShkBits)!=0) {
uci1 8:95a325df1f6b 142 return SnCommWin::kOkWithMsg;
uci1 8:95a325df1f6b 143 } else {
uci1 8:95a325df1f6b 144 // TODO: somehow handle unexpected message?
uci1 8:95a325df1f6b 145 return SnCommWin::kUnexpectedRec;
uci1 8:95a325df1f6b 146 }
uci1 8:95a325df1f6b 147 }
uci1 8:95a325df1f6b 148 return SnCommWin::kOkNoMsg;
uci1 8:95a325df1f6b 149 }
uci1 8:95a325df1f6b 150
uci1 8:95a325df1f6b 151 SnCommWin::ECommWinResult SnCommWin::GetConfig(SnConfigFrame& conf,
uci1 8:95a325df1f6b 152 const uint32_t timeOut,
uci1 8:95a325df1f6b 153 char* const confBuf,
uci1 8:95a325df1f6b 154 const uint32_t bsize) {
uci1 8:95a325df1f6b 155 // confBuf assumed to alread be of allocated size
uci1 8:95a325df1f6b 156
uci1 12:d472f9811262 157 #ifdef DEBUG
uci1 8:95a325df1f6b 158 printf("GetConfig, to=%u\r\n",timeOut);
uci1 12:d472f9811262 159 #endif
uci1 8:95a325df1f6b 160
uci1 8:95a325df1f6b 161 SnCommWin::ECommWinResult res = SnCommWin::kUndefFail;
uci1 8:95a325df1f6b 162 if (bsize<SnHeaderFrame::kMaxSizeOf || bsize<SnConfigFrame::kMaxSizeOf) {
uci1 8:95a325df1f6b 163 res = SnCommWin::kUndefFail;
uci1 8:95a325df1f6b 164 } else {
uci1 8:95a325df1f6b 165 // get header
uci1 8:95a325df1f6b 166 const int hlen = ReceiveAll(confBuf, SnHeaderFrame::SizeOf(), timeOut);
uci1 8:95a325df1f6b 167 if (hlen>0 && static_cast<uint32_t>(hlen)==SnHeaderFrame::SizeOf()) {
uci1 8:95a325df1f6b 168 uint8_t mcode=0; uint32_t mlen=0;
uci1 8:95a325df1f6b 169 const char* b = confBuf;
uci1 8:95a325df1f6b 170 SnHeaderFrame::ReadFrom(b, mcode, mlen);
uci1 12:d472f9811262 171 #ifdef DEBUG
uci1 8:95a325df1f6b 172 printf("mcode=%02x, mlen=%u\r\n", mcode, mlen);
uci1 12:d472f9811262 173 #endif
uci1 12:d472f9811262 174 if (mcode==SnHeaderFrame::kNoConfigCode) {
uci1 12:d472f9811262 175 // no config to get
uci1 12:d472f9811262 176 res = SnCommWin::kOkWithMsg;
uci1 12:d472f9811262 177 } else if (mcode!=SnHeaderFrame::kConfigCode) {
uci1 8:95a325df1f6b 178 res = SnCommWin::kUnexpectedRec;
uci1 8:95a325df1f6b 179 } else {
uci1 8:95a325df1f6b 180 // get config
uci1 8:95a325df1f6b 181 const int clen = ReceiveAll(confBuf, mlen, timeOut);
uci1 8:95a325df1f6b 182 if (clen>0 && static_cast<uint32_t>(clen)==mlen) {
uci1 8:95a325df1f6b 183 b = confBuf;
uci1 8:95a325df1f6b 184 conf.ReadFrom(b);
uci1 12:d472f9811262 185 res = SnCommWin::kOkWthMsgNoConf;
uci1 8:95a325df1f6b 186 } else {
uci1 8:95a325df1f6b 187 res = SnCommWin::kUnexpectedRec;
uci1 8:95a325df1f6b 188 }
uci1 8:95a325df1f6b 189 }
uci1 8:95a325df1f6b 190 } else {
uci1 8:95a325df1f6b 191 res = SnCommWin::kUnexpectedRec;
uci1 8:95a325df1f6b 192 }
uci1 8:95a325df1f6b 193 }
uci1 8:95a325df1f6b 194 return res;
uci1 8:95a325df1f6b 195 }
uci1 8:95a325df1f6b 196
uci1 8:95a325df1f6b 197 SnCommWin::ECommWinResult SnCommWin::SendStatus(const SnConfigFrame& conf,
uci1 8:95a325df1f6b 198 const SnEventFrame& evt,
uci1 8:95a325df1f6b 199 const SnPowerFrame& pow,
uci1 10:3c93db1cfb12 200 const uint16_t seq,
uci1 10:3c93db1cfb12 201 const float thmrate,
uci1 10:3c93db1cfb12 202 const float evtrate,
uci1 8:95a325df1f6b 203 char* const genBuf,
uci1 8:95a325df1f6b 204 const uint32_t timeout_clock) {
uci1 8:95a325df1f6b 205 // TODO: check if connected?
uci1 12:d472f9811262 206 #ifdef DEBUG
uci1 12:d472f9811262 207 printf("########### Send Status\r\n");
uci1 12:d472f9811262 208 #endif
uci1 8:95a325df1f6b 209 const uint32_t ssize = SnStatusFrame::SizeOf(SnStatusFrame::kIOVers, conf);
uci1 8:95a325df1f6b 210 char* b = genBuf;
uci1 8:95a325df1f6b 211 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kStatusCode, ssize);
uci1 10:3c93db1cfb12 212 SnStatusFrame::WriteTo(b, GetCommType(), conf, evt, genBuf, seq, thmrate, evtrate);
uci1 10:3c93db1cfb12 213 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kPowerCode,
uci1 10:3c93db1cfb12 214 pow.SizeOf(SnPowerFrame::kIOvers));
uci1 10:3c93db1cfb12 215 pow.WriteTo(b);
uci1 10:3c93db1cfb12 216 int msiz = b-genBuf;
uci1 10:3c93db1cfb12 217 int mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 8:95a325df1f6b 218 #ifdef DEBUG
uci1 8:95a325df1f6b 219 printf("status frame:\r\n");
uci1 8:95a325df1f6b 220 for (uint32_t i=0; i<msize; i++) {
uci1 8:95a325df1f6b 221 printf("%02X ",genBuf[i]);
uci1 8:95a325df1f6b 222 }
uci1 8:95a325df1f6b 223 printf("\r\n");
uci1 8:95a325df1f6b 224 #endif
uci1 10:3c93db1cfb12 225 msiz = b-genBuf;
uci1 10:3c93db1cfb12 226 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 8:95a325df1f6b 227 if (mlen==msiz) {
uci1 12:d472f9811262 228 #ifdef DEBUG
uci1 10:3c93db1cfb12 229 printf("status+power sent\r\n");
uci1 12:d472f9811262 230 #endif
uci1 8:95a325df1f6b 231 b = genBuf;
uci1 10:3c93db1cfb12 232 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kEventCode,
uci1 10:3c93db1cfb12 233 evt.SizeOf(SnEventFrame::kIOVers,
uci1 10:3c93db1cfb12 234 conf.GetWvLoseLSB(), conf.GetWvLoseMSB()));
uci1 10:3c93db1cfb12 235 evt.WriteTo(b, conf.GetWvLoseLSB(), conf.GetWvLoseMSB(),
uci1 10:3c93db1cfb12 236 conf.GetWvBaseline());
uci1 10:3c93db1cfb12 237 return SnCommWin::kOkMsgSent;
uci1 8:95a325df1f6b 238 }
uci1 8:95a325df1f6b 239 return SnCommWin::kFailPartSent;
uci1 8:95a325df1f6b 240 }
uci1 8:95a325df1f6b 241
uci1 12:d472f9811262 242 SnCommWin::ECommWinResult SnCommWin::SendFilename(const char* inf,
uci1 8:95a325df1f6b 243 char* const genBuf,
uci1 8:95a325df1f6b 244 const uint32_t timeout_clock) {
uci1 12:d472f9811262 245 #ifdef DEBUG
uci1 12:d472f9811262 246 printf("SnCommWin::SendFilename %s\r\n",inf);
uci1 12:d472f9811262 247 #endif
uci1 12:d472f9811262 248 // remove the directory
uci1 12:d472f9811262 249 const char* fn = strrchr(inf, '/');
uci1 12:d472f9811262 250 if (fn==0) {
uci1 12:d472f9811262 251 // no directory
uci1 12:d472f9811262 252 fn = inf;
uci1 12:d472f9811262 253 } else if (fn!=inf) {
uci1 12:d472f9811262 254 ++fn; // move past the '/' if it was found
uci1 12:d472f9811262 255 }
uci1 12:d472f9811262 256 #ifdef DEBUG
uci1 12:d472f9811262 257 printf("send %s\r\n",fn);
uci1 12:d472f9811262 258 #endif
uci1 8:95a325df1f6b 259 const size_t flen = strlen(fn);
uci1 8:95a325df1f6b 260 char* b = genBuf;
uci1 8:95a325df1f6b 261 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFilenameCode, flen);
uci1 12:d472f9811262 262 b = SnBitUtils::WriteTo(b, fn, flen);
uci1 12:d472f9811262 263 const int msiz = b-genBuf;
uci1 8:95a325df1f6b 264 const int mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 12:d472f9811262 265 #ifdef DEBUG
uci1 12:d472f9811262 266 printf("time = %u, timeout = %u\r\n",time(0), timeout_clock);
uci1 12:d472f9811262 267 #endif
uci1 8:95a325df1f6b 268 return (msiz==mlen) ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;
uci1 8:95a325df1f6b 269 }
uci1 8:95a325df1f6b 270
uci1 12:d472f9811262 271 int SnCommWin::SendFileBlock(FILE* inf,
uci1 12:d472f9811262 272 const uint8_t blockHeaderCode,
uci1 12:d472f9811262 273 const uint32_t blockSize,
uci1 12:d472f9811262 274 char* const genBuf,
uci1 12:d472f9811262 275 const uint32_t timeout) {
uci1 12:d472f9811262 276 // sends the block from the file. does not check if the file has sufficient bytes
uci1 12:d472f9811262 277 // this should be done before calling this function
uci1 12:d472f9811262 278 // (where the number of bytes in the file can be cached)
uci1 12:d472f9811262 279 char* b = genBuf;
uci1 12:d472f9811262 280 SnHeaderFrame::WriteTo(b, blockHeaderCode, blockSize);
uci1 12:d472f9811262 281 SnBitUtils::ReadFrom(inf, b, blockSize);
uci1 12:d472f9811262 282 #ifdef DEBUG
uci1 12:d472f9811262 283 printf("Sending block hc %02x, len=%u\r\n",blockHeaderCode,blockSize+SnHeaderFrame::SizeOf());
uci1 12:d472f9811262 284 #endif
uci1 12:d472f9811262 285 return SendAll(genBuf, blockSize+SnHeaderFrame::SizeOf(), timeout);
uci1 12:d472f9811262 286 }
uci1 12:d472f9811262 287
uci1 12:d472f9811262 288 SnCommWin::ECommWinResult SnCommWin::SendFileContents(FILE* inf,
uci1 12:d472f9811262 289 const SnConfigFrame& curConf,
uci1 12:d472f9811262 290 SnEventFrame& evt,
uci1 12:d472f9811262 291 SnPowerFrame& pow,
uci1 12:d472f9811262 292 char* const genBuf,
uci1 12:d472f9811262 293 uint32_t nevts,
uci1 12:d472f9811262 294 const uint32_t timeout_clock) {
uci1 12:d472f9811262 295 // firstEvt==0 ==> start at beginning
uci1 12:d472f9811262 296 // nevts==0 ==> all events
uci1 12:d472f9811262 297
uci1 12:d472f9811262 298 #ifdef DEBUG
uci1 12:d472f9811262 299 printf("SendFileContents (byte streaming)\r\n");
uci1 12:d472f9811262 300 #endif
uci1 12:d472f9811262 301
uci1 12:d472f9811262 302 // store position in file so we can go back to it afterwards
uci1 12:d472f9811262 303 // this is probably not necessary, because if this file is open
uci1 12:d472f9811262 304 // in write-only mode, we're screwed..
uci1 12:d472f9811262 305 const int fpos = ftell(inf);
uci1 12:d472f9811262 306 if (fpos>0) {
uci1 12:d472f9811262 307 fseek(inf, 0, SEEK_SET);
uci1 12:d472f9811262 308 }
uci1 12:d472f9811262 309 // how many bytes?
uci1 12:d472f9811262 310 fseek(inf, 0, SEEK_END); // go to end
uci1 12:d472f9811262 311 const int fend = ftell(inf);
uci1 12:d472f9811262 312 fseek(inf, 0, SEEK_SET); // go to start
uci1 12:d472f9811262 313 #ifdef DEBUG
uci1 12:d472f9811262 314 printf("fend=%d\r\n",fend);
uci1 12:d472f9811262 315 printf("fpos=%d\r\n",fpos);
uci1 12:d472f9811262 316 #endif
uci1 12:d472f9811262 317
uci1 12:d472f9811262 318 // variables used when sending data
uci1 12:d472f9811262 319 char* b = genBuf;
uci1 12:d472f9811262 320 int msiz, mlen;
uci1 12:d472f9811262 321
uci1 12:d472f9811262 322 // first is the file header, which has no SnHeaderFrame
uci1 12:d472f9811262 323 msiz = SnSDUtils::SizeOfFileHeader(SnSDUtils::kIOvers);
uci1 12:d472f9811262 324 bool ok = (ftell(inf)+msiz)<=fend;
uci1 12:d472f9811262 325 if (ok) {
uci1 12:d472f9811262 326 mlen = SendFileBlock(inf, SnHeaderFrame::kFileHeadrCode,
uci1 12:d472f9811262 327 msiz, genBuf, timeout_clock);
uci1 12:d472f9811262 328 ok &= (msiz+SnHeaderFrame::SizeOf())==mlen;
uci1 12:d472f9811262 329
uci1 12:d472f9811262 330 #ifdef DEBUG
uci1 12:d472f9811262 331 printf("sent file header. ok=%d\r\n",(int)ok);
uci1 12:d472f9811262 332 #endif
uci1 12:d472f9811262 333
uci1 12:d472f9811262 334 // the header info for each block
uci1 12:d472f9811262 335 uint8_t hcode;
uci1 12:d472f9811262 336 uint32_t hlen;
uci1 12:d472f9811262 337
uci1 12:d472f9811262 338 // count number of events / power readings sent
uci1 12:d472f9811262 339 uint32_t evtsSent=0, powsSent=0;
uci1 12:d472f9811262 340
uci1 12:d472f9811262 341 // now just loop through file and send each block
uci1 12:d472f9811262 342 while ( ok
uci1 12:d472f9811262 343 && (feof(inf)==0)
uci1 12:d472f9811262 344 && (ferror(inf)==0)
uci1 12:d472f9811262 345 && ((ftell(inf)+SnHeaderFrame::SizeOf())<=fend) ) {
uci1 12:d472f9811262 346 // read the header for the block
uci1 12:d472f9811262 347 SnSDUtils::ReadBlockHeader(inf, hcode, hlen);
uci1 12:d472f9811262 348 #ifdef DEBUG
uci1 12:d472f9811262 349 printf("new block: hc=%02x, hl=%u, ftell=%d, fend=%d\r\n",
uci1 12:d472f9811262 350 hcode, hlen, ftell(inf), fend);
uci1 12:d472f9811262 351 #endif
uci1 12:d472f9811262 352 ok &= (ftell(inf)+hlen)<=fend;
uci1 12:d472f9811262 353 if (ok) {
uci1 12:d472f9811262 354 // send the block
uci1 12:d472f9811262 355 // TODO: repack events?
uci1 12:d472f9811262 356 msiz = hlen + SnHeaderFrame::SizeOf();
uci1 12:d472f9811262 357 mlen = SendFileBlock(inf, hcode, hlen, genBuf, timeout_clock);
uci1 12:d472f9811262 358 ok &= msiz==mlen;
uci1 12:d472f9811262 359 if (ok) {
uci1 12:d472f9811262 360 if (hcode==SnHeaderFrame::kEventCode) {
uci1 12:d472f9811262 361 ++evtsSent;
uci1 12:d472f9811262 362 if (nevts>0) {
uci1 12:d472f9811262 363 if (evtsSent>=nevts) {
uci1 12:d472f9811262 364 #ifdef DEBUG
uci1 12:d472f9811262 365 printf("send %u events. stop\r\n",evtsSent);
uci1 12:d472f9811262 366 #endif
uci1 12:d472f9811262 367 break;
uci1 12:d472f9811262 368 }
uci1 12:d472f9811262 369 }
uci1 12:d472f9811262 370 } else if (hcode==SnHeaderFrame::kPowerCode) {
uci1 12:d472f9811262 371 ++powsSent;
uci1 12:d472f9811262 372 }
uci1 12:d472f9811262 373 } else {
uci1 12:d472f9811262 374 #ifdef DEBUG
uci1 12:d472f9811262 375 printf("not ok when sending hcode=%02x\r\n",hcode);
uci1 12:d472f9811262 376 #endif
uci1 12:d472f9811262 377 }
uci1 12:d472f9811262 378 }
uci1 12:d472f9811262 379 }
uci1 12:d472f9811262 380
uci1 12:d472f9811262 381 #ifdef DEBUG
uci1 12:d472f9811262 382 printf("loop done. ok=%d\r\n",(int)ok);
uci1 12:d472f9811262 383 #endif
uci1 12:d472f9811262 384
uci1 12:d472f9811262 385 // send number of events sent
uci1 12:d472f9811262 386 #ifdef DEBUG
uci1 12:d472f9811262 387 printf("sending evtsSent (%u)\r\n",evtsSent);
uci1 12:d472f9811262 388 #endif
uci1 12:d472f9811262 389 b = genBuf;
uci1 12:d472f9811262 390 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFileNevtsCode, sizeof(uint32_t));
uci1 12:d472f9811262 391 b = SnBitUtils::WriteTo(b, evtsSent);
uci1 12:d472f9811262 392 msiz = b - genBuf;
uci1 12:d472f9811262 393 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 12:d472f9811262 394 ok &= msiz==mlen;
uci1 12:d472f9811262 395
uci1 12:d472f9811262 396 // send number of power readings sent
uci1 12:d472f9811262 397 #ifdef DEBUG
uci1 12:d472f9811262 398 printf("sending powsSent (%u)\r\n",powsSent);
uci1 12:d472f9811262 399 #endif
uci1 12:d472f9811262 400 b = genBuf;
uci1 12:d472f9811262 401 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFileNpwrsCode, sizeof(uint32_t));
uci1 12:d472f9811262 402 b = SnBitUtils::WriteTo(b, powsSent);
uci1 12:d472f9811262 403 msiz = b - genBuf;
uci1 12:d472f9811262 404 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 12:d472f9811262 405 ok &= msiz==mlen;
uci1 12:d472f9811262 406
uci1 12:d472f9811262 407 }
uci1 12:d472f9811262 408
uci1 12:d472f9811262 409
uci1 12:d472f9811262 410 // put file position back
uci1 12:d472f9811262 411 fseek(inf, fpos, SEEK_SET);
uci1 12:d472f9811262 412
uci1 12:d472f9811262 413 #ifdef DEBUG
uci1 12:d472f9811262 414 printf("end contents: ok=%d\r\n",(int)ok);
uci1 12:d472f9811262 415 #endif
uci1 12:d472f9811262 416
uci1 12:d472f9811262 417 return ok ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;
uci1 12:d472f9811262 418 }
uci1 12:d472f9811262 419
uci1 12:d472f9811262 420 /*
uci1 8:95a325df1f6b 421 SnCommWin::ECommWinResult SnCommWin::SendFileContents(FILE* inf,
uci1 8:95a325df1f6b 422 const SnConfigFrame& curConf,
uci1 8:95a325df1f6b 423 SnEventFrame& evt,
uci1 8:95a325df1f6b 424 SnPowerFrame& pow,
uci1 8:95a325df1f6b 425 char* const genBuf,
uci1 8:95a325df1f6b 426 uint32_t nevts,
uci1 8:95a325df1f6b 427 const uint32_t timeout_clock,
uci1 8:95a325df1f6b 428 const uint32_t firstEvt) {
uci1 12:d472f9811262 429 printf("comm win send file contents\r\n");
uci1 8:95a325df1f6b 430 // firstEvt==0 ==> start at beginning
uci1 8:95a325df1f6b 431 // nevts==0 ==> all events
uci1 8:95a325df1f6b 432
uci1 8:95a325df1f6b 433 const int fpos = ftell(inf);
uci1 8:95a325df1f6b 434 if (fpos>0) {
uci1 8:95a325df1f6b 435 fseek(inf, 0, SEEK_SET);
uci1 8:95a325df1f6b 436 }
uci1 12:d472f9811262 437 // how many bytes?
uci1 12:d472f9811262 438 fseek(inf, 0, SEEK_END); // go to end
uci1 12:d472f9811262 439 const int fend = ftell(inf);
uci1 12:d472f9811262 440 fseek(inf, 0, SEEK_SET); // go to start
uci1 12:d472f9811262 441 printf("fend=%d\r\n",fend);
uci1 8:95a325df1f6b 442 printf("fpos=%d\r\n",fpos);
uci1 8:95a325df1f6b 443 // get file header
uci1 8:95a325df1f6b 444 uint64_t macadr;
uci1 8:95a325df1f6b 445 uint32_t run;
uci1 8:95a325df1f6b 446 uint16_t seq;
uci1 12:d472f9811262 447 bool ok = (ftell(inf)+SnSDUtils::SizeOfFileHeader(SnSDUtils::kIOvers))<=fend;
uci1 12:d472f9811262 448 if (ok) {
uci1 12:d472f9811262 449 SnSDUtils::ReadFileHeader(inf, macadr, run, seq, &pow);
uci1 12:d472f9811262 450 printf("read file header: run %u, seq %hu\r\n",run,seq);
uci1 12:d472f9811262 451 }
uci1 12:d472f9811262 452
uci1 12:d472f9811262 453 printf(">>> file hdr read ftell(inf)=%d\r\n",ftell(inf));
uci1 8:95a325df1f6b 454
uci1 8:95a325df1f6b 455 // check block
uci1 8:95a325df1f6b 456 uint8_t hcode;
uci1 8:95a325df1f6b 457 uint32_t hlen;
uci1 12:d472f9811262 458 ok &= (ftell(inf)+SnHeaderFrame::SizeOf())<=fend;
uci1 12:d472f9811262 459 if (ok) {
uci1 12:d472f9811262 460 SnSDUtils::ReadBlockHeader(inf, hcode, hlen);
uci1 12:d472f9811262 461 printf("read block hd %02x, len %u\r\n",hcode,hlen);
uci1 12:d472f9811262 462 if (hcode==SnHeaderFrame::kPowerCode) {
uci1 12:d472f9811262 463 ok &= (ftell(inf)+SnPowerFrame::SizeOf(SnPowerFrame::kIOvers))<=fend;
uci1 12:d472f9811262 464 if (ok) {
uci1 12:d472f9811262 465 pow.ReadFrom(inf);
uci1 12:d472f9811262 466 printf("read power: v1=%g, v2=%g\r\n",pow.GetAveV1(), pow.GetAveV2());
uci1 12:d472f9811262 467 // now read the next header
uci1 12:d472f9811262 468 ok &= (ftell(inf)+SnHeaderFrame::SizeOf())<=fend;
uci1 12:d472f9811262 469 if (ok) {
uci1 12:d472f9811262 470 SnSDUtils::ReadBlockHeader(inf, hcode, hlen);
uci1 12:d472f9811262 471 printf("read new header: hc %02x, hlen=%u\r\n",hcode,hlen);
uci1 12:d472f9811262 472 }
uci1 12:d472f9811262 473 }
uci1 12:d472f9811262 474 }
uci1 8:95a325df1f6b 475 }
uci1 8:95a325df1f6b 476
uci1 12:d472f9811262 477 printf(">>> power tried ftell(inf)=%d\r\n",ftell(inf));
uci1 12:d472f9811262 478
uci1 12:d472f9811262 479 printf("hcode=%02x\r\n",hcode);
uci1 12:d472f9811262 480 printf("ok=%d\r\n",(int)ok);
uci1 12:d472f9811262 481 printf("feof=%d\r\n",feof(inf));
uci1 12:d472f9811262 482 printf("ferror=%d\r\n",ferror(inf));
uci1 12:d472f9811262 483 printf("%d+%u <= %d ? %d\r\n",ftell(inf),hlen,fend,
uci1 12:d472f9811262 484 (int)((ftell(inf)+hlen)<=fend));
uci1 12:d472f9811262 485
uci1 8:95a325df1f6b 486 // TODO: check memory for temporary config/event frames?
uci1 8:95a325df1f6b 487 // get config
uci1 8:95a325df1f6b 488 while ((hcode!=SnHeaderFrame::kConfigCode)
uci1 12:d472f9811262 489 && ok
uci1 8:95a325df1f6b 490 && (feof(inf)==0)
uci1 12:d472f9811262 491 && (ferror(inf)==0)
uci1 12:d472f9811262 492 && ((ftell(inf)+hlen) <= fend) ) {
uci1 12:d472f9811262 493 printf("skip: ftell=%d, hlen=%u\r\n",ftell(inf),hlen);
uci1 8:95a325df1f6b 494 fseek(inf, hlen, SEEK_CUR); // skip this block
uci1 12:d472f9811262 495 ok = (ftell(inf)+SnHeaderFrame::SizeOf())<=fend;
uci1 12:d472f9811262 496 if (ok) {
uci1 12:d472f9811262 497 SnSDUtils::ReadBlockHeader(inf, hcode, hlen);
uci1 12:d472f9811262 498 printf("hcs >>> ftell(inf)=%d, hcode=%02x, hlen=%u\r\n",ftell(inf),hcode,hlen);
uci1 12:d472f9811262 499 printf("feof=%d, ferror=%d\r\n",feof(inf),ferror(inf));
uci1 12:d472f9811262 500 }
uci1 8:95a325df1f6b 501 }
uci1 8:95a325df1f6b 502
uci1 12:d472f9811262 503 printf("checking ftell\r\n");
uci1 12:d472f9811262 504 bool gotConf = false;
uci1 12:d472f9811262 505 ok = (ftell(inf)+hlen) <= fend;
uci1 12:d472f9811262 506 printf("making temp config\r\n");
uci1 12:d472f9811262 507 SnConfigFrame conf; // TODO: SOMETIMES STALLS HERE!
uci1 12:d472f9811262 508 printf("trying to read\r\n");
uci1 12:d472f9811262 509 if (ok && (hcode==SnHeaderFrame::kConfigCode)) {
uci1 12:d472f9811262 510 printf("reading config from ftell=%d, hcode=%02x, hlen=%u, ok=%d\r\n",
uci1 12:d472f9811262 511 ftell(inf), hcode, hlen, (int)ok);
uci1 12:d472f9811262 512 conf.ReadFrom(inf);
uci1 12:d472f9811262 513 gotConf = (ftell(inf) <= fend) && (feof(inf)==0) && (ferror(inf)==0);
uci1 12:d472f9811262 514 }
uci1 12:d472f9811262 515 printf(">>> conf. ftell(inf)=%d, gotconf=%d\r\n",ftell(inf),(int)gotConf);
uci1 8:95a325df1f6b 516
uci1 8:95a325df1f6b 517 char* b = genBuf;
uci1 12:d472f9811262 518 int msiz, mlen;
uci1 12:d472f9811262 519 if (ok && gotConf) {
uci1 12:d472f9811262 520 // get event size
uci1 12:d472f9811262 521 uint8_t sLoseLSB=0, sLoseMSB=0;
uci1 12:d472f9811262 522 uint16_t sWvBase=0;
uci1 12:d472f9811262 523 curConf.GetPackParsFor(GetCommType(), sLoseLSB, sLoseMSB, sWvBase);
uci1 12:d472f9811262 524
uci1 12:d472f9811262 525 // size of event in file
uci1 12:d472f9811262 526 const uint32_t esize = SnEventFrame::SizeOf(SnEventFrame::kIOVers,
uci1 12:d472f9811262 527 conf.GetWvLoseLSB(),
uci1 12:d472f9811262 528 conf.GetWvLoseMSB());
uci1 12:d472f9811262 529
uci1 12:d472f9811262 530 printf("esize=%u\r\n",esize);
uci1 12:d472f9811262 531
uci1 12:d472f9811262 532 // number of events / power readings we will send
uci1 12:d472f9811262 533 uint32_t evtsSent=0, powsSent=0;
uci1 8:95a325df1f6b 534 b = genBuf;
uci1 12:d472f9811262 535 // send the file header
uci1 12:d472f9811262 536 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFileHeadrCode,
uci1 12:d472f9811262 537 SnSDUtils::SizeOfFileHeader(SnSDUtils::kIOvers));
uci1 12:d472f9811262 538 SnSDUtils::WriteFileHeader(b, macadr, run, seq);
uci1 8:95a325df1f6b 539 msiz = b-genBuf;
uci1 8:95a325df1f6b 540 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 8:95a325df1f6b 541 if (mlen==msiz) {
uci1 12:d472f9811262 542 // send power header
uci1 8:95a325df1f6b 543 b = genBuf;
uci1 12:d472f9811262 544 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kPowerCode,
uci1 12:d472f9811262 545 pow.SizeOf(SnPowerFrame::kIOvers));
uci1 12:d472f9811262 546 pow.WriteTo(b);
uci1 8:95a325df1f6b 547 msiz = b-genBuf;
uci1 8:95a325df1f6b 548 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 12:d472f9811262 549 ++powsSent;
uci1 8:95a325df1f6b 550 if (mlen==msiz) {
uci1 12:d472f9811262 551 // send the config
uci1 12:d472f9811262 552 b = genBuf;
uci1 12:d472f9811262 553 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kConfigCode,
uci1 12:d472f9811262 554 conf.SizeOf(SnConfigFrame::kIOVers));
uci1 12:d472f9811262 555 conf.WriteTo(b);
uci1 12:d472f9811262 556 msiz = b-genBuf;
uci1 12:d472f9811262 557 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 12:d472f9811262 558 if (mlen==msiz) {
uci1 12:d472f9811262 559 ok = true;
uci1 12:d472f9811262 560 }
uci1 8:95a325df1f6b 561 }
uci1 8:95a325df1f6b 562 }
uci1 12:d472f9811262 563
uci1 12:d472f9811262 564 printf("ok=%d, nevts=%u\r\n",(int)ok,nevts);
uci1 8:95a325df1f6b 565
uci1 12:d472f9811262 566 if (ok) {
uci1 12:d472f9811262 567 // size of event sent over afar
uci1 12:d472f9811262 568 const uint32_t ssize = SnEventFrame::SizeOf(SnEventFrame::kIOVers,
uci1 12:d472f9811262 569 sLoseLSB, sLoseMSB);
uci1 12:d472f9811262 570
uci1 12:d472f9811262 571 // loop over blocks. send event & power frames
uci1 12:d472f9811262 572 // until EOF or nevets have been sent
uci1 12:d472f9811262 573 uint8_t hc; uint32_t hl;
uci1 12:d472f9811262 574 while (ok && (feof(inf)==0)
uci1 12:d472f9811262 575 && (ferror(inf)==0)
uci1 12:d472f9811262 576 && (ftell(inf)<fend) ) { // feof doesn't seem to work
uci1 12:d472f9811262 577 printf(">>> ftell(inf)=%d\r\n",ftell(inf));
uci1 12:d472f9811262 578 if ((ftell(inf)+SnHeaderFrame::SizeOf())<=fend) {
uci1 12:d472f9811262 579 SnSDUtils::ReadBlockHeader(inf, hc, hl);
uci1 12:d472f9811262 580 if (hc==SnHeaderFrame::kEventCode) {
uci1 12:d472f9811262 581 if ((ftell(inf)+ssize)<=fend) {
uci1 12:d472f9811262 582 evt.ReadFrom(inf, genBuf,
uci1 12:d472f9811262 583 conf.GetWvLoseLSB(), conf.GetWvLoseMSB(),
uci1 12:d472f9811262 584 conf.GetWvBaseline());
uci1 12:d472f9811262 585 if (evt.GetEvtNum()>=firstEvt) {
uci1 12:d472f9811262 586 ++evtsSent;
uci1 12:d472f9811262 587 printf("sending evt %u\r\n",evtsSent);
uci1 12:d472f9811262 588 // must be after evt.Read, since that uses the buffer
uci1 12:d472f9811262 589 b = genBuf;
uci1 12:d472f9811262 590 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kEventCode, ssize);
uci1 12:d472f9811262 591 evt.WriteTo(b, sLoseLSB, sLoseMSB, sWvBase); // will repack if necessary
uci1 12:d472f9811262 592 msiz = b-genBuf; //SnHeaderFrame::SizeOf()+ssize;
uci1 12:d472f9811262 593 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 12:d472f9811262 594 ok &= mlen==msiz;
uci1 12:d472f9811262 595 }
uci1 12:d472f9811262 596 } else {
uci1 12:d472f9811262 597 printf("event header, but not enough bytes in file\r\n");
uci1 12:d472f9811262 598 ok = false;
uci1 12:d472f9811262 599 }
uci1 12:d472f9811262 600 } else if (hc==SnHeaderFrame::kPowerCode) {
uci1 12:d472f9811262 601 if ((ftell(inf)+SnPowerFrame::SizeOf(SnPowerFrame::kIOvers))<=fend) {
uci1 12:d472f9811262 602 ++powsSent;
uci1 12:d472f9811262 603 pow.ReadFrom(inf);
uci1 12:d472f9811262 604 printf("sending power frame %u, v1=%g, v2=%g, t=%u\r\n",
uci1 12:d472f9811262 605 powsSent, pow.GetAveV1(), pow.GetAveV2(), pow.GetTime());
uci1 12:d472f9811262 606 b = genBuf;
uci1 12:d472f9811262 607 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kPowerCode,
uci1 12:d472f9811262 608 SnPowerFrame::SizeOf(SnPowerFrame::kIOvers));
uci1 12:d472f9811262 609 pow.WriteTo(b);
uci1 12:d472f9811262 610 msiz = b-genBuf;
uci1 12:d472f9811262 611 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 12:d472f9811262 612 ok &= mlen==msiz;
uci1 12:d472f9811262 613 } else {
uci1 12:d472f9811262 614 printf("power header, but not enough bytes in file\r\n");
uci1 12:d472f9811262 615 ok = false;
uci1 12:d472f9811262 616 }
uci1 12:d472f9811262 617 } else {
uci1 12:d472f9811262 618 printf("unhandled block. hc=%hhu, hl=%u\r\n",
uci1 12:d472f9811262 619 hc, hl);
uci1 12:d472f9811262 620 if ((ftell(inf)+hl)<=fend) {
uci1 12:d472f9811262 621 fseek(inf, hl, SEEK_CUR); // skip this block
uci1 12:d472f9811262 622 } else {
uci1 12:d472f9811262 623 printf("not enough bytes in file to skip block\r\n");
uci1 12:d472f9811262 624 ok = false;
uci1 12:d472f9811262 625 }
uci1 8:95a325df1f6b 626 }
uci1 8:95a325df1f6b 627 } else {
uci1 12:d472f9811262 628 printf("not enough bytes in file to read header\r\n");
uci1 12:d472f9811262 629 printf("feof=%d\r\n",feof(inf));
uci1 12:d472f9811262 630 printf("ftell(inf)=%d, hdr size=%u, fend=%u\r\n",
uci1 12:d472f9811262 631 (ftell(inf)), SnHeaderFrame::SizeOf(), fend);
uci1 8:95a325df1f6b 632 ok = false;
uci1 8:95a325df1f6b 633 }
uci1 8:95a325df1f6b 634 }
uci1 12:d472f9811262 635 // send number of events sent
uci1 12:d472f9811262 636 b = genBuf;
uci1 12:d472f9811262 637 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFileNevtsCode, sizeof(uint32_t));
uci1 12:d472f9811262 638 b = SnBitUtils::WriteTo(b, evtsSent);
uci1 12:d472f9811262 639 msiz = b - genBuf;
uci1 12:d472f9811262 640 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 12:d472f9811262 641 ok &= msiz==mlen;
uci1 12:d472f9811262 642 // send number of power readings sent
uci1 12:d472f9811262 643 b = genBuf;
uci1 12:d472f9811262 644 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFileNpwrsCode, sizeof(uint32_t));
uci1 12:d472f9811262 645 b = SnBitUtils::WriteTo(b, powsSent);
uci1 12:d472f9811262 646 msiz = b - genBuf;
uci1 12:d472f9811262 647 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 12:d472f9811262 648 ok &= msiz==mlen;
uci1 8:95a325df1f6b 649 }
uci1 12:d472f9811262 650 } else {
uci1 12:d472f9811262 651 printf("failed to get config from file\r\n");
uci1 12:d472f9811262 652 // send corrupted file handshake
uci1 8:95a325df1f6b 653 b = genBuf;
uci1 12:d472f9811262 654 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFileReadFailCode, 0u);
uci1 12:d472f9811262 655 msiz = b-genBuf;
uci1 8:95a325df1f6b 656 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 8:95a325df1f6b 657 ok &= msiz==mlen;
uci1 8:95a325df1f6b 658 }
uci1 12:d472f9811262 659
uci1 8:95a325df1f6b 660 // put file position back
uci1 8:95a325df1f6b 661 fseek(inf, fpos, SEEK_SET);
uci1 8:95a325df1f6b 662
uci1 8:95a325df1f6b 663 return ok ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;
uci1 8:95a325df1f6b 664 }
uci1 12:d472f9811262 665 */