Advice requested: What is the best approach to looping?

Supporting Java SE version 7 and up
CohesiveTechnology
Phidgetly
Posts: 15
Joined: Sat Jun 11, 2011 6:34 pm
Location: Keene, NH USA
Contact:

Advice requested: What is the best approach to looping?

Postby CohesiveTechnology » Mon Jul 04, 2011 9:26 am

I am in a project that is at the moment working, though I suspect not as efficiently as it could.

Essentially I have a SBC2 controlling a IFK 0/0/4. I use the SBC2 input as control hard-wired to switches, and the SBC2 output to illuminate LEDs. The switches are mechanical inputs that can change at any time.

At the moment I have the working block in a do/while loop with a 3/4 second sleep in between executions. The program is a daemon that must run continuously and be stable.

I get event handlers, but it seems that I am not making use of them. It also seems that the construct I now have may be a simple as I can make it.

The code is below. Any input is welcome.

Code: Select all

import com.phidgets.*;
import com.phidgets.event.*;
import java.text.DateFormat;
import java.util.Calendar;
/**
 *  This module controls the switches
 *  @author DJF
 */
public class Switches
{
    public static void main(String args[]) throws Exception
    {
        Calendar cal = Calendar.getInstance();
        DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.MEDIUM);
        InterfaceKitPhidget iksbc = new InterfaceKitPhidget();
        InterfaceKitPhidget ikr1 = new InterfaceKitPhidget();
       
        try
        {
        //Example of enabling logging.
        //Phidget.enableLogging(Phidget.PHIDGET_LOG_VERBOSE, null);
        System.out.println("System started at " + df.format(cal.getTime()).toString());
        System.out.println(Phidget.getLibraryVersion());
       
        //Attach listeners for the SBC
        iksbc.addAttachListener(new AttachListener() {
            @Override
                public void attached(AttachEvent ae) {
                        System.out.println("attachment of " + ae);
                }
        });
        iksbc.addDetachListener(new DetachListener() {
            @Override
                public void detached(DetachEvent ae) {
                        System.out.println("detachment of " + ae);
                }
        });
        iksbc.addErrorListener(new ErrorListener() {
            @Override
                public void error(ErrorEvent ee) {
                        System.out.println(ee);
                }
        });
        iksbc.addInputChangeListener(new InputChangeListener() {
            @Override
                public void inputChanged(InputChangeEvent oe) {
                        System.out.println(oe);
                }
        });
        iksbc.addOutputChangeListener(new OutputChangeListener() {
            @Override
                public void outputChanged(OutputChangeEvent oe) {
                        System.out.println(oe);
                }
        });
        iksbc.addSensorChangeListener(new SensorChangeListener() {
            @Override
                public void sensorChanged(SensorChangeEvent se) {
                        System.out.println(se);
                }
        });
       
        //Attach listeners for the 0/0/4 relay
        ikr1.addAttachListener(new AttachListener() {
            @Override
                public void attached(AttachEvent ae) {
                        System.out.println("attachment of " + ae);
                }
        });
        ikr1.addDetachListener(new DetachListener() {
            @Override
                public void detached(DetachEvent ae) {
                        System.out.println("detachment of " + ae);
                }
        });
        ikr1.addErrorListener(new ErrorListener() {
            @Override
                public void error(ErrorEvent ee) {
                        System.out.println(ee);
                }
        });
        ikr1.addInputChangeListener(new InputChangeListener() {
            @Override
                public void inputChanged(InputChangeEvent oe) {
                        System.out.println(oe);
                }
        });
        ikr1.addOutputChangeListener(new OutputChangeListener() {
            @Override
                public void outputChanged(OutputChangeEvent oe) {
                        System.out.println(oe);
                }
        });
        ikr1.addSensorChangeListener(new SensorChangeListener() {
            @Override
                public void sensorChanged(SensorChangeEvent se) {
                        System.out.println(se);
                }
        });

        iksbc.open(48071);//TODO: abstract
        System.out.println("waiting for SBC attachment... ");
        iksbc.waitForAttachment(2000);
       
        if (iksbc.isAttached())
        {
            System.out.println(iksbc.getDeviceName() + " is attached.");
        }
            else
            {
                System.err.println(iksbc.getDeviceName() + " cannot be found.");
                throw new Exception();
            }
       
        ikr1.open(108986);//TODO: abstract
        System.out.println("waiting for Relay 1 attachment... ");
        ikr1.waitForAttachment(2000);
       
        if(ikr1.isAttached())
        {
            System.out.println(ikr1.getDeviceName() + " is attached.");
        }
            else
            {
                System.err.println(ikr1.getDeviceName() + " cannot be found.");
                throw new Exception();
            }
       
        Thread.sleep(1000);//Why? To catch up?
//            iksbc.setDeviceLabel("i4C SBC");
//            ikr1.setDeviceLabel("i4C Relay 1");
       
        for ( int i = 0; i < ikr1.getOutputCount(); i++)
        {
            ikr1.setOutputState(i, false); //Initialize the relay to all false
        }
       
        for ( int i = 0; i < iksbc.getOutputCount(); i++)
        {
            iksbc.setOutputState(i, false); //Initialize the LEDs to all false
        }
            do //Start work
            {
                df = DateFormat.getDateTimeInstance(DateFormat.FULL,
                    DateFormat.MEDIUM);
               
                if(iksbc.getInputState(1))
                {
                    iksbc.setOutputState(1, true);
                    ikr1.setOutputState(0, true);//Intercom
                }
                    else
                    {
                        iksbc.setOutputState(1, false);
                        ikr1.setOutputState(0, false);//Intercom
                    }
                if(iksbc.getInputState(2))
                {
                    iksbc.setOutputState(2, true);
                }
                    else
                    {
                        iksbc.setOutputState(2, false);
                    }
               
                if(iksbc.getInputState(3))
                {
                    iksbc.setOutputState(3, true);
                    ikr1.setOutputState(1, true);//HAM
                }
                    else
                    {
                        iksbc.setOutputState(3, false);
                        ikr1.setOutputState(1, false);//HAM
                    }
               
                if(iksbc.getInputState(4))
                {
                    iksbc.setOutputState(4, true);
                }
                    else
                    {
                        iksbc.setOutputState(4, false);
                    }
               
                if(iksbc.getInputState(5))
                {
                    iksbc.setOutputState(5, true);
                    ikr1.setOutputState(3, true);//Radar Detector
                }
                    else
                    {
                        iksbc.setOutputState(5, false);
                        ikr1.setOutputState(3, false);//Radar Detector
                    }
               
                if(iksbc.getInputState(6))
                {
                    iksbc.setOutputState(6, true);
                    ikr1.setOutputState(2, true);//Foglights
                }
                    else
                    {
                        iksbc.setOutputState(6, false);
                        ikr1.setOutputState(2, false);//Foglights
                    }
                Thread.sleep(750); //What value should this be?
            }while (true);
        }//End try
           
