1
0
mirror of https://github.com/wfjm/w11.git synced 2026-02-05 00:05:26 +00:00

- interim release w11a_V0.57 (untagged)

- new C++ and Tcl based backend server supports now RK11 handling
- w11a systems operate with rlink over USB on nexsy2 and nexsy3 boards.
  See w11a_os_guide.txt for details
This commit is contained in:
Walter F.J. Mueller
2013-04-27 14:21:46 +00:00
parent 99de9893cb
commit b06cbef00a
105 changed files with 5202 additions and 593 deletions

View File

@@ -1,4 +1,4 @@
// $Id: ReventLoop.cpp 495 2013-03-06 17:13:48Z mueller $
// $Id: ReventLoop.cpp 511 2013-04-27 13:51:46Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -13,6 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2013-04-27 511 1.1.3 BUGFIX: logic in DoCall() fixed (loop range)
// 2013-03-05 495 1.1.2 add exception catcher to EventLoop
// 2013-03-01 493 1.1.1 DoCall(): remove handler on negative return
// 2013-02-22 491 1.1 use new RlogFile/RlogMsg interfaces
@@ -21,7 +22,7 @@
/*!
\file
\version $Id: ReventLoop.cpp 495 2013-03-06 17:13:48Z mueller $
\version $Id: ReventLoop.cpp 511 2013-04-27 13:51:46Z mueller $
\brief Implemenation of class ReventLoop.
*/
@@ -228,7 +229,7 @@ int ReventLoop::DoPoll(int timeout)
if (fspLog && fTraceLevel >= 1) {
RlogMsg lmsg(*fspLog, 'I');
lmsg << "eloop: redo pollfd list, size=" << fPollFd.size() << endl;
lmsg << "eloop: redo pollfd list, size=" << fPollDsc.size() << endl;
}
}
@@ -258,8 +259,8 @@ int ReventLoop::DoPoll(int timeout)
void ReventLoop::DoCall(void)
{
for (size_t i=0; i<fPollDsc.size(); i++) {
if (fPollFd[i].revents) {
for (size_t i=0; i<fPollFd.size(); i++) {
if (fPollFd[i].revents) {
int irc = fPollHdl[i](fPollFd[i]);
// remove handler negative return (nothrow=true to prevent remove race)
if (irc < 0) {

View File

@@ -1,4 +1,4 @@
// $Id: RlinkConnect.cpp 495 2013-03-06 17:13:48Z mueller $
// $Id: RlinkConnect.cpp 509 2013-04-21 20:46:20Z mueller $
//
// Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -13,6 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2013-04-21 509 1.3.2 add SndAttn() method
// 2013-03-01 493 1.3.1 add Server(Active..|SignalAttn)() methods
// 2013-02-23 492 1.3 use scoped_ptr for Port; Close allways allowed
// use RlinkContext, add Context(), Exec(..., cntx)
@@ -27,7 +28,7 @@
/*!
\file
\version $Id: RlinkConnect.cpp 495 2013-03-06 17:13:48Z mueller $
\version $Id: RlinkConnect.cpp 509 2013-04-21 20:46:20Z mueller $
\brief Implemenation of RlinkConnect.
*/
@@ -574,6 +575,7 @@ int RlinkConnect::PollAttn(RerrMsg& emsg)
bool RlinkConnect::SndOob(uint16_t addr, uint16_t data, RerrMsg& emsg)
{
boost::lock_guard<RlinkConnect> lock(*this);
fStats.Inc(kStatNSndOob);
return fTxPkt.SndOob(fpPort.get(), addr, data, emsg);
}
@@ -581,6 +583,15 @@ bool RlinkConnect::SndOob(uint16_t addr, uint16_t data, RerrMsg& emsg)
//------------------------------------------+-----------------------------------
//! FIXME_docs
bool RlinkConnect::SndAttn(RerrMsg& emsg)
{
boost::lock_guard<RlinkConnect> lock(*this);
return fTxPkt.SndAttn(fpPort.get(), emsg);
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
void RlinkConnect::SetLogOpts(const LogOpts& opts)
{
if (opts.baseaddr!=2 && opts.baseaddr!=8 && opts.baseaddr!=16)

View File

@@ -1,4 +1,4 @@
// $Id: RlinkConnect.hpp 495 2013-03-06 17:13:48Z mueller $
// $Id: RlinkConnect.hpp 509 2013-04-21 20:46:20Z mueller $
//
// Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -13,6 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2013-04-21 509 1.3.3 add SndAttn() method
// 2013-03-05 495 1.3.2 add Exec() without emsg (will send emsg to LogFile)
// 2013-03-01 493 1.3.1 add Server(Active..|SignalAttn)() methods
// 2013-02-23 492 1.3 use scoped_ptr for Port; Close allways allowed
@@ -30,7 +31,7 @@
/*!
\file
\version $Id: RlinkConnect.hpp 495 2013-03-06 17:13:48Z mueller $
\version $Id: RlinkConnect.hpp 509 2013-04-21 20:46:20Z mueller $
\brief Declaration of class \c RlinkConnect.
*/
@@ -108,6 +109,7 @@ namespace Retro {
double WaitAttn(double timeout, RerrMsg& emsg);
int PollAttn(RerrMsg& emsg);
bool SndOob(uint16_t addr, uint16_t data, RerrMsg& emsg);
bool SndAttn(RerrMsg& emsg);
bool AddrMapInsert(const std::string& name, uint16_t addr);
bool AddrMapErase(const std::string& name);

View File

@@ -1,4 +1,4 @@
// $Id: RlinkPacketBuf.cpp 492 2013-02-24 22:14:47Z mueller $
// $Id: RlinkPacketBuf.cpp 509 2013-04-21 20:46:20Z mueller $
//
// Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -13,6 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2013-04-21 509 1.0.4 add SndAttn() method
// 2013-02-03 481 1.0.3 use Rexception
// 2013-01-13 474 1.0.2 add PollAttn() method
// 2013-01-04 469 1.0.1 SndOob(): Add filler 0 to ensure escape state
@@ -22,7 +23,7 @@
/*!
\file
\version $Id: RlinkPacketBuf.cpp 492 2013-02-24 22:14:47Z mueller $
\version $Id: RlinkPacketBuf.cpp 509 2013-04-21 20:46:20Z mueller $
\brief Implemenation of class RlinkPacketBuf.
*/
@@ -326,8 +327,21 @@ bool RlinkPacketBuf::SndKeep(RlinkPort* port, RerrMsg& emsg)
Init();
fRawBuf.clear();
fRawBuf.push_back(kSymEsc); // ESC
fRawBuf.push_back(kSymEsc); // ESC
fRawBuf.push_back(kSymEsc); // ESC
fRawBuf.push_back(kSymEsc); // ESC
return SndRaw(port, emsg);
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
bool RlinkPacketBuf::SndAttn(RlinkPort* port, RerrMsg& emsg)
{
Init();
fRawBuf.clear();
fRawBuf.push_back(kCommaAttn); // Attn
return SndRaw(port, emsg);
}

View File

@@ -1,4 +1,4 @@
// $Id: RlinkPacketBuf.hpp 486 2013-02-10 22:34:43Z mueller $
// $Id: RlinkPacketBuf.hpp 509 2013-04-21 20:46:20Z mueller $
//
// Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -13,6 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2013-04-21 509 1.0.2 add SndAttn() method
// 2013-01-13 474 1.0.1 add PollAttn() method
// 2011-04-02 375 1.0 Initial version
// 2011-03-05 366 0.1 First draft
@@ -21,7 +22,7 @@
/*!
\file
\version $Id: RlinkPacketBuf.hpp 486 2013-02-10 22:34:43Z mueller $
\version $Id: RlinkPacketBuf.hpp 509 2013-04-21 20:46:20Z mueller $
\brief Declaration of class RlinkPacketBuf.
*/
@@ -57,6 +58,7 @@ namespace Retro {
bool SndOob(RlinkPort* port, uint16_t addr, uint16_t data,
RerrMsg& emsg);
bool SndKeep(RlinkPort* port, RerrMsg& emsg);
bool SndAttn(RlinkPort* port, RerrMsg& emsg);
bool CheckSize(size_t nbyte) const;
uint8_t Get8WithCrc();

View File

@@ -1,4 +1,4 @@
// $Id: RlinkServer.cpp 495 2013-03-06 17:13:48Z mueller $
// $Id: RlinkServer.cpp 509 2013-04-21 20:46:20Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -13,13 +13,14 @@
//
// Revision History:
// Date Rev Version Comment
// 2013-04-21 509 1.0.1 add Resume(), reorganize server start handling
// 2013-03-06 495 1.0 Initial version
// 2013-01-12 474 0.5 First draft
// ---------------------------------------------------------------------------
/*!
\file
\version $Id: RlinkServer.cpp 495 2013-03-06 17:13:48Z mueller $
\version $Id: RlinkServer.cpp 509 2013-04-21 20:46:20Z mueller $
\brief Implemenation of RlinkServer.
*/
@@ -219,27 +220,7 @@ void RlinkServer::RemovePollHandler(int fd)
void RlinkServer::Start()
{
if (IsActive())
throw Rexception("RlinkServer::Start()",
"Bad state: server thread already running");
if (!fspConn->IsOpen())
throw Rexception("RlinkServer::Start()",
"Bad state: RlinkConnect not open");
// enable attn comma send
RlinkCommandList clist;
clist.AddInit(RlinkCommand::kRbaddr_IInt, RlinkCommand::kIInt_M_AnEna);
Exec(clist);
// setup poll handler for Rlink traffic
int rlinkfd = fspConn->Port()->FdRead();
if (!fELoop.TestPollHandler(rlinkfd, POLLIN))
fELoop.AddPollHandler(boost::bind(&RlinkServer::RlinkHandler, this, _1),
rlinkfd, POLLIN);
// and start server thread
fServerThread = boost::thread(boost::bind(&RlinkServerEventLoop::EventLoop,
&fELoop));
StartOrResume(false);
return;
}
@@ -257,6 +238,15 @@ void RlinkServer::Stop()
//------------------------------------------+-----------------------------------
//! FIXME_docs
void RlinkServer::Resume()
{
StartOrResume(true);
return;
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
void RlinkServer::Wakeup()
{
uint64_t one(1);
@@ -348,6 +338,46 @@ void RlinkServer::Dump(std::ostream& os, int ind, const char* text) const
//------------------------------------------+-----------------------------------
//! FIXME_docs
void RlinkServer::StartOrResume(bool resume)
{
if (IsActive())
throw Rexception("RlinkServer::StartOrResume()",
"Bad state: server thread already running");
if (!fspConn->IsOpen())
throw Rexception("RlinkServer::StartOrResume()",
"Bad state: RlinkConnect not open");
boost::lock_guard<RlinkConnect> lock(Connect());
// enable attn comma send
RlinkCommandList clist;
if (!resume) clist.AddAttn();
clist.AddInit(RlinkCommand::kRbaddr_IInt, RlinkCommand::kIInt_M_AnEna);
Exec(clist);
// setup poll handler for Rlink traffic
int rlinkfd = fspConn->Port()->FdRead();
if (!fELoop.TestPollHandler(rlinkfd, POLLIN))
fELoop.AddPollHandler(boost::bind(&RlinkServer::RlinkHandler, this, _1),
rlinkfd, POLLIN);
// and start server thread
fServerThread = boost::thread(boost::bind(&RlinkServerEventLoop::EventLoop,
&fELoop));
if (resume) {
RerrMsg emsg;
if (!Connect().SndAttn(emsg)) {
RlogMsg lmsg(LogFile(), 'E');
lmsg << "attn send for server resume failed:" << emsg;
}
}
return;
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
void RlinkServer::CallAttnHandler()
{
if (fAttnSeen) {
@@ -402,8 +432,8 @@ void RlinkServer::CallActnHandler()
int irc = fActnList.front()();
// if irc>1 requeue to end, otherwise drop
if (irc > 1) {
// if irc>0 requeue to end, otherwise drop
if (irc > 0) {
fActnList.splice(fActnList.end(), fActnList, fActnList.begin());
} else {
fActnList.pop_front();

View File

@@ -1,4 +1,4 @@
// $Id: RlinkServer.hpp 502 2013-04-02 19:29:30Z mueller $
// $Id: RlinkServer.hpp 509 2013-04-21 20:46:20Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -13,13 +13,14 @@
//
// Revision History:
// Date Rev Version Comment
// 2013-04-21 509 1.0.1 add Resume(), reorganize server start handling
// 2013-03-06 495 1.0 Initial version
// 2013-01-12 474 0.5 First draft
// ---------------------------------------------------------------------------
/*!
\file
\version $Id: RlinkServer.hpp 502 2013-04-02 19:29:30Z mueller $
\version $Id: RlinkServer.hpp 509 2013-04-21 20:46:20Z mueller $
\brief Declaration of class \c RlinkServer.
*/
@@ -90,6 +91,7 @@ namespace Retro {
void Start();
void Stop();
void Resume();
void Wakeup();
void SignalAttn();
@@ -134,6 +136,7 @@ namespace Retro {
friend class RlinkServerEventLoop;
protected:
void StartOrResume(bool resume);
bool AttnPending() const;
bool ActnPending() const;
void CallAttnHandler();