OpenCores
URL https://opencores.org/ocsvn/w11/w11/trunk

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.7/] [tools/] [src/] [librlink/] [RlinkPacketBufSnd.cpp] - Blame information for rev 28

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 28 wfjm
// $Id: RlinkPacketBufSnd.cpp 621 2014-12-26 21:20:05Z mueller $
2 27 wfjm
//
3
// Copyright 2014- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4
//
5
// This program is free software; you may redistribute and/or modify it under
6
// the terms of the GNU General Public License as published by the Free
7
// Software Foundation, either version 2, or at your option any later version.
8
//
9
// This program is distributed in the hope that it will be useful, but
10
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
11
// or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12
// for complete details.
13
// 
14
// Revision History: 
15
// Date         Rev Version  Comment
16 28 wfjm
// 2014-12-25   621   1.0.1  Reorganize packet send/revd stats
17 27 wfjm
// 2014-11-15   604   1.0    Initial version
18
// 2014-11-02   600   0.1    First draft (re-organize PacketBuf for rlink v4)
19
// ---------------------------------------------------------------------------
20
 
21
/*!
22
  \file
23 28 wfjm
  \version $Id: RlinkPacketBufSnd.cpp 621 2014-12-26 21:20:05Z mueller $
24 27 wfjm
  \brief   Implemenation of class RlinkPacketBuf.
25
 */
26
 
27
#include <sys/time.h>
28
 
29
#include "RlinkPacketBufSnd.hpp"
30
 
31
#include "librtools/RosFill.hpp"
32
#include "librtools/RosPrintf.hpp"
33
#include "librtools/RosPrintBvi.hpp"
34
#include "librtools/Rexception.hpp"
35
 
36
using namespace std;
37
 
38
/*!
39
  \class Retro::RlinkPacketBufSnd
40
  \brief FIXME_docs
41
*/
42
 