        catch (Exception ex)
        {
            System.err.println("[EXCEPTION] ========================================");
            System.err.println(df.format(cal.getTime()).toString() + ": " + ex.toString());
            System.err.println(ex.getLocalizedMessage().toString());
            System.err.println(ex.getStackTrace().toString());
            System.err.println("====================================================");
        }
               
        finally
        {
            System.out.println("System down at " + df.format(cal.getTime()).toString());
            System.out.println("All relays off.....");
            for ( int i = 0; i < ikr1.getOutputCount(); i++)
            {
                ikr1.setOutputState(i, false); //Initialize the relay to all false
            }

            for ( int i = 0; i < iksbc.getOutputCount(); i++)
            {
                iksbc.setOutputState(i, false); //Initialize the LEDs to all false
            }
           
            System.out.print("closing...");
                df = null;
                iksbc.close();
                iksbc = null;
                ikr1.close();
                ikr1 = null;
            System.out.println(" closed");
            System.out.print("wait for finalization...");
                System.gc();
            System.out.println("bye");

   }//End finally
    }//End main
}//End class
DJF

David Falkenstein
Cohesive Technology - seamless is everything

User avatar
Patrick
Lead Developer
Posts: 3165
Joined: Mon Jun 20, 2005 8:46 am
Location: Canada
Contact:

Re: Advice requested: What is the best approach to looping?

Postby Patrick » Mon Jul 04, 2011 9:42 am

You would get faster response if you just set your outputs (relays/LED) in the input change handler rather then polling. You could get rid of the main body of your program and handle the logic in your event handlers.

We guarantee that you'll receive for the initial states of all inputs/outputs, and also that you won't I/O events until the attach event finishes.

