1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
#include "parallel.h"
const char *Parallel::devstr = "/dev/parport0";
const unsigned int Parallel::numPins = 8;\
Parallel::Parallel(){
int failure = 0;
fd = open(devstr, O_WRONLY, 0);
if (fd != -1){
// claim the port
failure = ioctl(fd, PPCLAIM);
// close if failed
if (failure){
throw ParallelException("Failed to claim parallel port.");
}
}
else{
throw ParallelException("Failed to open parallel port device " + string(devstr));
}
}
Parallel::~Parallel(){
// release the port
ioctl(fd, PPRELEASE);
// close the port
close(fd);
}
void Parallel::setState(int state){
struct ppdev_frob_struct frob;
unsigned char data;
int failure = 0;
// standard mask
frob.mask = PARPORT_CONTROL_STROBE;
// check what state to set
if (state == 0){
// turn it off
frob.val = 0;
data = 0;
}
else
{
// turn it on
frob.val = PARPORT_CONTROL_STROBE;
data = 0xFF;
}
// talk to the port
failure = ioctl(fd, PPWDATA, &data);
if (!failure){
failure = ioctl(fd, PPFCONTROL, &frob);
}
if (failure){
throw ParallelException("Failed to set pin state in ioctl.");
}
}
unsigned char Parallel::binaryStringToNum(unsigned char *str){
if (strlen((const char *)str)!=numPins){
throw ParallelException("Invalid signal string.");
}
unsigned char numVal = 0;
for (unsigned int i=0; i<numPins; i++){
char thisone;
// get the ith bit, starting from the least sig.
strncpy(&thisone, (const char *)(&str[numPins - i - 1]), 1);
// multiply
numVal += static_cast<int>(atoi(&thisone)*pow(2, i));
}
return numVal;
}
void Parallel::setSignal(unsigned char *signal){
struct ppdev_frob_struct frob;
unsigned char data = binaryStringToNum(signal);
int failure = 0;
// standard mask
frob.mask = PARPORT_CONTROL_STROBE;
// turn it on
frob.val = PARPORT_CONTROL_STROBE;
// talk to the port
failure = ioctl(fd, PPWDATA, &data);
if (!failure){
failure = ioctl(fd, PPFCONTROL, &frob);
}
if (failure){
throw ParallelException("Failed to set pin state in ioctl.");
}
}
|