43
// all method definitions in namespace Retro
44
namespace Retro {
45
 
46
//------------------------------------------+-----------------------------------
47
//! Default constructor
48
 
49
RlinkPacketBufSnd::RlinkPacketBufSnd()
50
  : fRawBuf()
51
{
52
  // Statistic setup
53 28 wfjm
  fStats.Define(kStatNTxPktByt, "NTxPktByt", "Tx packet bytes send");
54 27 wfjm
  fStats.Define(kStatNTxEsc,    "NTxEsc",    "Tx data escapes");
55
}
56
 
57
//------------------------------------------+-----------------------------------
58
//! Destructor
59
 
60
RlinkPacketBufSnd::~RlinkPacketBufSnd()
61
{}
62
 
63
//------------------------------------------+-----------------------------------
64
//! FIXME_docs
65
 
66
void RlinkPacketBufSnd::Init()
67
{
68
  fPktBuf.clear();
69
  fRawBuf.clear();
70
  fCrc.Clear();
71
  fFlags = 0;
72
 
73
  return;
74
}
75
 
76
//------------------------------------------+-----------------------------------
77
//! FIXME_docs
78
 
79
void RlinkPacketBufSnd::PutWithCrc(const uint16_t* pdata, size_t count)
80
{
81
  const uint16_t* pend = pdata + count;
82
  while (pdata < pend) PutWithCrc(*pdata++);
83
  return;
84
}
85
 
86
//------------------------------------------+-----------------------------------
87
//! FIXME_docs
88
 
89
bool RlinkPacketBufSnd::SndPacket(RlinkPort* port, RerrMsg& emsg)
90
{
91
  size_t nesc = 0;
92
 
93
  fRawBuf.reserve(2*fPktBuf.size()+4);      // max. size of raw data
94
  fRawBuf.clear();
95
 
96
  PutRawEsc(kEcSop);                        // <SOP>
97
 
98
  size_t   ni = fPktBuf.size();
99
  uint8_t* pi = fPktBuf.data();
100
  for (size_t i=0; i<ni; i++) {
101
    uint8_t c = *pi++;
102
    if (c == kSymEsc) {
103
      PutRawEsc(kEcEsc);
104
      nesc += 1;
105
    } else {
106
      fRawBuf.push_back(c);
107
    }
108
  }
109
 
110
  PutRawEsc(kEcEop);                        // <EOP>
111
  fStats.Inc(kStatNTxEsc   , double(nesc));
112
 
113 28 wfjm
  bool sndok = SndRaw(port, emsg);
114
  if (sndok) fStats.Inc(kStatNTxPktByt, double(PktSize()));
115
  return sndok;
116 27 wfjm
}
117
 
118
//------------------------------------------+-----------------------------------
119
//! FIXME_docs
120
 
121
bool RlinkPacketBufSnd::SndOob(RlinkPort* port, uint16_t addr, uint16_t data,
122
                               RerrMsg& emsg)
123
{
124
  Init();
125
 
126
  fRawBuf.clear();
127
  fRawBuf.push_back(kSymEsc);                       // ESC
128
  fRawBuf.push_back(kSymEsc);                       // ESC
129
  fRawBuf.push_back(uint8_t( addr      & 0x000f));  // ADDR ( 3: 0)
130
  fRawBuf.push_back(uint8_t((addr>>4)  & 0x000f));  // ADDR ( 7: 4)
131
  fRawBuf.push_back(uint8_t( data      & 0x000f));  // DATA ( 3: 0)
132
  fRawBuf.push_back(uint8_t((data>>4)  & 0x000f));  // DATA ( 7: 4)
133
  fRawBuf.push_back(uint8_t((data>>8)  & 0x000f));  // DATA (11: 8)
134
  fRawBuf.push_back(uint8_t((data>>12) & 0x000f));  // DATA (15:12)
135
 
136
  return SndRaw(port, emsg);
137
}
138
 
139
//------------------------------------------+-----------------------------------
140
//! FIXME_docs
141
 
142
bool RlinkPacketBufSnd::SndKeep(RlinkPort* port, RerrMsg& emsg)
143
{
144
  Init();
145
 
146
  fRawBuf.clear();
147
  fRawBuf.push_back(kSymEsc);               // ESC
148
  fRawBuf.push_back(kSymEsc);               // ESC
149
 
150
  return SndRaw(port, emsg);
151
}
152
 
153
//------------------------------------------+-----------------------------------
154
//! FIXME_docs
155
 
156
bool RlinkPacketBufSnd::SndAttn(RlinkPort* port, RerrMsg& emsg)
157
{
158
  Init();
159
 
160
  fRawBuf.clear();
161
  PutRawEsc(kEcAttn);                       // <ATTN>
162
  return SndRaw(port, emsg);
163
}
164
 
165
//------------------------------------------+-----------------------------------
166
//! FIXME_docs
167
 
168
bool RlinkPacketBufSnd::SndNak(RlinkPort* port, RerrMsg& emsg)
169
{
170
  Init();
171
 
172
  fRawBuf.clear();
173
  PutRawEsc(kEcNak);                        // <NAK>
174
  return SndRaw(port, emsg);
175
}
176
 
177
//------------------------------------------+-----------------------------------
178
//! FIXME_docs
179
 
180
bool RlinkPacketBufSnd::SndUnJam(RlinkPort* port, RerrMsg& emsg)
181
{
182
  Init();
183
 
184
  fRawBuf.clear();
185
  PutRawEsc(kEcEop);                        // <EOP>
186
  return SndRaw(port, emsg);
187
}
188
 
189
//------------------------------------------+-----------------------------------
190
//! FIXME_docs
191
 
192
void RlinkPacketBufSnd::Dump(std::ostream& os, int ind, const char* text) const
193
{
194
  RosFill bl(ind);
195
  os << bl << (text?text:"--") << "RlinkPacketBufSnd @ " << this << endl;
196
 
197
  size_t rawbufsize = fRawBuf.size();
198
  os << bl << "  fRawBuf(size): " << RosPrintf(rawbufsize,"d",4);
199
  size_t ncol  = max(1, (80-ind-4-6)/(2+1));
200
  for (size_t i=0; i<rawbufsize; i++) {
201
    if (i%ncol == 0) os << "\n" << bl << "    " << RosPrintf(i,"d",4) << ": ";
202
    os << RosPrintBvi(fRawBuf[i],16) << " ";
203
  }
204
  os << endl;
205
 
206
  RlinkPacketBuf::Dump(os, ind, " ^");
207
 
208
  return;
209
}
210
 
211
//------------------------------------------+-----------------------------------
212
//! FIXME_docs
213
 
214
bool RlinkPacketBufSnd::SndRaw(RlinkPort* port, RerrMsg& emsg)
215
{
216
  if (port==0 || !port->IsOpen())
217
    throw Rexception("RlinkPacketBufSnd::SndRaw()", "Bad state: port not open");
218
 
219
  size_t rawbufsize = fRawBuf.size();
220
  int irc = port->Write(fRawBuf.data(), rawbufsize, emsg);
221
  if (irc < 0) return false;
222
  if ((size_t)irc != rawbufsize) {
223
    emsg.Init("RlinkPacketBufSnd::SndRaw()", "failed to write all data");
224
    return false;
225
  }
226
 
227
  return true;
228
}
229
 
230
} // end namespace Retro

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.