PowerAnt: Teach Your computer To drive The real World
PowerAnt is control from personal computer, using RS232 port, from 14 and more external electrical devices. Open, Human-Readable protocol, it is fully described in programmer's manual. Control of electrical equipment with power supply near 200W. You Wish control the real world from MS Excel?
 PowerAnt
Owerview
Applications
DataSheet
Documentation
Photos
 PowerAnt types
SwSe
SwSw
SeSe
 Programming
Perl samples
C/C++ - samples
MS Access 2000
MS Excel 2000
 Order
Order details
Price
 News RSS
 Contacts

C/C++ programming, program samples

First of all you must read the programmers manual (you can find it in documentation page). Some simple programs on C/C++ are described in this page:

  • Running light (Linux)
  • Blinking light (Linux)
  • Program for control one PowerAnt with type SwSw (MS Windows)
  • Running light

    Linux, gcc. PowerAnt type SwSe. Switches state indication leds on/off one by one.

    #include <stdio.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <string.h>
    #include <termios.h>
    #include <unistd.h>
    
    
    void init_raw_tty( int fd ){
        struct termios newtio;
    
        bzero(&newtio, sizeof(newtio));
        newtio.c_cflag  = B9600 | CS8 | CLOCAL | CREAD;
        newtio.c_iflag  = IGNPAR;
        newtio.c_oflag  = 0;
    	        
        /* set input mode (non-canonical, no echo,...) */
        newtio.c_lflag = 0;
    				         
        newtio.c_cc[VTIME]    = 10;
        newtio.c_cc[VMIN]     = 0; 
    
        tcflush(fd, TCIFLUSH);
        tcsetattr(fd,TCSANOW,&newtio);
    }
    
    FILE * powerants;
    int powerants_int;
    
    void printAnswer( void ){
        int inCh;
        do {
            inCh = fgetc(powerants);
            if( inCh > 0 ){
        	    //printf("%c",inCh);
            } else { 
    	    printf("x"); 
    	    fputc(0x1B,powerants);
    	    fflush(powerants);
    	    tcdrain(powerants_int);
    	    fprintf(powerants,"?%\r");
    	    fflush(powerants);
    	    tcdrain(powerants_int);
    	};
        } while( inCh != 0x0D );  
    }
    
    int main( int ArgC, char * ArgV[] ){
        powerants_int = open("/dev/ttyS1",O_RDWR | O_NOCTTY );
    
        if(! powerants_int ){
    	fprintf( stderr, "ERROR: (open) %s\n", strerror( errno ) );
    	return -1;
        };
        
        init_raw_tty( powerants_int );
        powerants = fdopen( powerants_int, "w+b" );
    
        fprintf(powerants,"%c",0x1B);  // Clear PowerAnt input buffer
        fprintf(powerants,"??\r");
        printAnswer();
        fprintf(powerants,"=ABCDEFGH\r");
        printf("=ABCDEFGH\n");
        printAnswer();
        char ltr = 'A';
        char ltr2 = 'a';
        int x = 3600;
        while( x-- ){
    	fprintf(powerants,"=%c\r",ltr);
    	//printf("=%c\n",ltr);
    	printAnswer();
    	//usleep( 1 );	
    	fprintf(powerants,"=%c\r",ltr2);
    	//printf("=%c\n",ltr2);
    	printAnswer();
    	//usleep( 1 );	
    	ltr++;
    	ltr2++;
    	if( ltr > 'H'){
    	    ltr = 'A';
    	    ltr2 = 'a';
    	}; 
        };
        return 0;
    };
    

    Blinking lights

    Linux, gcc. PowerAnt of type SwSe. Group of switch state indication leds are On/Off. Program run so fast and user see all leds are On :). .

    #include <stdio.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <string.h>
    #include <termios.h>
    #include <unistd.h>
    
    
    void init_raw_tty( int fd ){
        struct termios newtio;
    
        bzero(&newtio, sizeof(newtio));
        newtio.c_cflag  = B9600 | CS8 | CLOCAL | CREAD;
        newtio.c_iflag  = IGNPAR;
        newtio.c_oflag  = 0;
    	        
        /* set input mode (non-canonical, no echo,...) */
        newtio.c_lflag = 0;
    				         
        newtio.c_cc[VTIME]    = 10;
        newtio.c_cc[VMIN]     = 0; 
    
        tcflush(fd, TCIFLUSH);
        tcsetattr(fd,TCSANOW,&newtio);
    }
    
    FILE * powerants;
    int powerants_int;
    
    void printAnswer( void ){
        int inCh;
        do {
            inCh = fgetc(powerants);
            if( inCh > 0 ){
        	    printf("%c",inCh);
            } else { 
    	    printf("x"); 
    	};
        } while( inCh != 0x0D );  
    }
    
    int main( int ArgC, char * ArgV[] ){
        powerants_int = open("/dev/ttyS1",O_RDWR | O_NOCTTY );
    
        if(! powerants_int ){
    	fprintf( stderr, "ERROR: (open) %s\n", strerror( errno ) );
    	return -1;
        };
        
        init_raw_tty( powerants_int );
        powerants = fdopen( powerants_int, "w+b" );
    
        fprintf(powerants,"%c",0x1B);  // Clear the PowerAnt input buffer
        int x = 3600;
        while( x-- ){
    	fprintf(powerants,"=AbCdEfGh\r");
            printAnswer();
            fprintf(powerants,"=aBcDeFgH\r");
            printAnswer(); 
        };
        return 0;
    };
    
    

    Program for control one PowerAnt with type SwSw (MS Windows)

    Windows, Borland C++ v6. PowerAnt type SwSw, The window of this program give you full control to one device.

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Begin.h"
    
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    
    #include <winbase.h>
    #include <stdio.h>
    
    DCB	pwrAntDCB;
    HANDLE	pwrAntHANDLE;
    COMMTIMEOUTS pwrAntCommTimeouts;
    
    void ShowError( const char * whereError ){
    	LPVOID lpMsgBuf;
    	FormatMessage(
    	    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    	    NULL,
    	    GetLastError(),
    	    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    	    (LPTSTR) &lpMsgBuf,
    	    0,
    	    NULL
    	);
    	// Display the string.
    	MessageBox( NULL, (const char *)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );
    
    	// Free the buffer.
    	LocalFree( lpMsgBuf );
    }
    
    BOOL openPwrAntPort( const char * comName ){
            pwrAntHANDLE = CreateFile(
                    comName
                    ,GENERIC_READ | GENERIC_WRITE // Read-Write access
                    ,0 // Cannot be shared
                    ,NULL // Security Attributes
                    ,OPEN_EXISTING // Open existing file
                    ,FILE_ATTRIBUTE_NORMAL || FILE_FLAG_WRITE_THROUGH // | FILE_FLAG_NO_BUFFERING // Auto flush
                    ,NULL // Template File
            );
    	if( ! pwrAntHANDLE ){
                    ShowError("CreateFile");
    		return FALSE;
    	};
            if( ! GetCommState( pwrAntHANDLE, &pwrAntDCB )){
                    ShowError("GetCommState");
    		return FALSE;
            };
            if( ! BuildCommDCB( "baud=9600 parity=N data=8 stop=1", &pwrAntDCB ) ){
                    ShowError("BuildCommDCB");
    		return FALSE;
            };
            if( ! SetCommState( pwrAntHANDLE, &pwrAntDCB )){
                    ShowError("SetCommState");
    		return FALSE;
            };
            if( ! GetCommTimeouts( pwrAntHANDLE, &pwrAntCommTimeouts ) ){
                    ShowError("GetCommTimeouts");
    		return FALSE;
            };
    
            pwrAntCommTimeouts.ReadIntervalTimeout          = 10; // milliseconds
            pwrAntCommTimeouts.ReadTotalTimeoutMultiplier   = 0;  //
            pwrAntCommTimeouts.ReadTotalTimeoutConstant     = 0;  //
            pwrAntCommTimeouts.WriteTotalTimeoutMultiplier  = 0;  //
            pwrAntCommTimeouts.WriteTotalTimeoutConstant    = 0;  //
    
            if( ! SetCommTimeouts( pwrAntHANDLE, &pwrAntCommTimeouts ) ){
                    ShowError("SetCommTimeouts");
    		return FALSE;
            };
    	return TRUE;
    }
    
    BOOL pwrAntCMD( const char * cmd ){
    	unsigned char buff[70];
    	unsigned long i;
            unsigned long io_i;
    	for( i = 0 ; cmd[i] ; i++ ){
    		buff[i] = cmd[i];
    	};
    	buff[i++] = 0x0D;
    	buff[i++] = 0x00; //
    /*        {
                    unsigned char buff2[100];
                    unsigned char * buffptr = buff2;
                    MessageBox( NULL, buff , "Send Command", MB_OK|MB_ICONINFORMATION );
                    for( unsigned int x = 0 ; x < i ; x++ ){
                            buffptr += sprintf( buffptr, "%02x ", buff[x] );
                    };
                    MessageBox( NULL, buff2 , "Answer by Bytes", MB_OK|MB_ICONINFORMATION );
            }
    */	if( ! WriteFile(
    			pwrAntHANDLE
    			,buff
    			, i-1 // Do not send Zero at end of command
                            , &io_i
                            , NULL
    	)){
    		ShowError("WriteFile");
    		return FALSE;
    	};
    	if( ! FlushFileBuffers( pwrAntHANDLE )){
                    ShowError("FlushFileBuffers");
                    return FALSE;
            };
            // Read the answer from PowerAnt
            if( ! ReadFile(
                    pwrAntHANDLE
                    ,buff
                    , 50 // Full PowerAnt Buffer Length
                    , &io_i
                    , NULL
            )){
                    ShowError("ReadFile");
                    return FALSE;
            };
            buff[io_i] = 0; // Null Termination
            if( io_i > 3 || (buff[0] != '+') ){
                    MessageBox( NULL, buff , "Command execution result", MB_OK|MB_ICONINFORMATION );
                    /*
                    unsigned char buff2[100];
                    unsigned char * buffptr = buff2;
                    for( unsigned int x = 0 ; x < io_i ; x++ ){
                            buffptr += sprintf( buffptr, "%02x ", buff[x] );
                    };
                    MessageBox( NULL, buff2 , "Answer by Bytes", MB_OK|MB_ICONINFORMATION );
                    */
            };
    	return TRUE;
    }
    
    void closePwrAntPort( void ){
            if( ! CloseHandle( pwrAntHANDLE )){
                    ShowError("CloseFile");
    		return;
    	};
    }
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
            openPwrAntPort( "COM2" );
    }
    
    
    
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
            closePwrAntPort();
    }
    
    void __fastcall TForm1::Button1Click(TObject *Sender){
            // In Edit1 properties field OEMConvert MUST BE TRUE!
            pwrAntCMD( Edit1->Text.c_str() );
    }
    
    
    
    void __fastcall TForm1::CheckBox12Click(TObject *Sender)
    {
            if( CheckBox12->Checked ){
                    pwrAntCMD("=E");
            } else {
                    pwrAntCMD("=e");
            };
    }
    
    
    void __fastcall TForm1::CheckBox11Click(TObject *Sender)
    {
            if( CheckBox11->Checked ){
                    pwrAntCMD("=F");
            } else {
                    pwrAntCMD("=f");
            };
    }
    
    
    void __fastcall TForm1::CheckBox10Click(TObject *Sender)
    {
            if( CheckBox10->Checked ){
                    pwrAntCMD("=G");
            } else {
                    pwrAntCMD("=g");
            };
    }
    
    
    void __fastcall TForm1::CheckBox9Click(TObject *Sender)
    {
            if( CheckBox9->Checked ){
                    pwrAntCMD("=H");
            } else {
                    pwrAntCMD("=h");
            };
    }
    
    
    void __fastcall TForm1::CheckBox16Click(TObject *Sender)
    {
            if( CheckBox16->Checked ){
                    pwrAntCMD("=N");
            } else {
                    pwrAntCMD("=n");
            };
    }
    
    
    void __fastcall TForm1::CheckBox15Click(TObject *Sender)
    {
            if( CheckBox15->Checked ){
                    pwrAntCMD("=M");
            } else {
                    pwrAntCMD("=m");
            };
    }
    
    
    void __fastcall TForm1::CheckBox14Click(TObject *Sender)
    {
            if( CheckBox14->Checked ){
                    pwrAntCMD("=L");
            } else {
                    pwrAntCMD("=l");
            };
    }
    
    
    void __fastcall TForm1::CheckBox4Click(TObject *Sender)
    {
            if( CheckBox4->Checked ){
                    pwrAntCMD("=D");
            } else {
                    pwrAntCMD("=d");
            };
    }
    
    
    void __fastcall TForm1::CheckBox3Click(TObject *Sender)
    {
            if( CheckBox3->Checked ){
                    pwrAntCMD("=C");
            } else {
                    pwrAntCMD("=c");
            };
    }
    
    
    void __fastcall TForm1::CheckBox2Click(TObject *Sender)
    {
            if( CheckBox2->Checked ){
                    pwrAntCMD("=B");
            } else {
                    pwrAntCMD("=b");
            };
    }
    
    
    void __fastcall TForm1::CheckBox5Click(TObject *Sender)
    {
            if( CheckBox5->Checked ){
                    pwrAntCMD("=A");
            } else {
                    pwrAntCMD("=a");
            };
    
    }
    
    
    void __fastcall TForm1::CheckBox8Click(TObject *Sender)
    {
            if( CheckBox8->Checked ){
                    pwrAntCMD("=I");
            } else {
                    pwrAntCMD("=i");
            };
    }
    
    
    void __fastcall TForm1::CheckBox7Click(TObject *Sender)
    {
            if( CheckBox7->Checked ){
                    pwrAntCMD("=J");
            } else {
                    pwrAntCMD("=j");
            };
    }
    
    
    void __fastcall TForm1::CheckBox6Click(TObject *Sender)
    {
            if( CheckBox6->Checked ){
                    pwrAntCMD("=K");
            } else {
                    pwrAntCMD("=k");
            };
    }
    
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
            pwrAntCMD("??");
    }
    
    
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
            pwrAntCMD("?=");        
    }
    
    
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
            pwrAntCMD("?%");        
    }
    
    
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
            pwrAntCMD("?#");        
    }
    

    You can download all source code in zip archive.

    PowerAnt is control from personal computer, using RS232 port, from 14 and more external electrical devices. Open, Human-Readable protocol, it is fully described in programmer's manual. Control of electrical equipment with power supply near 200W. You Wish control the real world from MS Excel?
      © 2004-2022 by  www.anthillsolutions.com