void wuclass_binary_sensor_update(wuobject_t *wuobject) {
  bool currentValue = 0;
  currentValue = input_get(PINE, 3);

  short *delay;
  delay = wuclass_binary_sensor_getPrivateData(wuobject);

  bool status;
  wkpf_internal_read_property_boolean(wuobject, WKPF_PROPERTY_BINARY_SENSOR_STATUS, &status);

  wkpf_refresh_rate_t refresh_rate;
  wkpf_internal_read_property_refresh_rate(wuobject, WKPF_PROPERTY_BINARY_SENSOR_REFRESH_RATE, &refresh_rate);

  int debounce;
  wkpf_internal_read_property_int16(wuobject, WKPF_PROPERTY_BINARY_SENSOR_DEBOUNCE, &debounce);
  DEBUG_LOG(DBG_WKPFUPDATE, "WKPFUPDATE(BinarySensor): Sensed binary value: %d %d %d %d %x\n", currentValue, *delay, debounce, status, PINE);  
#if 0
  if(debounce < DEBOUNCE_THREASHOLD) { // busy waiting for short debounce
      wkpf_internal_read_property_boolean(wuobject, WKPF_PROPERTY_BINARY_SENSOR_CURRENT_VALUE, &currentValue);
      if(currentValue != status) {
        
      }
      
      break;
    }
  } else {  // check sensed value in every update
void wuclass_xor_gate_update(wuobject_t *wuobject) {
  bool input1, input2, output;

  wkpf_internal_read_property_boolean(wuobject, WKPF_PROPERTY_XOR_GATE_INPUT1, &input1);
  wkpf_internal_read_property_boolean(wuobject, WKPF_PROPERTY_XOR_GATE_INPUT2, &input2);

  output = !input1 != !input2;
  wkpf_internal_write_property_boolean(wuobject, WKPF_PROPERTY_XOR_GATE_OUTPUT, output);
  DEBUG_LOG(DBG_WKPFUPDATE, "WKPFUPDATE(Xor gate): %d xor %d => %d\n", input1, input2, output);
}
void wuclass_light_actuator_update(wuobject_t *wuobject) {
  bool onOff;
  wkpf_internal_read_property_boolean(wuobject, WKPF_PROPERTY_LIGHT_ACTUATOR_ON_OFF, &onOff);


  DARJEELING_PRINTF("WKPFUPDATE(Light): Setting light to: %x\n", onOff);
}
void wuclass_loop_delay_boolean_update(wkpf_local_wuobject *wuobject) {
    bool input;
    bool output;
    int16_t delay;

    wkpf_internal_read_property_boolean(wuobject, WKPF_PROPERTY_LOOP_DELAY_BOOLEAN_INPUT, &input);
    wkpf_internal_read_property_int16(wuobject, WKPF_PROPERTY_LOOP_DELAY_BOOLEAN_DELAY, &delay);
    wkpf_internal_read_property_boolean(wuobject, WKPF_PROPERTY_LOOP_DELAY_BOOLEAN_OUTPUT, &output);

    if(delay_count_boolean>=delay) {
        delay_count_boolean=0;
        wkpf_internal_write_property_boolean(wuobject, WKPF_PROPERTY_LOOP_DELAY_BOOLEAN_OUTPUT, input);
        DEBUGF_WKPFUPDATE("WKPFUPDATE(loop_delay): Native loop_delay: write %x to output \n", input);
    }
    else if(output!=input) {
        delay_count_boolean++;
        DEBUGF_WKPFUPDATE("WKPFUPDATE(loop_delay): Native loop_delay: delay %x, now count to %x\n", delay, delay_count_boolean);
    }
}
void javax_wukong_wkpf_WKPF_boolean_getPropertyBoolean_javax_wukong_wkpf_VirtualWuObject_byte() {
	uint8_t property_number = (uint8_t)dj_exec_stackPopShort();
	dj_object *java_instance_reference = REF_TO_VOIDP(dj_exec_stackPopRef());
	wuobject_t *wuobject;
	wkpf_error_code = wkpf_get_wuobject_by_java_instance_reference(java_instance_reference, &wuobject);
	if (wkpf_error_code == WKPF_OK) {
		bool value;
		wkpf_error_code = wkpf_internal_read_property_boolean(wuobject, property_number, &value);
		dj_exec_stackPushShort(value);
	}
}