Arianna autonomous DAQ firmware
Dependencies: mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW
SnCommAfarTCP.cpp@5:9cea89700c66, 2012-08-03 (annotated)
- Committer:
- uci1
- Date:
- Fri Aug 03 00:04:34 2012 +0000
- Revision:
- 5:9cea89700c66
- Parent:
- 4:a91682e19d6b
- Child:
- 6:6f002d202f59
Bug fix to power: set 0 for cards and amps if on. Still working on communications. Many debug printouts.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
uci1 | 3:24c5f0f50bf1 | 1 | /* |
uci1 | 3:24c5f0f50bf1 | 2 | #include "SnCommAfarTCP.h" |
uci1 | 3:24c5f0f50bf1 | 3 | |
uci1 | 5:9cea89700c66 | 4 | #define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) |
uci1 | 5:9cea89700c66 | 5 | |
uci1 | 5:9cea89700c66 | 6 | const int SnCommAfarTCP::kSockTimeoutMs = 10; |
uci1 | 5:9cea89700c66 | 7 | |
uci1 | 4:a91682e19d6b | 8 | SnCommAfarTCP::SnCommAfarTCP(const bool useb64, |
uci1 | 4:a91682e19d6b | 9 | char* const b64buf, const uint32_t bblen) : |
uci1 | 4:a91682e19d6b | 10 | fUseB64(useb64), fB64buf(b64buf), fbblen(bblen), fRmtServ(remote), |
uci1 | 3:24c5f0f50bf1 | 11 | fEth(new EthernetInterface), fSock(new TCPSocketConnection) { |
uci1 | 3:24c5f0f50bf1 | 12 | |
uci1 | 3:24c5f0f50bf1 | 13 | fEth->init("128.195.204.148", // my IP |
uci1 | 3:24c5f0f50bf1 | 14 | "255.255.255.0", // mask |
uci1 | 3:24c5f0f50bf1 | 15 | "128.195.204.1"); // gateway |
uci1 | 3:24c5f0f50bf1 | 16 | |
uci1 | 3:24c5f0f50bf1 | 17 | fRserv = "128.195.204.151"; |
uci1 | 3:24c5f0f50bf1 | 18 | fRport = 6655; |
uci1 | 3:24c5f0f50bf1 | 19 | |
uci1 | 3:24c5f0f50bf1 | 20 | } |
uci1 | 3:24c5f0f50bf1 | 21 | |
uci1 | 3:24c5f0f50bf1 | 22 | SnCommAfarTCP::~SnCommAfarTCP() { |
uci1 | 3:24c5f0f50bf1 | 23 | delete fEth; |
uci1 | 3:24c5f0f50bf1 | 24 | delete fSock; |
uci1 | 3:24c5f0f50bf1 | 25 | } |
uci1 | 3:24c5f0f50bf1 | 26 | |
uci1 | 5:9cea89700c66 | 27 | int SnCommAfarTCP::DoIO(const char* const data, |
uci1 | 5:9cea89700c66 | 28 | const uint32_t length, |
uci1 | 5:9cea89700c66 | 29 | const uint32_t timeout_clock, |
uci1 | 5:9cea89700c66 | 30 | TCPSendRecv fcn) { |
uci1 | 5:9cea89700c66 | 31 | // TODO: if B64, must return number of bytes of raw (non encoded) message |
uci1 | 3:24c5f0f50bf1 | 32 | int res=0; |
uci1 | 3:24c5f0f50bf1 | 33 | uint32_t b=0; |
uci1 | 3:24c5f0f50bf1 | 34 | while ( (length>b) && (time(0)<timeout_clock) ) { |
uci1 | 5:9cea89700c66 | 35 | res = CALL_MEMBER_FN(*fSock, fcn)(data+b, length-b, kSockTimeoutMs); |
uci1 | 4:a91682e19d6b | 36 | switch (res) { |
uci1 | 4:a91682e19d6b | 37 | case -1: |
uci1 | 4:a91682e19d6b | 38 | // TODO: how to check the error? |
uci1 | 4:a91682e19d6b | 39 | continue; |
uci1 | 4:a91682e19d6b | 40 | case 0: |
uci1 | 4:a91682e19d6b | 41 | return res; |
uci1 | 4:a91682e19d6b | 42 | default: |
uci1 | 4:a91682e19d6b | 43 | b += res; |
uci1 | 4:a91682e19d6b | 44 | }; |
uci1 | 3:24c5f0f50bf1 | 45 | } |
uci1 | 4:a91682e19d6b | 46 | return res; // timeout |
uci1 | 3:24c5f0f50bf1 | 47 | } |
uci1 | 3:24c5f0f50bf1 | 48 | |
uci1 | 5:9cea89700c66 | 49 | int SnCommAfarTCP::ReceiveAll(char* const buf, const uin32_t mlen, |
uci1 | 5:9cea89700c66 | 50 | const uint32_t timeout_clock) { |
uci1 | 5:9cea89700c66 | 51 | // TODO: if B64, must return number of bytes of raw (non encoded) message |
uci1 | 5:9cea89700c66 | 52 | return DoIO(data, length, timeout_clock, &(TCPSocketConnection::receive_all)); |
uci1 | 5:9cea89700c66 | 53 | } |
uci1 | 5:9cea89700c66 | 54 | |
uci1 | 5:9cea89700c66 | 55 | int SnCommAfarTCP::SendAll(const char* const data, const uint32_t length, |
uci1 | 5:9cea89700c66 | 56 | const uint32_t timeout_clock) { |
uci1 | 5:9cea89700c66 | 57 | // TODO: if B64, must return number of bytes of raw (non encoded) message |
uci1 | 5:9cea89700c66 | 58 | return DoIO(data, length, timeout_clock, &(TCPSocketConnection::send_all)); |
uci1 | 5:9cea89700c66 | 59 | } |
uci1 | 5:9cea89700c66 | 60 | |
uci1 | 3:24c5f0f50bf1 | 61 | |
uci1 | 3:24c5f0f50bf1 | 62 | bool SnCommAfarTCP::Connect(const uint32_t timeout) { |
uci1 | 3:24c5f0f50bf1 | 63 | bool isConn = false; |
uci1 | 3:24c5f0f50bf1 | 64 | |
uci1 | 3:24c5f0f50bf1 | 65 | while ( (isConn==false) && ( time(0) < timeout) ) { |
uci1 | 3:24c5f0f50bf1 | 66 | wait_ms(250); |
uci1 | 3:24c5f0f50bf1 | 67 | isConn = (fEth->connect()==0); |
uci1 | 3:24c5f0f50bf1 | 68 | } |
uci1 | 3:24c5f0f50bf1 | 69 | |
uci1 | 3:24c5f0f50bf1 | 70 | while ( (isConn==false) && ( time(0) < timeout) ) { |
uci1 | 3:24c5f0f50bf1 | 71 | wait_ms(250); |
uci1 | 3:24c5f0f50bf1 | 72 | isConn = (fSock->connect(fRserv.c_str(), fRport)==0);s |
uci1 | 3:24c5f0f50bf1 | 73 | } |
uci1 | 3:24c5f0f50bf1 | 74 | |
uci1 | 3:24c5f0f50bf1 | 75 | return isConn; |
uci1 | 3:24c5f0f50bf1 | 76 | } |
uci1 | 3:24c5f0f50bf1 | 77 | |
uci1 | 3:24c5f0f50bf1 | 78 | SnCommWin::ECommWinResult SnCommAfarTCP::OpenWindow(const uint32_t timeout, |
uci1 | 3:24c5f0f50bf1 | 79 | const bool sendStatus, |
uci1 | 3:24c5f0f50bf1 | 80 | const SnConfigFrame& conf, |
uci1 | 3:24c5f0f50bf1 | 81 | const SnEventFrame& evt, |
uci1 | 3:24c5f0f50bf1 | 82 | char* const genBuf) { |
uci1 | 3:24c5f0f50bf1 | 83 | const bool canCon = Connect(timeout); |
uci1 | 3:24c5f0f50bf1 | 84 | |
uci1 | 3:24c5f0f50bf1 | 85 | SnCommWin::ECommWinResult ret = canCon ? SnCommWin::kConnected |
uci1 | 3:24c5f0f50bf1 | 86 | : SnCommWin::kCanNotConnect; |
uci1 | 3:24c5f0f50bf1 | 87 | |
uci1 | 3:24c5f0f50bf1 | 88 | if (canCon && sendStatus) { |
uci1 | 3:24c5f0f50bf1 | 89 | ret = SendStatus(conf, evt, genBuf); |
uci1 | 3:24c5f0f50bf1 | 90 | } |
uci1 | 3:24c5f0f50bf1 | 91 | |
uci1 | 3:24c5f0f50bf1 | 92 | return ret; |
uci1 | 3:24c5f0f50bf1 | 93 | } |
uci1 | 4:a91682e19d6b | 94 | |
uci1 | 4:a91682e19d6b | 95 | SnCommWin::ECommWinResult SnCommAfarTCP::WaitHandshake(const uint32_t timeout, |
uci1 | 4:a91682e19d6b | 96 | char* const buf, |
uci1 | 5:9cea89700c66 | 97 | const uint32_t bsize, |
uci1 | 5:9cea89700c66 | 98 | uint8_t& hndShkCode) { |
uci1 | 4:a91682e19d6b | 99 | printf("WaitHandshake, to=%u\r\n",timeout); |
uci1 | 4:a91682e19d6b | 100 | |
uci1 | 5:9cea89700c66 | 101 | const int mlen = ReceiveAll(buf, SnHeaderFrame::SizeOf(), timeout); |
uci1 | 5:9cea89700c66 | 102 | if (mlen>0 && static_cast<uint32_t>(mlen) == SnHeaderFrame::SizeOf()) { |
uci1 | 4:a91682e19d6b | 103 | uint32_t msgLen=0; |
uci1 | 4:a91682e19d6b | 104 | const char* b = buf; |
uci1 | 5:9cea89700c66 | 105 | SnHeaderFrame::ReadFrom(b, hndShkCode, msgLen); |
uci1 | 5:9cea89700c66 | 106 | if ((hndShkCode & SnHeaderFrame::kHndShkBits)!=0) { |
uci1 | 4:a91682e19d6b | 107 | return SnCommWin::kOkWithMsg; |
uci1 | 4:a91682e19d6b | 108 | } else { |
uci1 | 4:a91682e19d6b | 109 | // TODO: somehow handle unexpected message? |
uci1 | 4:a91682e19d6b | 110 | return SnCommWin::kUnexpectedRec; |
uci1 | 4:a91682e19d6b | 111 | } |
uci1 | 4:a91682e19d6b | 112 | } |
uci1 | 4:a91682e19d6b | 113 | return SnCommWin::kOkNoMsg; |
uci1 | 4:a91682e19d6b | 114 | } |
uci1 | 5:9cea89700c66 | 115 | |
uci1 | 5:9cea89700c66 | 116 | SnCommWin::ECommWinResult SnCommAfarTCP::GetConfig(SnConfigFrame& conf, |
uci1 | 5:9cea89700c66 | 117 | const uint32_t timeOut, |
uci1 | 5:9cea89700c66 | 118 | char* const confBuf, |
uci1 | 5:9cea89700c66 | 119 | const uint32_t bsize) { |
uci1 | 5:9cea89700c66 | 120 | // confBuf assumed to alread be of allocated size |
uci1 | 5:9cea89700c66 | 121 | |
uci1 | 5:9cea89700c66 | 122 | printf("GetConfig, to=%u\r\n",timeOut); |
uci1 | 5:9cea89700c66 | 123 | |
uci1 | 5:9cea89700c66 | 124 | SnCommWin::ECommWinResult res = SnCommWin::kUndefFail; |
uci1 | 5:9cea89700c66 | 125 | if (bsize<SnHeaderFrame::SizeOf() || bsize<conf.SizeOf()) { |
uci1 | 5:9cea89700c66 | 126 | res = SnCommWin::kUndefFail; |
uci1 | 5:9cea89700c66 | 127 | } else { |
uci1 | 5:9cea89700c66 | 128 | // get header |
uci1 | 5:9cea89700c66 | 129 | const int hlen = ReceiveAll(confBuf, SnHeaderFrame::SizeOf(), timeOut); |
uci1 | 5:9cea89700c66 | 130 | if (hlen>0 && static_cast<uint32_t>(hlen)==SnHeaderFrame::SizeOf()) { |
uci1 | 5:9cea89700c66 | 131 | uint8_t mcode=0; uint32_t mlen=0; |
uci1 | 5:9cea89700c66 | 132 | SnHeaderFrame::ReadFrom(b, mcode, mlen); |
uci1 | 5:9cea89700c66 | 133 | printf("mcode=%02x, mlen=%u\r\n", mcode, mlen); |
uci1 | 5:9cea89700c66 | 134 | if (mcode!=SnHeaderFrame::kConfigCode) { |
uci1 | 5:9cea89700c66 | 135 | res = SnCommWin::kUnexpectedRec; |
uci1 | 5:9cea89700c66 | 136 | } else { |
uci1 | 5:9cea89700c66 | 137 | // get config |
uci1 | 5:9cea89700c66 | 138 | const int clen = ReceiveAll(confBuf, mlen, timeOut); |
uci1 | 5:9cea89700c66 | 139 | if (clen>0 && static_cast<uint32_t>(clen)==mlen) { |
uci1 | 5:9cea89700c66 | 140 | conf.ReadFrom(confBuf); |
uci1 | 5:9cea89700c66 | 141 | res = SnCommWin::kOkWithMsg; |
uci1 | 5:9cea89700c66 | 142 | } else { |
uci1 | 5:9cea89700c66 | 143 | res = SnCommWin::kUnexpectedRec; |
uci1 | 5:9cea89700c66 | 144 | } |
uci1 | 5:9cea89700c66 | 145 | } |
uci1 | 5:9cea89700c66 | 146 | } else { |
uci1 | 5:9cea89700c66 | 147 | res = SnCommWin::kUnexpectedRec; |
uci1 | 5:9cea89700c66 | 148 | } |
uci1 | 5:9cea89700c66 | 149 | } |
uci1 | 5:9cea89700c66 | 150 | return res; |
uci1 | 5:9cea89700c66 | 151 | } |
uci1 | 5:9cea89700c66 | 152 | |
uci1 | 5:9cea89700c66 | 153 | SnCommWin::ECommWinResult SnCommAfarTCP::SendStatus(const SnConfigFrame& conf, |
uci1 | 5:9cea89700c66 | 154 | const SnEventFrame& evt, |
uci1 | 5:9cea89700c66 | 155 | char* const genBuf, |
uci1 | 5:9cea89700c66 | 156 | const uint32_t timeout_clock) { |
uci1 | 5:9cea89700c66 | 157 | // TODO: check if connected? |
uci1 | 5:9cea89700c66 | 158 | const uint32_t ssize = SnStatusFrame::SizeOf(conf); |
uci1 | 5:9cea89700c66 | 159 | char* b = genBuf; |
uci1 | 5:9cea89700c66 | 160 | SnHeaderFrame::WriteTo(b, SnHeaderFrame::kStatusCode, ssize); |
uci1 | 5:9cea89700c66 | 161 | SnStatusFrame::WriteTo(b, SnConfigFrame::kAfar, conf, evt, genBuf); |
uci1 | 5:9cea89700c66 | 162 | #ifdef DEBUG |
uci1 | 5:9cea89700c66 | 163 | printf("status frame:\r\n"); |
uci1 | 5:9cea89700c66 | 164 | for (uint32_t i=0; i<msize; i++) { |
uci1 | 5:9cea89700c66 | 165 | printf("%02X ",genBuf[i]); |
uci1 | 5:9cea89700c66 | 166 | } |
uci1 | 5:9cea89700c66 | 167 | printf("\r\n"); |
uci1 | 5:9cea89700c66 | 168 | #endif |
uci1 | 5:9cea89700c66 | 169 | const int mlen = SendAll(genBuf, b-genBuf, timeout_clock); |
uci1 | 5:9cea89700c66 | 170 | printf("status sent\r\n"); |
uci1 | 5:9cea89700c66 | 171 | return (b-genBuf==mlen) ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent; |
uci1 | 5:9cea89700c66 | 172 | } |
uci1 | 5:9cea89700c66 | 173 | |
uci1 | 5:9cea89700c66 | 174 | SnCommWin::ECommWinResult SnCommAfarTCP::SendFilename(const char* fn, |
uci1 | 5:9cea89700c66 | 175 | char* const genBuf, |
uci1 | 5:9cea89700c66 | 176 | const uint32_t timeout_clock) { |
uci1 | 5:9cea89700c66 | 177 | printf("afar send filename %s\r\n",fn); |
uci1 | 5:9cea89700c66 | 178 | const size_t flen = strlen(fn); |
uci1 | 5:9cea89700c66 | 179 | char* b = genBuf; |
uci1 | 5:9cea89700c66 | 180 | SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFilenameCode, flen); |
uci1 | 5:9cea89700c66 | 181 | sprintf(b, "%s", fn); |
uci1 | 5:9cea89700c66 | 182 | const int msiz = SnHeaderFrame::SizeOf()+flen; |
uci1 | 5:9cea89700c66 | 183 | const int mlen = SendAll(genBuf, msiz, timeout_clock); |
uci1 | 5:9cea89700c66 | 184 | return (msiz==mlen) ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent; |
uci1 | 5:9cea89700c66 | 185 | } |
uci1 | 5:9cea89700c66 | 186 | |
uci1 | 5:9cea89700c66 | 187 | SnCommWin::ECommWinResult SnCommAfar::SendFileContents(FILE* inf, |
uci1 | 5:9cea89700c66 | 188 | const SnConfigFrame& curConf, |
uci1 | 5:9cea89700c66 | 189 | SnEventFrame& evt, |
uci1 | 5:9cea89700c66 | 190 | char* const genBuf, |
uci1 | 5:9cea89700c66 | 191 | uint32_t nevts, |
uci1 | 5:9cea89700c66 | 192 | const uint32_t timeout_clock, |
uci1 | 5:9cea89700c66 | 193 | const uint32_t firstEvt) { |
uci1 | 5:9cea89700c66 | 194 | printf("afar send conf and events\r\n"); |
uci1 | 5:9cea89700c66 | 195 | // firstEvt==0 ==> start at beginning |
uci1 | 5:9cea89700c66 | 196 | // nevts==0 ==> all events |
uci1 | 5:9cea89700c66 | 197 | |
uci1 | 5:9cea89700c66 | 198 | const int fpos = ftell(inf); |
uci1 | 5:9cea89700c66 | 199 | if (fpos>0) { |
uci1 | 5:9cea89700c66 | 200 | fseek(inf, 0, SEEK_SET); |
uci1 | 5:9cea89700c66 | 201 | } |
uci1 | 5:9cea89700c66 | 202 | |
uci1 | 5:9cea89700c66 | 203 | printf("fpos=%d\r\n",fpos); |
uci1 | 5:9cea89700c66 | 204 | |
uci1 | 5:9cea89700c66 | 205 | // get file header |
uci1 | 5:9cea89700c66 | 206 | uint64_t macadr; |
uci1 | 5:9cea89700c66 | 207 | uint32_t run; |
uci1 | 5:9cea89700c66 | 208 | uint16_t seq, v1, v2; |
uci1 | 5:9cea89700c66 | 209 | SnSDUtils::ReadFileHeader(inf, macadr, run, seq, v1, v2); |
uci1 | 5:9cea89700c66 | 210 | |
uci1 | 5:9cea89700c66 | 211 | // TODO: check memory for temporary config/event frames? |
uci1 | 5:9cea89700c66 | 212 | // get config |
uci1 | 5:9cea89700c66 | 213 | SnConfigFrame conf; |
uci1 | 5:9cea89700c66 | 214 | conf.ReadFrom(inf); |
uci1 | 5:9cea89700c66 | 215 | |
uci1 | 5:9cea89700c66 | 216 | // get event size |
uci1 | 5:9cea89700c66 | 217 | uint8_t sLoseLSB=0, sLoseMSB=0; |
uci1 | 5:9cea89700c66 | 218 | uint16_t sWvBase=0; |
uci1 | 5:9cea89700c66 | 219 | curConf.GetPackParsFor(SnConfigFrame::kAfar, sLoseLSB, sLoseMSB, sWvBase); |
uci1 | 5:9cea89700c66 | 220 | // do we have to unpack & repack events? |
uci1 | 5:9cea89700c66 | 221 | const bool repack = (sLoseLSB != conf.GetWvLoseLSB()) |
uci1 | 5:9cea89700c66 | 222 | && (sLoseMSB != conf.GetWvLoseMSB()) |
uci1 | 5:9cea89700c66 | 223 | && (sWvBase != conf.GetWvBaseline()); |
uci1 | 5:9cea89700c66 | 224 | // size of event in file |
uci1 | 5:9cea89700c66 | 225 | const uint32_t esize = SnEventFrame::SizeOf(conf.GetWvLoseLSB(), |
uci1 | 5:9cea89700c66 | 226 | conf.GetWvLoseMSB()); |
uci1 | 5:9cea89700c66 | 227 | |
uci1 | 5:9cea89700c66 | 228 | printf("repack=%d, esize=%u\r\n",(int)repack,esize); |
uci1 | 5:9cea89700c66 | 229 | |
uci1 | 5:9cea89700c66 | 230 | // how many events? |
uci1 | 5:9cea89700c66 | 231 | // move up to first event |
uci1 | 5:9cea89700c66 | 232 | if (firstEvt>0) { |
uci1 | 5:9cea89700c66 | 233 | printf("skip ahead %d\r\n",firstEvt*esize); |
uci1 | 5:9cea89700c66 | 234 | fseek(inf, (firstEvt*esize), SEEK_CUR); |
uci1 | 5:9cea89700c66 | 235 | } |
uci1 | 5:9cea89700c66 | 236 | // get remaining file size |
uci1 | 5:9cea89700c66 | 237 | const int fcur = ftell(inf); |
uci1 | 5:9cea89700c66 | 238 | fseek(inf, 0, SEEK_END); |
uci1 | 5:9cea89700c66 | 239 | const int fend = ftell(inf); |
uci1 | 5:9cea89700c66 | 240 | fseek(inf, fcur, SEEK_SET); |
uci1 | 5:9cea89700c66 | 241 | const int nevtsLeft = (fend-fcur)/esize; // TODO: check for remainder? |
uci1 | 5:9cea89700c66 | 242 | if (nevts==0 || nevtsLeft<nevts) { |
uci1 | 5:9cea89700c66 | 243 | nevts = nevtsLeft; |
uci1 | 5:9cea89700c66 | 244 | } |
uci1 | 5:9cea89700c66 | 245 | |
uci1 | 5:9cea89700c66 | 246 | // send number of events to expect |
uci1 | 5:9cea89700c66 | 247 | bool ok = false; |
uci1 | 5:9cea89700c66 | 248 | char* b = genBuf; |
uci1 | 5:9cea89700c66 | 249 | SnHeaderFrame::WriteTo(genBuf, SnHeaderFrame::kFileNevtsCode, nevts); |
uci1 | 5:9cea89700c66 | 250 | int mlen = SendAll(genBuf, SnHeaderFrame::SizeOf(), timeout_clock); |
uci1 | 5:9cea89700c66 | 251 | if (mlen==SnHeaderFrame::SizeOf()) { |
uci1 | 5:9cea89700c66 | 252 | // send the file header |
uci1 | 5:9cea89700c66 | 253 | SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFileHeadrCode, SnSDUtils::SizeOfFileHeader()); |
uci1 | 5:9cea89700c66 | 254 | SnSDUtils::WriteFileHeader(b, macadr, run, seq, v1, v2); |
uci1 | 5:9cea89700c66 | 255 | int msiz = SnHeaderFrame::SizeOf()+SnSDUtils::SizeOfFileHeader(); |
uci1 | 5:9cea89700c66 | 256 | mlen = SendAll(genBuf, msiz, timeout_clock); |
uci1 | 5:9cea89700c66 | 257 | if (mlen==msiz) { |
uci1 | 5:9cea89700c66 | 258 | // send the config |
uci1 | 5:9cea89700c66 | 259 | b = genBuf; |
uci1 | 5:9cea89700c66 | 260 | SnHeaderFrame::WriteTo(b, SnHeaderFrame::kConfAndEvtsCode, conf.SizeOf()); |
uci1 | 5:9cea89700c66 | 261 | conf.WriteTo(b); |
uci1 | 5:9cea89700c66 | 262 | msiz = SnHeaderFrame::SizeOf()+conf.SizeOf(); |
uci1 | 5:9cea89700c66 | 263 | mlen = SendAll(genBuf, msiz, timeout_clock); |
uci1 | 5:9cea89700c66 | 264 | if (mlen==msiz) { |
uci1 | 5:9cea89700c66 | 265 | ok = true; |
uci1 | 5:9cea89700c66 | 266 | } |
uci1 | 5:9cea89700c66 | 267 | } |
uci1 | 5:9cea89700c66 | 268 | } |
uci1 | 5:9cea89700c66 | 269 | |
uci1 | 5:9cea89700c66 | 270 | printf("ok=%d, nevts=%u\r\n",(int)ok,nevts); |
uci1 | 5:9cea89700c66 | 271 | //TODO HERE |
uci1 | 5:9cea89700c66 | 272 | |
uci1 | 5:9cea89700c66 | 273 | if (ok) { |
uci1 | 5:9cea89700c66 | 274 | // size of event sent over afar |
uci1 | 5:9cea89700c66 | 275 | const uint32_t ssize = (repack) ? |
uci1 | 5:9cea89700c66 | 276 | SnEventFrame::SizeOf(sLoseLSB, sLoseMSB) : |
uci1 | 5:9cea89700c66 | 277 | esize; |
uci1 | 5:9cea89700c66 | 278 | |
uci1 | 5:9cea89700c66 | 279 | for (uint32_t i=0; (i<nevts) && ok; i++) { |
uci1 | 5:9cea89700c66 | 280 | if (feof(inf)==0 && ferror(inf)==0 && ((ftell(inf)+ssize)<=fend)) { |
uci1 | 5:9cea89700c66 | 281 | printf("sending evt %u\r\n",i); |
uci1 | 5:9cea89700c66 | 282 | if (repack) { |
uci1 | 5:9cea89700c66 | 283 | evt.ReadFrom(inf, genBuf, |
uci1 | 5:9cea89700c66 | 284 | conf.GetWvLoseLSB(), conf.GetWvLoseMSB(), |
uci1 | 5:9cea89700c66 | 285 | conf.GetWvBaseline()); |
uci1 | 5:9cea89700c66 | 286 | // must be after evt.Read, since that uses the buffer |
uci1 | 5:9cea89700c66 | 287 | b = genBuf; |
uci1 | 5:9cea89700c66 | 288 | SnHeaderFrame::WriteTo(b, SnHeaderFrame::kEventCode, ssize); |
uci1 | 5:9cea89700c66 | 289 | evt.WriteTo(b, sLoseLSB, sLoseMSB, sWvBase); |
uci1 | 5:9cea89700c66 | 290 | ok &= GetWS().sendBinary( |
uci1 | 5:9cea89700c66 | 291 | genBuf, ssize+SnHeaderFrame::SizeOf(), |
uci1 | 5:9cea89700c66 | 292 | fB64buf); |
uci1 | 5:9cea89700c66 | 293 | } else { |
uci1 | 5:9cea89700c66 | 294 | ok &= GetWS().sendBinary( |
uci1 | 5:9cea89700c66 | 295 | SnHeaderFrame::GetHdBuf(SnHeaderFrame::kEventCode, |
uci1 | 5:9cea89700c66 | 296 | ssize), |
uci1 | 5:9cea89700c66 | 297 | SnHeaderFrame::SizeOf(), |
uci1 | 5:9cea89700c66 | 298 | inf, ssize, |
uci1 | 5:9cea89700c66 | 299 | fB64buf); |
uci1 | 5:9cea89700c66 | 300 | } |
uci1 | 5:9cea89700c66 | 301 | } else { |
uci1 | 5:9cea89700c66 | 302 | printf("cannot send requested event\r\n"); |
uci1 | 5:9cea89700c66 | 303 | ok=false; |
uci1 | 5:9cea89700c66 | 304 | } |
uci1 | 5:9cea89700c66 | 305 | } |
uci1 | 5:9cea89700c66 | 306 | } |
uci1 | 5:9cea89700c66 | 307 | |
uci1 | 5:9cea89700c66 | 308 | fseek(inf, fpos, SEEK_SET); |
uci1 | 5:9cea89700c66 | 309 | |
uci1 | 5:9cea89700c66 | 310 | return ok ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent; |
uci1 | 5:9cea89700c66 | 311 | } |
uci1 | 3:24c5f0f50bf1 | 312 | */ |