package com.ociweb.grove;

import static com.ociweb.iot.grove.GroveTwig.Button;

import com.ociweb.iot.maker.CommandChannel;
import com.ociweb.iot.maker.DeviceRuntime;
import com.ociweb.iot.maker.Hardware;
import com.ociweb.iot.maker.IoTSetup;
import com.ociweb.iot.maker.Port;
import com.ociweb.gl.api.GreenCommandChannel;

import static com.ociweb.iot.grove.GroveTwig.*;

import static com.ociweb.iot.maker.Port.*;
import static com.ociweb.iot.grove.GroveTwig.*;

import com.ociweb.iot.maker.Hardware;
import com.ociweb.iot.maker.CommandChannel;
import com.ociweb.iot.maker.DeviceRuntime;
import com.ociweb.iot.maker.IoTSetup;
import static com.ociweb.iot.maker.Port.*;

public class IoTApp implements IoTSetup
{
    ///////////////////////
    //Connection constants 
    ///////////////////////
    // // by using constants such as these you can easily use the right value to reference where the sensor was plugged in
      
    private static final Port BUTTON_PORT = D3;
	//private static final Port LED_PORT    = D4;
    private static final Port RELAY_PORT  = D7;
    //private static final Port LIGHT_SENSOR_PORT= A2;
	private static final Port BUZZER_PORT = D8;

    @Override
    public void declareConnections(Hardware c) {
        ////////////////////////////
        //Connection specifications
        ///////////////////////////
        
        // // specify each of the connections on the harware, eg which component is plugged into which connection.        
              
        c.connect(Button, BUTTON_PORT); 
        c.connect(Relay, RELAY_PORT);         
        //c.connect(LightSensor, LIGHT_SENSOR_PORT); 
        //c.connect(LED, LED_PORT);        
        c.useI2C();
        c.connect(Buzzer, BUZZER_PORT);
        
    }


    @Override
    public void declareBehavior(DeviceRuntime runtime) {
        //////////////////////////////
        //Specify the desired behavior
        //////////////////////////////
        
        //  //Use lambdas or classes and add listeners to the runtime object
        //  //CommandChannels are created to send outgoing events to the hardware
        //  //CommandChannels must never be shared between two lambdas or classes.
        //  //A single lambda or class can use mulitiple CommandChannels for cuoncurrent behavior
        
        
                final CommandChannel channel1 = runtime.newCommandChannel(GreenCommandChannel.DYNAMIC_MESSAGING);
        //        //this digital listener will get all the button press and un-press events 
                runtime.addDigitalListener((port, connection, time, value)->{ 
        //            
        //            //connection could be checked but unnecessary since we only have 1 digital source
        //         
                	if (port == D3){
	                   if (channel1.setValue(RELAY_PORT, value)) {
	        //                //keep the relay on or off for 1 second before doing next command
	                       // channel1.block(RELAY_PORT, 1000); 
	                	   channel1.setValue(BUZZER_PORT, value);
	                   }
	                   System.out.println(value);
                	}
                });
    }
        
  
}

@@ -23,910 +23,172 @@
 ve;%0A
-%0Aimport static com.ociweb.iot.grove.GroveTwig.Button;%0A%0Aimport com.ociweb.iot.maker.CommandChannel;%0Aimport com.ociweb.iot.maker.DeviceRuntime;%0Aimport com.ociweb.iot.maker.Hardware;%0Aimport com.ociweb.iot.maker.IoTSetup;%0Aimport com.ociweb.iot.maker.Port;%0Aimport com.ociweb.gl.api.GreenCommandChannel;%0A%0Aimport static com.ociweb.iot.grove.GroveTwig.*;%0A%0Aimport static com.ociweb.iot.maker.Port.*;%0Aimport static com.ociweb.iot.grove.GroveTwig.*;%0A%0Aimport com.ociweb.iot.maker.Hardware;%0Aimport com.ociweb.iot.maker.CommandChannel;%0Aimport com.ociweb.iot.maker.DeviceRuntime;%0Aimport com.ociweb.iot.maker.IoTSetup;%0Aimport static com.ociweb.iot.maker.Port.*;%0A%0Apublic class IoTApp implements IoTSetup%0A%7B%0A    ///////////////////////%0A    //Connection constants %0A    ///////////////////////%0A    // // by using constants such as these you can easily use the right value to reference where the sensor was plugged in%0A      
+import com.ociweb.iot.maker.*;%0Aimport static com.ociweb.iot.grove.GroveTwig.*;%0Aimport static com.ociweb.iot.maker.Port.*;%0A%0Apublic class IoTApp implements IoTSetup%0A%7B
 %0A   
@@ -236,55 +236,8 @@
 D3;%0A
-%09//private static final Port LED_PORT    = D4;%0A
     
@@ -288,60 +288,8 @@
     
-//private static final Port LIGHT_SENSOR_PORT= A2;%0A%09
 priv
@@ -404,461 +404,87 @@
     
-////////////////////////////%0A        //Connection specifications%0A        ///////////////////////////%0A        %0A        // // specify each of the connections on the harware, eg which component is plugged into which connection.        %0A              %0A        c.connect(Button, BUTTON_PORT); %0A        c.connect(Relay, RELAY_PORT);         %0A        //c.connect(LightSensor, LIGHT_SENSOR_PORT); %0A        //c.connect(LED, LED_PORT);        %0A        c.useI2C();
+c.connect(Button, BUTTON_PORT); %0A        c.connect(Relay, RELAY_PORT);         
 %0A   
@@ -524,25 +524,15 @@
 T);%0A
-        %0A
     %7D%0A%0A
-%0A
     
@@ -604,498 +604,9 @@
 %7B%0A  
-      //////////////////////////////%0A        //Specify the desired behavior%0A        //////////////////////////////%0A        %0A        //  //Use lambdas or classes and add listeners to the runtime object%0A        //  //CommandChannels are created to send outgoing events to the hardware%0A        //  //CommandChannels must never be shared between two lambdas or classes.%0A        //  //A single lambda or class can use mulitiple CommandChannels for cuoncurrent behavior%0A        %0A        %0A        
+%0A
     
@@ -671,28 +671,8 @@
 nel(
-GreenCommandChannel.
 DYNA
@@ -699,731 +699,277 @@
     
-//        //this digital listener will get all the button press and un-press events %0A                runtime.addDigitalListener((port, connection, time, value)-%3E%7B %0A        //            %0A        //            //connection could be checked but unnecessary since we only have 1 digital source%0A        //         %0A                %09if (port == D3)%7B%0A%09                   if (channel1.setValue(RELAY_PORT, value)) %7B%0A%09        //                //keep the relay on or off for 1 second before doing next command
+runtime.addDigitalListener((port, connection, time, value)-%3E%7B %0A    %09    channel1.setValueAndBlock(BUZZER_PORT, value == 1, 500);//500 is the time in milliseconds that any
 %0A%09    
-                   // channel1.block(RELAY_PORT, 1000); %0A%09                %09   channel1.setValue(BUZZER_PORT, value);%0A%09                   %7D%0A%09                   System.out.println(value);%0A                %09%7D%0A   
+channel1.setValueAndBlock(RELAY_PORT, value ==1, 500);  //further action is blocked %0A
         
     
@@ -964,21 +964,16 @@
         
-     
 %7D);%0A    
@@ -978,18 +978,6 @@
   %7D%0A
-        %0A  %0A
 %7D%0A

Create IoTApp.java