diff --git a/.cvsignore b/.cvsignore index e69de29..a3ff9ba 100644 --- a/.cvsignore +++ b/.cvsignore @@ -0,0 +1 @@ +KNI_3.9.2.tar.gz diff --git a/import.log b/import.log new file mode 100644 index 0000000..cb9d72c --- /dev/null +++ b/import.log @@ -0,0 +1 @@ +libkni3-3_9_2-12_fc11:HEAD:libkni3-3.9.2-12.fc11.src.rpm:1252967051 diff --git a/kni-3.9.2-ctor.patch b/kni-3.9.2-ctor.patch new file mode 100644 index 0000000..8c35ffc --- /dev/null +++ b/kni-3.9.2-ctor.patch @@ -0,0 +1,437 @@ +diff -urN KNI_3.9.2/include/KNI/cdlCOM.h KNI_3.9.2.ctor/include/KNI/cdlCOM.h +--- KNI_3.9.2/include/KNI/cdlCOM.h 2007-04-12 14:52:06.000000000 +0200 ++++ KNI_3.9.2.ctor/include/KNI/cdlCOM.h 2009-06-12 16:44:42.000000000 +0200 +@@ -107,7 +107,7 @@ + * describes the desired serial port. An attempt to open a connection + * to the desired device will be tried. + */ +- CCdlCOM(TCdlCOMDesc ccd); ++ CCdlCOM(TCdlCOMDesc ccd, const char *dev_name = 0); + + /*! \brief Destructs the class + */ virtual ~CCdlCOM(); +diff -urN KNI_3.9.2/src/Base/cdlCOM.cpp KNI_3.9.2.ctor/src/Base/cdlCOM.cpp +--- KNI_3.9.2/src/Base/cdlCOM.cpp 2009-06-12 16:44:03.000000000 +0200 ++++ KNI_3.9.2.ctor/src/Base/cdlCOM.cpp 2009-06-12 16:45:02.000000000 +0200 +@@ -23,8 +23,9 @@ + + #include "common/Timer.h" + #include ++#include + +- ++#include + #ifdef WIN32 + + CCdlCOM::CCdlCOM(TCdlCOMDesc ccd) : _deviceName(""), _ccd(), _prtHdl(INVALID_HANDLE_VALUE), _oto() { +@@ -160,21 +161,24 @@ + + #else //LINUX + +-CCdlCOM::CCdlCOM(TCdlCOMDesc ccd) : _deviceName(""), _ccd(), _prtHdl(-1), _oto() { ++CCdlCOM::CCdlCOM(TCdlCOMDesc ccd, const char *dev_name) : _deviceName(""), _ccd(), _prtHdl(-1), _oto() { + + int prtHdl = -1; + +- std::string deviceName; + struct termios nto, oto; +- char name[11]; ++ char *name; + + errno = 0; + +- strncpy(name, "/dev/ttyS ", 11); +- name[9] = digit(ccd.port); ++ if (dev_name) { ++ name = strdup(dev_name); ++ } else { ++ asprintf(&name, "/dev/ttyS%i", ccd.port); ++ } + prtHdl = ::open(name, O_RDWR | O_NOCTTY | O_NDELAY| O_NONBLOCK); + + _deviceName = name; ++ free(name); + + if (prtHdl < 0) { + throw CannotOpenPortException(_deviceName, strerror(errno)); +@@ -290,7 +294,6 @@ + } + + _prtHdl = prtHdl; +- _deviceName = deviceName; + _ccd = ccd; + _oto = oto; + } +diff -urN KNI_3.9.2/src/Base/cdlCOM.cpp.orig KNI_3.9.2.ctor/src/Base/cdlCOM.cpp.orig +--- KNI_3.9.2/src/Base/cdlCOM.cpp.orig 1970-01-01 01:00:00.000000000 +0100 ++++ KNI_3.9.2.ctor/src/Base/cdlCOM.cpp.orig 2009-06-12 16:44:42.000000000 +0200 +@@ -0,0 +1,369 @@ ++/* ++ * Katana Native Interface - A C++ interface to the robot arm Katana. ++ * Copyright (C) 2005 Neuronics AG ++ * Check out the AUTHORS file for detailed contact information. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++ ++#include "KNI/cdlCOM.h" ++ ++#include "common/Timer.h" ++#include ++ ++ ++#ifdef WIN32 ++ ++CCdlCOM::CCdlCOM(TCdlCOMDesc ccd) : _deviceName(""), _ccd(), _prtHdl(INVALID_HANDLE_VALUE), _oto() { ++ ++ DCB commDCB; //COM port parameters ++ COMMTIMEOUTS nto; //new timeouts ++ char comX[5]; ++ char dcb[35]; ++ int i, d; ++ ++ std::string deviceName; ++ HANDLE prtHdl; ++ COMMTIMEOUTS oto; ++ ++ strncpy_s(comX, "COM ", 5); ++ comX[3] = digit(ccd.port); ++ deviceName = comX; ++ prtHdl = CreateFile(comX, ++ GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, ++ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING, 0 ++ ); ++ ++ if (prtHdl == INVALID_HANDLE_VALUE) { ++ throw CannotOpenPortException(_deviceName, "info from win32-system not yet available"); ++ } ++ ++ FillMemory(&commDCB, sizeof(commDCB), 0); ++ commDCB.DCBlength = sizeof(commDCB); ++ strncpy_s(dcb, "baud= parity= data= stop= ", 35); ++ for(i=5,d=100000; d>=1; d=d/10) { ++ if(d <= ccd.baud) { ++ dcb[i++] = digit((ccd.baud/d) % 10); ++ } ++ } ++ dcb[19] = ccd.parity; ++ dcb[26] = digit(ccd.data); ++ dcb[33] = digit(ccd.stop); ++ if (!BuildCommDCB(dcb, &commDCB)) { ++ CloseHandle(prtHdl); ++ throw CannotGetSetPortAttributesException(_deviceName); ++ } ++ ++ commDCB.fAbortOnError = false; ++ commDCB.fInX = false; ++ commDCB.fOutX = false; ++ commDCB.fOutxCtsFlow = false; ++ if (!SetCommState(prtHdl, &commDCB)) { ++ CloseHandle(prtHdl); ++ throw CannotGetSetPortAttributesException(_deviceName); ++ } ++ ++ PurgeComm( prtHdl, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); ++ ++ GetCommTimeouts(prtHdl, &oto); ++ nto.ReadIntervalTimeout = MAXDWORD; ++ nto.ReadTotalTimeoutMultiplier = 0; ++ nto.ReadTotalTimeoutConstant = 0; ++ nto.WriteTotalTimeoutMultiplier = 0; ++ nto.WriteTotalTimeoutConstant = 0; ++ if (!SetCommTimeouts(prtHdl, &nto)) { ++ CloseHandle(prtHdl); ++ throw CannotGetSetPortAttributesException(_deviceName); ++ } ++ ++ // Everything done, now we can change the state ++ _prtHdl = prtHdl; ++ _deviceName = deviceName; ++ _ccd = ccd; ++ _oto = oto; ++} ++ ++CCdlCOM::~CCdlCOM() { ++ if(_prtHdl == INVALID_HANDLE_VALUE) ++ return; ++ ++ FlushFileBuffers(_prtHdl); ++ SetCommTimeouts(_prtHdl, &_oto); ++ ++ CloseHandle(_prtHdl); ++ ++} ++ ++int CCdlCOM::send(const void* buf, int size) { ++ ++ if (_prtHdl == INVALID_HANDLE_VALUE) { ++ throw PortNotOpenException(_deviceName); ++ } ++ ++ if(PurgeComm(_prtHdl, PURGE_TXABORT | PURGE_TXCLEAR) == 0) { ++ throw DeviceWriteException(_deviceName, "PurgeComm failed"); ++ } ++ ++ unsigned long readsz; ++ if (WriteFile(_prtHdl, buf, size, &readsz, 0) == 0) { ++ throw DeviceWriteException(_deviceName, "WriteFile failed"); ++ } ++ ++ if(readsz != static_cast(size)) { ++ throw WriteNotCompleteException(_deviceName); ++ } ++ ++ return (int)readsz; ++} ++ ++int CCdlCOM::recv(void* buf, int size) { ++ ++ if (_prtHdl == INVALID_HANDLE_VALUE) { ++ throw PortNotOpenException(_deviceName); ++ } ++ ++ unsigned char* tmp = static_cast(buf); ++ unsigned long readsz = 0, readsz_temp = 0; ++ KNI::Timer timeout(_ccd.rttc); ++ timeout.Start(); ++ while (readsz<(unsigned long)size && !timeout.Elapsed()) { ++ if(ReadFile(_prtHdl, &tmp[readsz], size, &readsz_temp, 0) == 0) { ++ DeviceReadException( _deviceName, "ReadFile failed" ); ++ } else { ++ readsz += readsz_temp; ++ } ++ } ++ ++ if((unsigned)size != readsz) { ++ throw ReadNotCompleteException(_deviceName); ++ } ++ ++ if(PurgeComm(_prtHdl, PURGE_RXABORT | PURGE_RXCLEAR) == 0) { ++ throw DeviceReadException(_deviceName, "PurgeComm failed"); ++ } ++ return (int)readsz; ++} ++ ++ ++#else //LINUX ++ ++CCdlCOM::CCdlCOM(TCdlCOMDesc ccd) : _deviceName(""), _ccd(), _prtHdl(-1), _oto() { ++ ++ int prtHdl = -1; ++ ++ std::string deviceName; ++ struct termios nto, oto; ++ char name[11]; ++ ++ errno = 0; ++ ++ strncpy(name, "/dev/ttyS ", 11); ++ name[9] = digit(ccd.port); ++ prtHdl = ::open(name, O_RDWR | O_NOCTTY | O_NDELAY| O_NONBLOCK); ++ ++ _deviceName = name; ++ ++ if (prtHdl < 0) { ++ throw CannotOpenPortException(_deviceName, strerror(errno)); ++ } ++ ++ tcgetattr(prtHdl, &oto); ++ bzero(&nto, sizeof(nto)); ++ nto.c_cc[VTIME] = 0; ++ nto.c_cc[VMIN] = 0; ++ nto.c_oflag = 0; ++ nto.c_lflag = 0; ++ nto.c_cflag = CLOCAL | CREAD; ++ nto.c_iflag = 0; ++ ++ switch (ccd.baud) { ++ case 50: ++ nto.c_cflag |= B50; ++ break; ++ case 75: ++ nto.c_cflag |= B75; ++ break; ++ case 110: ++ nto.c_cflag |= B110; ++ break; ++ case 134: ++ nto.c_cflag |= B134; ++ break; ++ case 150: ++ nto.c_cflag |= B150; ++ break; ++ case 200: ++ nto.c_cflag |= B200; ++ break; ++ case 300: ++ nto.c_cflag |= B300; ++ break; ++ case 600: ++ nto.c_cflag |= B600; ++ break; ++ case 1200: ++ nto.c_cflag |= B1200; ++ break; ++ case 1800: ++ nto.c_cflag |= B1800; ++ break; ++ case 2400: ++ nto.c_cflag |= B2400; ++ break; ++ case 4800: ++ nto.c_cflag |= B4800; ++ break; ++ case 9600: ++ nto.c_cflag |= B9600; ++ break; ++ case 19200: ++ nto.c_cflag |= B19200; ++ break; ++ case 38400: ++ nto.c_cflag |= B38400; ++ break; ++ case 57600: ++ nto.c_cflag |= B57600; ++ break; ++ case 115200: ++ nto.c_cflag |= B115200; ++ break; ++ case 230400: ++ nto.c_cflag |= B230400; ++ break; ++ } ++ ++ switch (ccd.data) { ++ case 5: ++ nto.c_cflag |= CS5; ++ break; ++ case 6: ++ nto.c_cflag |= CS6; ++ break; ++ case 7: ++ nto.c_cflag |= CS7; ++ break; ++ case 8: ++ nto.c_cflag |= CS8; ++ break; ++ } ++ ++ switch (ccd.parity) { ++ case 'N': ++ case 'n': ++ break; ++ case 'O': ++ case 'o': ++ nto.c_cflag |= PARENB | PARODD; ++ break; ++ case 'E': ++ case 'e': ++ nto.c_cflag |= PARENB; ++ break; ++ } ++ ++ switch (ccd.stop) { ++ case 1: ++ break; ++ case 2: ++ nto.c_cflag |= CSTOPB; ++ break; ++ } ++ ++ tcflush(prtHdl,TCIFLUSH); ++ if (tcsetattr(prtHdl, TCSANOW, &nto) != 0) { ++ ::close(prtHdl); ++ throw CannotGetSetPortAttributesException(_deviceName); ++ } ++ ++ _prtHdl = prtHdl; ++ _deviceName = deviceName; ++ _ccd = ccd; ++ _oto = oto; ++} ++ ++CCdlCOM::~CCdlCOM() { ++ ++ if (_prtHdl < 0) { ++ return; ++ } ++ ++ tcflush(_prtHdl, TCIFLUSH); ++ tcsetattr(_prtHdl, TCSANOW, &_oto); ++ ++ ::close(_prtHdl); // there's nothing we can do about failing ++ ++} ++ ++int CCdlCOM::send(const void* buf, int size) { ++ ++ if (_prtHdl < 0) ++ throw PortNotOpenException(_deviceName); ++ ++ errno = 0; ++ ++ int tcflush_return = tcflush(_prtHdl,TCIFLUSH); ++ if(tcflush_return < 0) ++ throw DeviceWriteException( _deviceName, strerror(errno) ); ++ ++ int writesz = write(_prtHdl, buf, size); ++ ++ if(writesz < 0) ++ throw DeviceWriteException( _deviceName, strerror(errno) ); ++ ++ if(writesz != size) ++ throw WriteNotCompleteException(_deviceName); ++ ++ return writesz; ++} ++ ++int CCdlCOM::recv(void* buf, int size) { ++ unsigned char* tmp = static_cast(buf); ++ register int readsz = 0; ++ ++ if (_prtHdl < 0) ++ throw PortNotOpenException(_deviceName); ++ ++ errno = 0; ++ ++ int read_return; ++ KNI::Timer timeout(_ccd.rttc); ++ timeout.Start(); ++ while (readsz + #include + #include ++#include + + + #ifdef WIN32 +diff -urN KNI_3.9.2/demo/perfo/main.cpp KNI_3.9.2.gcc43/demo/perfo/main.cpp +--- KNI_3.9.2/demo/perfo/main.cpp 2007-04-12 14:52:06.000000000 +0200 ++++ KNI_3.9.2.gcc43/demo/perfo/main.cpp 2009-06-12 16:48:21.000000000 +0200 +@@ -19,6 +19,7 @@ + #include "KNI/kmlBase.h" //for robot: CKatBase, CMotBase, CSctBase + #include "KNI/kmlExt.h" // extended katana features + #include //for messages: printf() ++#include + + /**********************************************************************************/ + #include "perfo.h" //for performance checking.. +diff -urN KNI_3.9.2/demo/perfo/perfo.cpp KNI_3.9.2.gcc43/demo/perfo/perfo.cpp +--- KNI_3.9.2/demo/perfo/perfo.cpp 2007-04-26 08:18:24.000000000 +0200 ++++ KNI_3.9.2.gcc43/demo/perfo/perfo.cpp 2009-06-12 16:48:29.000000000 +0200 +@@ -2,6 +2,7 @@ + #include "perfo.h" + #include + #include ++#include + + #include "KNI/cdlCOMExceptions.h" + #include "KNI/cplSerial.h" +@@ -13,7 +14,7 @@ + #define CLOCK() (clock_t)((double)(1000.0f * clock()) / CLOCKS_PER_SEC) + //-------------------------------------------------------------------------------// + +-void statKatRecv(char strTitle[], long i, long j, clock_t t, long l) { ++void statKatRecv(const char strTitle[], long i, long j, clock_t t, long l) { + printf("-------------------------------------------\n"); + printf(strTitle); printf("\tAverage: %.3f [ms]\n", (double)t/(double)l); + printf("-------------------------------------------\n"); +@@ -102,7 +103,7 @@ + //-------------------------------------------------------------------------------// + //-------------------------------------------------------------------------------// + +-void statMotRecv(char strTitle[], short idx, long i, long j, clock_t t, long l) { ++void statMotRecv(const char strTitle[], short idx, long i, long j, clock_t t, long l) { + printf("-------------------------------------------\n"); + printf(strTitle, idx); printf("\tAverage: %.3f [ms]\n", (double)t/(double)l); + printf("-------------------------------------------\n"); +@@ -111,7 +112,7 @@ + printf("-------------------------------------------\n\n"); + } + +-void statMotSend(char strTitle[], short idx, long i, long j, long k, long s, clock_t t, long l) { ++void statMotSend(const char strTitle[], short idx, long i, long j, long k, long s, clock_t t, long l) { + printf("-------------------------------------------\n"); + printf(strTitle, idx); printf("\tAverage: %.3f [ms]\n", (double)t/(double)l); + printf("-------------------------------------------\n"); +@@ -278,7 +279,7 @@ + //-------------------------------------------------------------------------------// + //-------------------------------------------------------------------------------// + +-void statSct(char strTitle[], short idx, long i, long j, long k, long s, clock_t t, long l) { ++void statSct(const char strTitle[], short idx, long i, long j, long k, long s, clock_t t, long l) { + printf("-------------------------------------------\n"); + printf(strTitle, idx); printf("\tAverage: %.3f [ms]\n", (double)t/(double)l); + printf("-------------------------------------------\n"); +diff -urN KNI_3.9.2/demo/positions/main.cpp KNI_3.9.2.gcc43/demo/positions/main.cpp +--- KNI_3.9.2/demo/positions/main.cpp 2007-04-26 08:18:24.000000000 +0200 ++++ KNI_3.9.2.gcc43/demo/positions/main.cpp 2009-06-12 16:48:02.000000000 +0200 +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + + + #ifdef WIN32 +diff -urN KNI_3.9.2/demo/sensor/main.cpp KNI_3.9.2.gcc43/demo/sensor/main.cpp +--- KNI_3.9.2/demo/sensor/main.cpp 2007-04-26 08:18:24.000000000 +0200 ++++ KNI_3.9.2.gcc43/demo/sensor/main.cpp 2009-06-12 16:48:02.000000000 +0200 +@@ -6,6 +6,7 @@ + #include //ONLY WIN32 COMPATIBLE!! + #endif + #include ++#include + + //------------------------------------------------------------------------// + +diff -urN KNI_3.9.2/demo/socketcommands/socketcommands.cpp KNI_3.9.2.gcc43/demo/socketcommands/socketcommands.cpp +--- KNI_3.9.2/demo/socketcommands/socketcommands.cpp 2007-04-12 14:52:06.000000000 +0200 ++++ KNI_3.9.2.gcc43/demo/socketcommands/socketcommands.cpp 2009-06-12 16:48:02.000000000 +0200 +@@ -6,6 +6,7 @@ + #include + #include + #include ++#include + + + #ifdef WIN32 +diff -urN KNI_3.9.2/demo/socketcontrol/socketcontrol.cpp KNI_3.9.2.gcc43/demo/socketcontrol/socketcontrol.cpp +--- KNI_3.9.2/demo/socketcontrol/socketcontrol.cpp 2007-09-03 16:04:48.000000000 +0200 ++++ KNI_3.9.2.gcc43/demo/socketcontrol/socketcontrol.cpp 2009-06-12 16:48:02.000000000 +0200 +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + + + #ifdef WIN32 +diff -urN KNI_3.9.2/include/KNI/kmlMotBase.h KNI_3.9.2.gcc43/include/KNI/kmlMotBase.h +--- KNI_3.9.2/include/KNI/kmlMotBase.h 2007-09-19 15:16:44.000000000 +0200 ++++ KNI_3.9.2.gcc43/include/KNI/kmlMotBase.h 2009-06-12 16:48:02.000000000 +0200 +@@ -45,7 +45,7 @@ + + /*! \brief command flags + */ +-typedef enum TMotCmdFlg { ++enum TMotCmdFlg { + MCF_OFF = 0, //!< set the motor off + MCF_CALIB = 4, //!< calibrate + MCF_FREEZE = 8, //!< freeze the motor +@@ -54,7 +54,7 @@ + + /*! \brief status flags + */ +-typedef enum TMotStsFlg { ++enum TMotStsFlg { + MSF_MECHSTOP = 1, //!< mechanical stopper reached + MSF_MAXPOS = 2, //!< max. position was reached + MSF_MINPOS = 4, //!< min. position was reached +diff -urN KNI_3.9.2/src/Base/cdlCOM.cpp KNI_3.9.2.gcc43/src/Base/cdlCOM.cpp +--- KNI_3.9.2/src/Base/cdlCOM.cpp 2007-04-12 14:52:06.000000000 +0200 ++++ KNI_3.9.2.gcc43/src/Base/cdlCOM.cpp 2009-06-12 16:48:02.000000000 +0200 +@@ -22,6 +22,7 @@ + #include "KNI/cdlCOM.h" + + #include "common/Timer.h" ++#include + + + #ifdef WIN32 +diff -urN KNI_3.9.2/src/Base/cdlSocket.cpp KNI_3.9.2.gcc43/src/Base/cdlSocket.cpp +--- KNI_3.9.2/src/Base/cdlSocket.cpp 2007-11-06 14:45:08.000000000 +0100 ++++ KNI_3.9.2.gcc43/src/Base/cdlSocket.cpp 2009-06-12 16:48:02.000000000 +0200 +@@ -21,6 +21,9 @@ + /****************************************************************************/ + #include "KNI/cdlSocket.h" + #include ++#include ++#include ++ + /****************************************************************************/ + //test write: + int writesz; +diff -urN KNI_3.9.2/src/Base/cplSerial.cpp KNI_3.9.2.gcc43/src/Base/cplSerial.cpp +--- KNI_3.9.2/src/Base/cplSerial.cpp 2007-11-13 10:38:44.000000000 +0100 ++++ KNI_3.9.2.gcc43/src/Base/cplSerial.cpp 2009-06-12 16:48:02.000000000 +0200 +@@ -22,6 +22,7 @@ + #include "KNI/CRC.h" + #include + #include ++#include + + + /* +diff -urN KNI_3.9.2/src/Base/kmlBase.cpp KNI_3.9.2.gcc43/src/Base/kmlBase.cpp +--- KNI_3.9.2/src/Base/kmlBase.cpp 2007-11-07 09:22:52.000000000 +0100 ++++ KNI_3.9.2.gcc43/src/Base/kmlBase.cpp 2009-06-12 16:48:02.000000000 +0200 +@@ -21,6 +21,7 @@ + #include "KNI/kmlBase.h" + + #include ++#include + + bool CKatBase::init( + const TKatGNL _gnl, +diff -urN KNI_3.9.2/src/Base/kmlFactories.cpp KNI_3.9.2.gcc43/src/Base/kmlFactories.cpp +--- KNI_3.9.2/src/Base/kmlFactories.cpp 2007-07-16 14:17:40.000000000 +0200 ++++ KNI_3.9.2.gcc43/src/Base/kmlFactories.cpp 2009-06-12 16:48:02.000000000 +0200 +@@ -1,5 +1,7 @@ + + #include "KNI/kmlFactories.h" ++#include ++#include + + namespace KNI { + +diff -urN KNI_3.9.2/src/Base/kmlMotBase.cpp KNI_3.9.2.gcc43/src/Base/kmlMotBase.cpp +--- KNI_3.9.2/src/Base/kmlMotBase.cpp 2007-09-19 15:16:44.000000000 +0200 ++++ KNI_3.9.2.gcc43/src/Base/kmlMotBase.cpp 2009-06-12 16:48:02.000000000 +0200 +@@ -15,6 +15,8 @@ + #include "common/MathHelperFunctions.h" + #include "common/Timer.h" + #include ++#include ++#include + + + bool CMotBase::init(CKatBase* _own, const TMotDesc _motDesc, CCplBase* _protocol) { diff --git a/kni-3.9.2-noexit.patch b/kni-3.9.2-noexit.patch new file mode 100644 index 0000000..7b78e57 --- /dev/null +++ b/kni-3.9.2-noexit.patch @@ -0,0 +1,57 @@ +diff -urN KNI_3.9.2.patched/src/Base/cdlSocket.cpp KNI_3.9.2.noexit/src/Base/cdlSocket.cpp +--- KNI_3.9.2.patched/src/Base/cdlSocket.cpp 2008-12-01 13:12:13.000000000 +0100 ++++ KNI_3.9.2.noexit/src/Base/cdlSocket.cpp 2008-12-01 13:16:07.000000000 +0100 +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + + /****************************************************************************/ + //test write: +@@ -95,7 +96,7 @@ + _socketfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + if(_socketfd == -1){ + std::cout << "socket could not be created"<<_ipAddr<<" port: "<< _port<<" \n"; +- exit(1); ++ throw std::runtime_error("socket could not be created"); + } + memset(&_socketAddr, 0, sizeof(_socketAddr)); + _socketAddr.sin_family = AF_INET; +@@ -106,13 +107,13 @@ + res = inet_pton ( AF_INET, _ipAddr, &_socketAddr.sin_addr ); + if ( errno == EAFNOSUPPORT ){ + std::cout << "inet_pton failed, try again "<<_ipAddr<<" port: "<< _port<<" \n"; +- exit(1); ++ throw std::runtime_error("inet_pton failed (EAFNOSUPPORT)"); + } + // std::cout << "trying to connect to server...\n"; + res = connect(_socketfd, (struct sockaddr *) &_socketAddr, _len); + if(res != 0){ + std::cout << "client could not connect, check if server is running on ip "<<_ipAddr<<" port: "<< _port<<" \n"; +- exit(1); ++ throw std::runtime_error("client could not connect, check if server is running"); + } + else{ + // std::cout << "client connected to ip "<<_ipAddr<<", port: "<< _port<<" \n"; +diff -urN KNI_3.9.2.patched/src/Base/kmlExt.cpp KNI_3.9.2.noexit/src/Base/kmlExt.cpp +--- KNI_3.9.2.patched/src/Base/kmlExt.cpp 2007-09-28 07:38:10.000000000 +0200 ++++ KNI_3.9.2.noexit/src/Base/kmlExt.cpp 2008-12-01 13:16:58.000000000 +0100 +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + + #define max(a,b) (((a)>(b))?(a):(b)) + KNI::Timer kni_timer; +@@ -145,7 +146,8 @@ + std::cout << "Exit: Incompatible Config File!\n"; + std::cout << "Check whether you have a Katana 400 or 300 and choose the config file accordingly\n"; + std::cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n."; +- exit(0); ++ throw std::runtime_error("Exit: Incompatible Config File! " ++ "Check whether you have a Katana 400 or 300 and choose the config file accordingly"); + } + bool gripperIsPresent; + int gripperOpenEncoders, gripperCloseEncoders; diff --git a/kni-3.9.2-sofixes.patch b/kni-3.9.2-sofixes.patch new file mode 100644 index 0000000..4b84291 --- /dev/null +++ b/kni-3.9.2-sofixes.patch @@ -0,0 +1,172 @@ +diff -urN KNI_3.9.2/demo/Makefile KNI_3.9.2.sofixes/demo/Makefile +--- KNI_3.9.2/demo/Makefile 2007-06-20 08:05:24.000000000 +0200 ++++ KNI_3.9.2.sofixes/demo/Makefile 2009-08-28 22:09:05.000000000 +0200 +@@ -34,11 +34,11 @@ + INCLUDE_DIR = ../include -I./common + LIBRARY_DIR = ../lib/linux + +-BASE_LIBRARY = $(LIBRARY_DIR)/libKNIBase.a +-INVKIN_LIBRARY = $(LIBRARY_DIR)/libKNI_InvKin.a +-LM_LIBRARY = $(LIBRARY_DIR)/libKNI_LM.a ++BASE_LIBRARY = $(LIBRARY_DIR)/libKNIBase3.a ++INVKIN_LIBRARY = $(LIBRARY_DIR)/libKNI_InvKin3.a ++LM_LIBRARY = $(LIBRARY_DIR)/libKNI_LM3.a + +-AVAILABLE_LIBRARIES = ./common/keyboard.o ${BASE_LIBRARY} ${INVKIN_LIBRARY} ${LM_LIBRARY} ++AVAILABLE_LIBRARIES = ./common/keyboard.o + + .SILENT: + +@@ -55,7 +55,7 @@ + + $(TARGETS_D): $(CTARGETS_D) + echo -n "Building: $@" +- if $(CXX) $(CXXFLAGS) -I$(INCLUDE_DIR) -lpthread -o $(@:.demo=)/$(@:.demo=) $(wildcard $(@:.demo=)/*.cpp) ${AVAILABLE_LIBRARIES} 2>.clog; \ ++ if $(CXX) $(CXXFLAGS) -I$(INCLUDE_DIR) -L../lib/linux -lKNIBase3 -lKNI_InvKin3 -lKNI_LM3 -lpthread -o $(@:.demo=)/$(@:.demo=) $(wildcard $(@:.demo=)/*.cpp) ${AVAILABLE_LIBRARIES} 2>.clog; \ + then echo " [ok]"; \ + cat .clog; \ + else echo " [failed]"; \ +diff -urN KNI_3.9.2/src/Base/Makefile KNI_3.9.2.sofixes/src/Base/Makefile +--- KNI_3.9.2/src/Base/Makefile 2007-04-26 08:18:24.000000000 +0200 ++++ KNI_3.9.2.sofixes/src/Base/Makefile 2009-08-28 22:08:00.000000000 +0200 +@@ -24,20 +24,22 @@ + + TARGETS = alib solib + +-LIBNAME = libKNIBase ++LIBNAME = libKNIBase3 + SOURCES = cdlCOM.cpp cplSerial.cpp cdlSocket.cpp CRC.cpp kmlBase.cpp kmlExt.cpp kmlMotBase.cpp kmlSctBase.cpp kmlFactories.cpp + + ADDITIONAL_DEPS = ../common/Timer.o + + LIBNAME_A = $(LIBNAME).a + LIBNAME_SO = $(LIBNAME).so.$(MAJOR_VERSION).$(MINOR_VERSION) +- +-SLCFLAGS=-fPIC +-SLLDFLAGS=-shared ++LIBNAME_SO_LN = $(LIBNAME).so ++LIBNAME_SONAME = $(LIBNAME).so.$(MAJOR_VERSION) + + INCLUDE_DIR = ../../include + TARGET_DIR = ../../lib/linux + ++SLCFLAGS=-fPIC ++SLLDFLAGS = -shared -L$(TARGET_DIR) ++ + .SILENT: + + .SUFFIXES: .cpp.o +@@ -69,8 +71,9 @@ + + $(TARGET_DIR)/$(LIBNAME_SO): $(SOURCES:.cpp=.o) + echo -n "Building: $@" +- if $(CXX) $(CXXFLAGS) $(SLLDFLAGS) -o $@ $(SOURCES:.cpp=.o) $(ADDITITIONAL_DEPS) 2>.slog; \ ++ if $(CXX) $(CXXFLAGS) $(SLLDFLAGS) -o $@ -Wl,-soname,$(LIBNAME_SONAME) $(SOURCES:.cpp=.o) $(ADDITIONAL_DEPS) 2>.slog; \ + then echo " [ok]"; \ ++ ln -s $(LIBNAME_SO) $(TARGET_DIR)/$(LIBNAME_SO_LN); \ + cat .slog; \ + else echo " [failed]"; \ + cat .slog; \ +diff -urN KNI_3.9.2/src/common/Makefile KNI_3.9.2.sofixes/src/common/Makefile +--- KNI_3.9.2/src/common/Makefile 2007-04-26 08:18:24.000000000 +0200 ++++ KNI_3.9.2.sofixes/src/common/Makefile 2009-08-28 22:08:16.000000000 +0200 +@@ -17,14 +17,14 @@ + #=========================================================================== + + CXX = g++ +-CXXFLAGS += -g -O2 -Wall ++CXXFLAGS += -g -O2 -Wall -fPIC + + MAJOR_VERSION = 3.9 + MINOR_VERSION = 0 + + TARGETS = alib + +-LIBNAME = knicommon ++LIBNAME = knicommon3 + SOURCES = Timer.cpp + + LIBNAME_A = $(LIBNAME).a +diff -urN KNI_3.9.2/src/InvKin/Makefile KNI_3.9.2.sofixes/src/InvKin/Makefile +--- KNI_3.9.2/src/InvKin/Makefile 2007-04-26 08:18:24.000000000 +0200 ++++ KNI_3.9.2.sofixes/src/InvKin/Makefile 2009-08-28 22:08:25.000000000 +0200 +@@ -24,20 +24,23 @@ + + TARGETS = alib solib + +-LIBNAME = libKNI_InvKin ++LIBNAME = libKNI_InvKin3 + SOURCES = ikBase.cpp KatanaKinematics6M90G.cpp KatanaKinematics6M90T.cpp KatanaKinematics6M180.cpp KatanaKinematics5M180.cpp KatanaKinematicsDecisionAlgorithms.cpp + + ADDITIONAL_DEPS = ../common/Timer.o + + LIBNAME_A = $(LIBNAME).a + LIBNAME_SO = $(LIBNAME).so.$(MAJOR_VERSION).$(MINOR_VERSION) +- +-SLCFLAGS=-fPIC +-SLLDFLAGS=-shared ++LIBNAME_SO_LN = $(LIBNAME).so ++LIBNAME_SONAME = $(LIBNAME).so.$(MAJOR_VERSION) + + INCLUDE_DIR = ../../include + TARGET_DIR = ../../lib/linux + ++SLCFLAGS=-fPIC ++SLLDFLAGS=-shared -L$(TARGET_DIR) -lKNIBase3 ++ ++ + .SILENT: + + .SUFFIXES: .cpp.o +@@ -69,8 +72,9 @@ + + $(TARGET_DIR)/$(LIBNAME_SO): $(SOURCES:.cpp=.o) + echo -n "Building: $@" +- if $(CXX) $(CXXFLAGS) $(SLLDFLAGS) -o $@ $(SOURCES:.cpp=.o) $(ADDITITIONAL_DEPS) 2>.slog; \ ++ if $(CXX) $(CXXFLAGS) $(SLLDFLAGS) -o $@ -Wl,-soname,$(LIBNAME_SONAME) $(SOURCES:.cpp=.o) $(ADDITIONAL_DEPS) 2>.slog; \ + then echo " [ok]"; \ ++ ln -s $(LIBNAME_SO) $(TARGET_DIR)/$(LIBNAME_SO_LN); \ + cat .slog; \ + else echo " [failed]"; \ + cat .slog; \ +diff -urN KNI_3.9.2/src/LM/Makefile KNI_3.9.2.sofixes/src/LM/Makefile +--- KNI_3.9.2/src/LM/Makefile 2007-04-26 08:18:24.000000000 +0200 ++++ KNI_3.9.2.sofixes/src/LM/Makefile 2009-08-28 22:08:40.000000000 +0200 +@@ -24,20 +24,22 @@ + + TARGETS = alib solib + +-LIBNAME = libKNI_LM ++LIBNAME = libKNI_LM3 + SOURCES = lmBase.cpp + + ADDITIONAL_DEPS = ../common/Timer.o + + LIBNAME_A = $(LIBNAME).a + LIBNAME_SO = $(LIBNAME).so.$(MAJOR_VERSION).$(MINOR_VERSION) +- +-SLCFLAGS=-fPIC +-SLLDFLAGS=-shared ++LIBNAME_SO_LN = $(LIBNAME).so ++LIBNAME_SONAME = $(LIBNAME).so.$(MAJOR_VERSION) + + INCLUDE_DIR = ../../include + TARGET_DIR = ../../lib/linux + ++SLCFLAGS=-fPIC ++SLLDFLAGS=-shared -L$(TARGET_DIR) -lKNIBase3 -lKNI_InvKin3 ++ + .SILENT: + + .SUFFIXES: .cpp.o +@@ -69,8 +71,9 @@ + + $(TARGET_DIR)/$(LIBNAME_SO): $(SOURCES:.cpp=.o) + echo -n "Building: $@" +- if $(CXX) $(CXXFLAGS) $(SLLDFLAGS) -o $@ $(SOURCES:.cpp=.o) $(ADDITITIONAL_DEPS) 2>.slog; \ ++ if $(CXX) $(CXXFLAGS) $(SLLDFLAGS) -o $@ -Wl,-soname,$(LIBNAME_SONAME) $(SOURCES:.cpp=.o) $(ADDITIONAL_DEPS) 2>.slog; \ + then echo " [ok]"; \ ++ ln -s $(LIBNAME_SO) $(TARGET_DIR)/$(LIBNAME_SO_LN); \ + cat .slog; \ + else echo " [failed]"; \ + cat .slog; \ diff --git a/libkni3.spec b/libkni3.spec new file mode 100644 index 0000000..6000d55 --- /dev/null +++ b/libkni3.spec @@ -0,0 +1,204 @@ +Name: libkni3 +Version: 3.9.2 +Release: 12%{?dist} +Summary: C++ KNI library v3 for the Katana 300 robot arm + +Group: System Environment/Libraries +License: GPLv2+ +URL: http://www.neuronics.ch/cms_de/web/index.php?id=386 +Source0: http://www.neuronics.ch/cms_de/mediabase/KNI_3.9.2.tar.gz +Patch0: kni-3.9.2-gcc43.patch +Patch1: kni-3.9.2-sofixes.patch +Patch2: kni-3.9.2-ctor.patch +Patch3: kni-3.9.2-noexit.patch +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +BuildRequires: doxygen, graphviz +%if 0%{?fedora} >= 9 +BuildRequires: texlive-utils +%else +BuildRequires: tetex +%endif + +BuildRequires: boost-devel + +%description +Katana Native Interface is a C++ library for programmers who would like to +write their own programs, but don't want to implement the protocol and +device stuff katana is using. + +This package contains the library for the Katana 300 series of the arm. For +newer robots use libkni (version 4 and above). + + +%package devel +Summary: Development files for %{name} +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} +Requires: pkgconfig + +%description devel +The %{name}-devel package contains libraries and header files for +developing applications that use %{name}. + + +%package static +Summary: Static libraries for %{name} +Group: Development/Libraries +Requires: %{name}-devel = %{version}-%{release} + +%description static +This package contains static libraries that can be used to +compile static binaries using %{name}. + + +%package doc +Summary: Documentation for %{name} +Group: Documentation + +%description doc +This package contains the documentation for developing with %{name}. + +%package examples +Summary: Example applications for %{name} +Group: Applications/System +Requires: %{name} = %{version}-%{release} + +%description examples +This package contains demo applications for %{name}. + +%prep +%setup -q -n KNI_%{version} +%patch0 -p1 -b .gcc43 +%patch1 -p1 -b .sofixes +%patch2 -p1 -b .ctor +%patch3 -p1 -b .noexit + + +%build +make CFLAGS="%{optflags}" +make doc +echo "prefix=%{prefix} +exec_prefix=%{prefix} +libdir=%{_libdir} +includedir=%{_includedir} + +Name: %{name} +Description: %{summary} +Version: %{version} +Libs: -L\${libdir} -lKNIBase3 -lKNI_InvKin3 -lKNI_LM3 +Cflags: -I\${includedir}/kni3" > libkni3.pc + + +%install +rm -rf %{buildroot} +mkdir -p %{buildroot} +mkdir -p %{buildroot}%{_libdir} +install -m 0644 -p lib/linux/*.a %{buildroot}%{_libdir} +install -p lib/linux/*.so.* %{buildroot}%{_libdir} +for f in `find %{buildroot}%{_libdir} -name '*.so.*.*.*'`; do + ln -s `basename $f` %{buildroot}%{_libdir}/`echo \`basename $f\` | sed -e 's/\(\(.*\).so\)\(.*\)/\1/'` + ln -s `basename $f` %{buildroot}%{_libdir}/`objdump --private-headers $f | grep SONAME | awk '{print $2}'` +done +mkdir -p %{buildroot}%{_bindir} +for f in `find demo/ -perm /a+x -type f`; do + install -p $f %{buildroot}%{_bindir}/kni_`basename $f` +done +mkdir -p %{buildroot}%{_sysconfdir}/kni3 +mkdir -p %{buildroot}%{_sysconfdir}/kni3/hd300 +mkdir -p %{buildroot}%{_sysconfdir}/kni3/hd400 +install -p -m 0644 configfiles300/*.cfg %{buildroot}%{_sysconfdir}/kni3/hd300 +install -p -m 0644 configfiles400/*.cfg %{buildroot}%{_sysconfdir}/kni3/hd400 +mkdir -p %{buildroot}%{_includedir}/kni3 +cp -a include/* %{buildroot}%{_includedir}/kni3 +mkdir -p %{buildroot}%{_docdir}/%{name}-doc-%{version} +cp -a doc/html %{buildroot}%{_docdir}/%{name}-doc-%{version} +install -p -m 0644 doc/*.pdf %{buildroot}%{_docdir}/%{name}-doc-%{version} +find %{buildroot} -name '.svn' | xargs rm -rf +mkdir -p %{buildroot}%{_libdir}/pkgconfig +install -p -m 0644 libkni3.pc %{buildroot}%{_libdir}/pkgconfig + + +%clean +rm -rf %{buildroot} + + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + + +%files +%defattr(-,root,root,-) +%doc LICENSE.txt readme.txt AUTHORS.txt +%{_libdir}/*.so.* +%dir %{_sysconfdir}/kni3 +%dir %{_sysconfdir}/kni3/hd300 +%dir %{_sysconfdir}/kni3/hd400 +%config(noreplace)%{_sysconfdir}/kni3/*/*.cfg + +%files devel +%defattr(-,root,root,-) +%{_includedir}/* +%{_libdir}/*.so +%{_libdir}/pkgconfig/* + +%files static +%defattr(-,root,root,-) +%{_libdir}/*.a + +%files doc +%defattr(-, root, root, 0755) +%{_docdir}/%{name}-doc-%{version} + +%files examples +%defattr(-, root, root, 0755) +%{_bindir}/kni_* + + +%changelog +* Mon Sep 14 2009 Tim Niemueller - 3.9.2-12 +- doc package contains doc dir, not docs + +* Fri Aug 28 2009 Tim Niemueller - 3.9.2-11 +- Rename shared libs to allow parallel installation for libkni +- Merge all shared lib related patches to one sofixes patch + +* Sat Jun 13 2009 Tim Niemueller - 3.9.2-10 +- Update ctor and gcc43 patch for F11 + +* Tue Jun 09 2009 Tim Niemueller - 3.9.2-9 +- Rename to libkni3, libkni will be the most up2date version (v4), but this + version is still required for older Katana 300 arms +- Add patch to fix library building, did work on my machin only because libs + were installed on the system + +* Wed Dec 03 2008 Tim Niemueller - 3.9.2-8 +- Fix noexit patch + +* Mon Dec 01 2008 Tim Niemueller - 3.9.2-7 +- Make patch 3 apply with fuzz=0 +- Added patch that removes calls to exit() but throws exceptions + +* Sun Nov 09 2008 Tim Niemueller - 3.9.2-6 +- Updated license tag +- Consistent (non-)macro usage + +* Tue Jul 15 2008 Tim Niemueller - 3.9.2-5 +- Added ctor patch which adds an optional argument to the ctor to allow for + accessing an arbitrary device, for example a usb2ser converter + (RoboCup 2008) + +* Mon Jun 23 2008 Tim Niemueller - 3.9.2-4 +- More .so fixes, link libs against base lib to get rid of + undefined-non-weak-symbol rpmlint warnings + +* Mon Jun 16 2008 Tim Niemueller - 3.9.2-3 +- Fixed summary + +* Thu Jun 12 2008 Tim Niemueller - 3.9.2-2 +- Upgraded BR to support building on Fedora version < 9 + +* Sat Jun 07 2008 Tim Niemueller - 3.9.2-1 +- Initial package + diff --git a/sources b/sources index e69de29..3925e83 100644 --- a/sources +++ b/sources @@ -0,0 +1 @@ +63b40f2c258f7ce2159b2471f4569165 KNI_3.9.2.tar.gz