ProTech's home page

ProTech-Online.com

This is a Linux C++ code example of accessing the Titan AIM104 Relay8/IN8 Board.

#include <iostream>
#include <sstream>
#include <string>
#include <fcntl.h>
#include <arcom/libaim104.h>
#include <time.h>
#include <sys/time.h>
#define usleep(x)       usleep((int)((x) * 1000000))
using namespace std;
class vgpio {
public:
       vgpio();
       ~vgpio();
       int AIM104;
       struct timespec tstart, tstop;
       struct timespec ptstart, ptstop;
       int tseconds;
       int ptseconds;
       bool doorsensors(bool,bool,bool,bool);
       bool doorsensor(int);
       bool tanksensor(string);
       void CardReaderOn();
       void popdoor(string);
       void popdoors(bool,bool,bool,bool);
};
vgpio::vgpio() {
       AIM104 = open("/dev/arcom/aim104/relay8/0", O_RDWR);
       aim104_relay8_set_all(AIM104, 0x00);
       clock_gettime(CLOCK_REALTIME, &tstart);
       cout << "AIM104 relays enabled: " << aim104_relay8_enable_relays(AIM104, 1) << endl;
}
vgpio::~vgpio() {
       close(AIM104);
}
bool vgpio::doorsensors(bool cage1_enabled, bool cage2_enabled, bool cage3_enabled, bool cage4_enabled){
       if(cage1_enabled && !doorsensor(1)){
              clock_gettime(CLOCK_REALTIME, &tstart); 
              return false;
       }
       if(cage2_enabled && !doorsensor(2)){
              clock_gettime(CLOCK_REALTIME, &tstart);
                return false;
       }
       if(cage3_enabled && !doorsensor(3)){
              clock_gettime(CLOCK_REALTIME, &tstart);
                return false;
       }
       if(cage4_enabled && !doorsensor(4)){
              clock_gettime(CLOCK_REALTIME, &tstart);
                return false;
       }
       clock_gettime(CLOCK_REALTIME, &tstop);
       tseconds = tstop.tv_sec - tstart.tv_sec;
       if(tseconds <= 2){
              return false;
       }
       return true;
}
bool vgpio::tanksensor(string cage){
        bool on;
       int t;
       int sensors_status;
        sensors_status = aim104_relay8_inputs(AIM104);
       if (cage == "1"){
              t sensors_status & 1;
              on = (t > 0) ? false : true;
        }
        if (cage == "2"){
              t sensors_status & 4;
                on = (t > 0) ? false : true;
        }
        if (cage == "3"){
              t sensors_status & 16;
                on = (t > 0) ? false : true;
        }
        if (cage == "4"){
              t sensors_status & 64;
                on = (t > 0) ? false : true;
        }
        return on;
}
void vgpio::popdoor(string cage){
       if (cage == "1"){
              cout << "pop cage1" << endl;
              aim104_relay8_set_all(AIM104, 0x81);
              clock_gettime(CLOCK_REALTIME, &ptstart);
              ptseconds = 0;
              while(ptseconds < 6){
                     clock_gettime(CLOCK_REALTIME, &ptstop);
                     ptseconds = ptstop.tv_sec - ptstart.tv_sec;
                     if(!doorsensor(1))
                           break;
              }
              aim104_relay8_set_all(AIM104, 0x80);
       }
       if (cage == "2"){
              cout << "pop cage2" << endl;
              aim104_relay8_set_all(AIM104, 0x82);
                clock_gettime(CLOCK_REALTIME, &ptstart);
                ptseconds = 0;
                while(ptseconds < 6){
                     clock_gettime(CLOCK_REALTIME, &ptstop);
                        ptseconds = ptstop.tv_sec - ptstart.tv_sec;
                        if(!doorsensor(2))
                                break;
                }
              aim104_relay8_set_all(AIM104, 0x80);
        }
       if (cage == "3"){
              cout << "pop cage3" << endl;
              aim104_relay8_set_all(AIM104, 0x84);
                clock_gettime(CLOCK_REALTIME, &ptstart);
                ptseconds = 0;
                while(ptseconds < 6){
                     clock_gettime(CLOCK_REALTIME, &ptstop);
                        ptseconds = ptstop.tv_sec - ptstart.tv_sec;
                        if(!doorsensor(3))
                                break;
                }
              aim104_relay8_set_all(AIM104, 0x80);
        }
       if (cage == "4"){
              cout << "pop cage4" << endl;
              aim104_relay8_set_all(AIM104, 0x88);
                clock_gettime(CLOCK_REALTIME, &ptstart);
                ptseconds = 0;
                while(ptseconds < 6){
                     clock_gettime(CLOCK_REALTIME, &ptstop);
                        ptseconds = ptstop.tv_sec - ptstart.tv_sec;
                        if(!doorsensor(4))
                                break;
                }
              aim104_relay8_set_all(AIM104, 0x80);
        }
}
void vgpio::CardReaderOn(){
       cout << "turning card reader on" << endl;
       aim104_relay8_set_all(AIM104, 0x80);
}
void vgpio::popdoors(bool cage1_enabled, bool cage2_enabled, bool cage3_enabled, bool cage4_enabled){
       cout << "pop all enabled doors" << endl;
       if(cage1_enabled){
              popdoor("1");
              usleep(2);
       }
       if(cage2_enabled){
                popdoor("2");
              usleep(2);
       }
       if(cage3_enabled){
                popdoor("3");
              usleep(2);
       }
       if(cage4_enabled){
                popdoor("4");
              usleep(2);
       }
}
bool vgpio::doorsensor(int cage){
        bool on;
       int c;
        int sensors_status;
       sensors_status = aim104_relay8_inputs(AIM104);
       switch(cage){
                case 1:
                        c = sensors_status & 2;
                        on = (c > 0) ? false : true;
                        break;
                case 2:
                        c = sensors_status & 8;
                        on = (c > 0) ? false : true;
                        break;
                case 3:
                        c = sensors_status & 32;
                        on = (c > 0) ? false : true;
                        break;
                case 4:
                        c = sensors_status & 128;
                        on = (c > 0) ? false : true;
                        break;
                default:
                        on = false;
                        break;
        }
        return on;
}


Copyright © 2013 ProTechs-Online.com; All rights reserved.