Also, you don't need to setup the events that you don't plan on using.

-Patrick

CohesiveTechnology
Phidgetly
Posts: 15
Joined: Sat Jun 11, 2011 6:34 pm
Location: Keene, NH USA
Contact:

Re: Advice requested: What is the best approach to looping?

Postby CohesiveTechnology » Mon Jul 04, 2011 11:52 am

Thank you Patrick
You could get rid of the main body of your program and handle the logic in your event handlers.


I am missing something here; if I don't loop, then how do I keep the program running? I rewrote the blocks per below, and it runs, but falls through the code and exits. No errors.

You can tell I am "old school".

Code: Select all

import com.phidgets.*;
import com.phidgets.event.*;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *  This module controls the switches
 *  @author DJF
 */
public class Switches
{
    public static void main(String args[]) throws Exception
    {
        Calendar cal = Calendar.getInstance();
        DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.MEDIUM);
        final InterfaceKitPhidget iksbc = new InterfaceKitPhidget();
        final InterfaceKitPhidget ikr1 = new InterfaceKitPhidget();
       
        try
        {
            //Example of enabling logging.
            //Phidget.enableLogging(Phidget.PHIDGET_LOG_VERBOSE, null);
            System.out.println("System started at " + df.format(cal.getTime()).toString());
            System.out.println(Phidget.getLibraryVersion());
           
            //Attach listeners for the SBC
            iksbc.addAttachListener(new AttachListener()
            {
                @Override
                public void attached(AttachEvent ae)
                {
                        System.out.println("attachment of " + ae);
                }
            });
            iksbc.addDetachListener(new DetachListener()
            {
                @Override
                public void detached(DetachEvent ae)
                {
                        System.out.println("detachment of " + ae);
                }
            });
            iksbc.addErrorListener(new ErrorListener()
            {
                @Override
                public void error(ErrorEvent ee)
                {
                        System.out.println(ee);
                }
            });

            iksbc.open(48071);//TODO: abstract
            System.out.println("waiting for SBC attachment... ");
            iksbc.waitForAttachment(2000);
           
            if (iksbc.isAttached())
            {
                System.out.println(iksbc.getDeviceName() + " is attached.");

                //Attach listeners for the 0/0/4 relay
                ikr1.addAttachListener(new AttachListener()
                {
                    @Override
                    public void attached(AttachEvent ae)
                    {
                            System.out.println("attachment of " + ae);
                    }
                });
               
                ikr1.addDetachListener(new DetachListener()
                {
                    @Override
                    public void detached(DetachEvent ae)
                    {
                            System.out.println("detachment of " + ae);
                    }
                });
               
                ikr1.addErrorListener(new ErrorListener()
                {
                    @Override
                    public void error(ErrorEvent ee)
                    {
                            System.out.println(ee);
                    }
                });
               
                ikr1.addInputChangeListener(new InputChangeListener()
                {
                    @Override
                    public void inputChanged(InputChangeEvent oe)
                    {
                            System.out.println(oe);
                    }
                });
               
                ikr1.addOutputChangeListener(new OutputChangeListener()
                {
                    @Override
                    public void outputChanged(OutputChangeEvent oe)
                    {
                            System.out.println(oe);
                    }
                });

                ikr1.open(108986);//TODO: abstract
                System.out.println("waiting for Relay 1 attachment... ");
                ikr1.waitForAttachment(2000);

                if(ikr1.isAttached())
                {
                    System.out.println(ikr1.getDeviceName() + " is attached.");
                }
                    else
                    {
                        System.err.println(ikr1.getDeviceName() + " cannot be found.");
                        throw new Exception();
                    }

                Thread.sleep(1000);//Why? To catch up?

                iksbc.addInputChangeListener(new InputChangeListener()
                {
                    @Override
                    public void inputChanged(InputChangeEvent oe)
                    {
                        System.out.println(oe);
                        try
                        {
                            if(iksbc.getInputState(1))
                            {
                                iksbc.setOutputState(1, true);
//                                ikr1.setOutputState(0, true);//Intercom
                            }
                                else
                                {
                                    iksbc.setOutputState(1, false);
                                }
                            if(iksbc.getInputState(2))
                            {
                                iksbc.setOutputState(2, true);
                            }
                                else
                                {
                                    iksbc.setOutputState(2, false);
                                }

                            if(iksbc.getInputState(3))
                            {
                                iksbc.setOutputState(3, true);
                            }
                                else
                                {
                                    iksbc.setOutputState(3, false);
                                }

                            if(iksbc.getInputState(4))
                            {
                                iksbc.setOutputState(4, true);
                            }
                                else
                                {
                                    iksbc.setOutputState(4, false);
                                }

                            if(iksbc.getInputState(5))
                            {
                                iksbc.setOutputState(5, true);
                            }
                                else
                                {
                                    iksbc.setOutputState(5, false);
                                }

                            if(iksbc.getInputState(6))
                            {
                                iksbc.setOutputState(6, true);
                            }
                                else
                                {
                                    iksbc.setOutputState(6, false);
                                }
                        }
                        catch (PhidgetException ex)
                        {
                            Logger.getLogger(Switches.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                });

                iksbc.addOutputChangeListener(new OutputChangeListener()
                {
                    @Override
                    public void outputChanged(OutputChangeEvent oe)
                    {
                        System.out.println(oe);
                        try
                        {
                            if(iksbc.getOutputState(1))
                            {
                                ikr1.setOutputState(0, true);//Intercom
                            }
                                else
                                {
                                    ikr1.setOutputState(0, false);//Intercom
                                }

                            if(iksbc.getOutputState(3))
                            {
                                ikr1.setOutputState(1, true);//HAM
                            }
                                else
                                {
                                    ikr1.setOutputState(1, false);//HAM
                                }

                            if(iksbc.getOutputState(5))
                            {
                                ikr1.setOutputState(3, true);//Radar Detector
                            }
                                else
                                {
                                    ikr1.setOutputState(3, false);//Radar Detector
                                }

                            if(iksbc.getOutputState(6))
                            {
                                ikr1.setOutputState(2, true);//Foglights
                            }
                                else
                                {
                                    ikr1.setOutputState(2, false);//Foglights
                                }
                        }
                        catch (PhidgetException ex)
                        {
                            Logger.getLogger(Switches.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                });

            }//End if
            else
            {
                System.err.println(iksbc.getDeviceName() + " cannot be found.");
                throw new Exception();
            }
        }//End try
           
        catch (Exception ex)
        {
            System.err.println("[EXCEPTION] ========================================");
            System.err.println(df.format(cal.getTime()).toString() + ": " + ex.toString());
            System.err.println(ex.getLocalizedMessage().toString());
            System.err.println(ex.getStackTrace().toString());
            System.err.println("====================================================");
        }//End catch
               
        finally
        {
            System.out.println("System down at " + df.format(cal.getTime()).toString());
            System.out.println("All relays off.....");
            for ( int i = 0; i < ikr1.getOutputCount(); i++)
            {
                ikr1.setOutputState(i, false); //Initialize the relay to all false
            }

            for ( int i = 0; i < iksbc.getOutputCount(); i++)
            {
                iksbc.setOutputState(i, false); //Initialize the LEDs to all false
            }
           
            System.out.print("closing...");
                cal = null;
                df = null;
                iksbc.close();
                ikr1.close();

            System.out.println(" closed");
            System.out.print("wait for finalization...");
                System.gc();
            System.out.println("bye");

   }//End finally
    }//End main
}//End class
DJF

David Falkenstein
Cohesive Technology - seamless is everything

User avatar
Patrick
Lead Developer
Posts: 3165
Joined: Mon Jun 20, 2005 8:46 am
Location: Canada
Contact:

Re: Advice requested: What is the best approach to looping?

Postby Patrick » Mon Jul 04, 2011 3:21 pm

Oh, you still need to have your while loop, along with a sleep() to keep cpu usage down - but you don't need to do any work in the loop, it's just there to keep the main thread from exiting and all the work is done in the event threads.

-Patrick

CohesiveTechnology
Phidgetly
Posts: 15
Joined: Sat Jun 11, 2011 6:34 pm
Location: Keene, NH USA
Contact:

Re: Advice requested: What is the best approach to looping?

Postby CohesiveTechnology » Mon Jul 04, 2011 6:58 pm

Oh. Well. That makes sense. Most grateful.
DJF

David Falkenstein
Cohesive Technology - seamless is everything


Return to “Java”

Who is online

Users browsing this forum: No registered users and 1 guest