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:
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user