00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "ParallelPort.hpp"
00030 #include <cstdlib>
00031 #include <cstdio>
00032 #include <sys/io.h>
00033
00034 namespace RTT
00035 {
00036 namespace detail {
00037 struct IOPerm_not_allowed {};
00038 }
00039
00040 TemplateDigitalOut ParallelPort::Base;
00041
00042 ParallelPort::ParallelPort( const std::string& name, unsigned short int address)
00043 : DigitalOutInterface( name ), address_( address )
00044 {
00045 if ( ioperm(address_, 3, 1)) {
00046
00047
00048
00049
00050
00051 perror("ParallelPort : ioperm open");
00052 #ifndef ORO_EMBEDDED
00053 throw detail::IOPerm_not_allowed();
00054 #else
00055 return;
00056 #endif
00057 }
00058
00059 outb(0, address_ + 2);
00060
00061 this->update();
00062 }
00063
00064 ParallelPort::ParallelPort( unsigned short int address )
00065 : address_( address )
00066 {
00067 if ( ioperm(address_, 3, 1)) {
00068
00069
00070
00071
00072
00073 perror("ParallelPort : ioperm open");
00074 #ifndef ORO_EMBEDDED
00075 throw detail::IOPerm_not_allowed();
00076 #else
00077 return;
00078 #endif
00079 }
00080
00081 outb(0, address_ + 2);
00082
00083 this->update();
00084 }
00085
00086 ParallelPort::~ParallelPort()
00087 {
00088 if (ioperm(address_, 3, 0)) {
00089
00090
00091
00092
00093 perror("ParallelPort : ioperm close");
00094 }
00095 }
00096
00097 void ParallelPort::refresh()
00098 {
00099 unsigned char status = inb(address_);
00100 Base.setSequence(0, 7, status);
00101 }
00102
00103 void ParallelPort::update() const
00104 {
00105 unsigned char out = Base.getBitStatus();
00106 outb(out, address_);
00107 }
00108
00109 void ParallelPort::switchOn( unsigned int bit)
00110 {
00111 Base.switchOn(bit);
00112 this->update();
00113 }
00114
00115 void ParallelPort::switchOff( unsigned int bit)
00116 {
00117 Base.switchOff(bit);
00118 this->update();
00119 }
00120
00121 void ParallelPort::setBit( unsigned int bit, bool value)
00122 {
00123 Base.setBit(bit,value);
00124 this->update();
00125 }
00126
00127
00128 void ParallelPort::setSequence(unsigned int start_bit, unsigned int stop_bit, unsigned int value)
00129 {
00130 Base.setSequence(start_bit, stop_bit, value);
00131 this->update();
00132 }
00133
00134 bool ParallelPort::checkBit( unsigned int bit) const
00135 {
00136 return Base.checkBit(bit);
00137 }
00138
00139 unsigned int ParallelPort::checkSequence (unsigned int start_bit, unsigned int stop_bit) const
00140 {
00141 return Base.checkSequence(start_bit, stop_bit);
00142 }
00143
00144 unsigned int ParallelPort::nbOfOutputs() const {
00145 return 8;
00146 }
00147 }