void wuclass_math_update(wuobject_t *wuobject) {
  int16_t input1;
  int16_t input2;
  int16_t input3;
  int16_t input4;
  int16_t op;
  int16_t output = 0;
  int16_t remainder = 0;

  wkpf_internal_read_property_int16(wuobject, WKPF_PROPERTY_MATH_OP_INPUT1, &input1);
  wkpf_internal_read_property_int16(wuobject, WKPF_PROPERTY_MATH_OP_INPUT2, &input2);
  wkpf_internal_read_property_int16(wuobject, WKPF_PROPERTY_MATH_OP_INPUT3, &input3);
  wkpf_internal_read_property_int16(wuobject, WKPF_PROPERTY_MATH_OP_INPUT4, &input4);
  wkpf_internal_read_property_int16(wuobject, WKPF_PROPERTY_MATH_OP_OPERATOR, &op);

  if(op==WKPF_ENUM_MATH_OP_OPERATOR_MAX) {
		if ( (input1>=input2) && (input1>=input3) && (input1>=input4))
			output=input1;
		else if ( (input2>=input1) && (input2>=input3) && (input2>=input4))
			output=input2;
		else if ( (input3>=input1) && (input3>=input2) && (input3>=input4))
			output=input3;
		else if ( (input4>=input1) && (input4>=input2) && (input4>=input3))
			output=input4;
		remainder=0;
  } else if(op==WKPF_ENUM_MATH_OP_OPERATOR_MIN) {
	  	if ( (input1<=input2) && (input1<=input3) && (input1<=input4))
			output=input1;
		else if ( (input2<=input1) && (input2<=input3) && (input2<=input4))
			output=input2;
		else if ( (input3<=input1) && (input3<=input2) && (input3<=input4))
			output=input3;
		else if ( (input4<=input1) && (input4<=input2) && (input4<=input3))
			output=input4;
		remainder=0;
  } else if(op==WKPF_ENUM_MATH_OP_OPERATOR_AVG) {
		output=(input1+input2+input3+input4)/4;
		remainder=0;
  } else if(op==WKPF_ENUM_MATH_OP_OPERATOR_ADD) {
		output=input1+input2+input3+input4;
		remainder=0;
  } else if(op==WKPF_ENUM_MATH_OP_OPERATOR_SUB) {	// input1-input2
		output=input1-input2;
		remainder=0;
  } else if(op==WKPF_ENUM_MATH_OP_OPERATOR_MULTIPLY) {
		output=input1*input2*input3*input4;
		remainder=0;
  } else if(op==WKPF_ENUM_MATH_OP_OPERATOR_DIVIDE) {	// input1/input2
		if(input2==0)
			DEBUG_LOG(DBG_WKPFUPDATE, "WKPFUPDATE(math): divide by 0 Error ");
	    output=input1/input2;
		remainder=input1%input2;
  }

    wkpf_internal_write_property_int16(wuobject, WKPF_PROPERTY_MATH_OP_OUTPUT, output);
	wkpf_internal_write_property_int16(wuobject, WKPF_PROPERTY_MATH_OP_REMAINDER, remainder);
    DEBUG_LOG(DBG_WKPFUPDATE, "WKPFUPDATE(math): Native math: input1 %x input2 %x input3 %x input4 %x operator %x-> output %x remainder %x\n", input1, input2, input3, input4, op, output, remainder);
}
void wuclass_logical_update(wuobject_t *wuobject) {
  bool input1;
  bool input2;
  bool input3;
  bool input4;
  int16_t op;

  wkpf_internal_read_property_boolean(wuobject, WKPF_PROPERTY_LOGICAL_INPUT1, &input1);
  wkpf_internal_read_property_boolean(wuobject, WKPF_PROPERTY_LOGICAL_INPUT2, &input2);
  wkpf_internal_read_property_boolean(wuobject, WKPF_PROPERTY_LOGICAL_INPUT3, &input3);
  wkpf_internal_read_property_boolean(wuobject, WKPF_PROPERTY_LOGICAL_INPUT4, &input4);
  wkpf_internal_read_property_int16(wuobject, WKPF_PROPERTY_LOGICAL_OPERATOR, &op);

	if ( ((input1 && input2 && input3 && input4) && op==WKPF_ENUM_LOGICAL_OPERATOR_AND) ||
		 ((input1 || input2 || input3 || input4) && op==WKPF_ENUM_LOGICAL_OPERATOR_OR) ||
		 ((input1 == false) && op==WKPF_ENUM_LOGICAL_OPERATOR_NOT) ||//only not input1
		 ((input1 ^ input2 ^ input3 ^ input4) && op==WKPF_ENUM_LOGICAL_OPERATOR_XOR) ) {
    wkpf_internal_write_property_boolean(wuobject, WKPF_PROPERTY_LOGICAL_OUTPUT, true);
    DEBUG_LOG(DBG_WKPFUPDATE, "WKPFUPDATE(logical): Native logical: input1 %x input2 %x input3 %x input4 %x operator %x-> TRUE\n", input1, input2, input3, input4, op);
  }
	else {
    wkpf_internal_write_property_boolean(wuobject, WKPF_PROPERTY_LOGICAL_OUTPUT, false);
    DEBUG_LOG(DBG_WKPFUPDATE, "WKPFUPDATE(logical): Native logical: input1 %x input2 %x input3 %x input4 %x operator %x-> FALSE\n", input1, input2, input3, input4, op);
  }
}
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_light_sensor_update(wuobject_t *wuobject) {
	// Rotate through values 0 to 255 in steps of 10
	int16_t value;
	wkpf_internal_read_property_int16(wuobject, WKPF_PROPERTY_LIGHT_ACTUATOR_ON_OFF, &value);
	value += 10;
	value %= 256;
	DEBUG_LOG(DBG_WKPFUPDATE, "WKPFUPDATE(Light sensor): 'Sensed' dummy value: %d\n", value);
	wkpf_internal_write_property_int16(wuobject, WKPF_PROPERTY_LIGHT_SENSOR_CURRENT_VALUE, value);
}
void wuclass_threshold_update(wkpf_local_wuobject *wuobject) {
  int16_t operator;
  int16_t threshold;
  int16_t value;

  wkpf_internal_read_property_int16(wuobject, WKPF_PROPERTY_THRESHOLD_OPERATOR, &operator);
  wkpf_internal_read_property_int16(wuobject, WKPF_PROPERTY_THRESHOLD_THRESHOLD, &threshold);
  wkpf_internal_read_property_int16(wuobject, WKPF_PROPERTY_THRESHOLD_VALUE, &value);

	if (((operator == OPERATOR_GT || operator == WKPF_ENUM_THRESHOLD_OPERATOR_GTE) && value > threshold)
	 || ((operator == OPERATOR_LT || operator == WKPF_ENUM_THRESHOLD_OPERATOR_LTE) && value < threshold)
	 || ((operator == OPERATOR_GTE || operator == WKPF_ENUM_THRESHOLD_OPERATOR_LTE) && value == threshold)) {
    wkpf_internal_write_property_boolean(wuobject, WKPF_PROPERTY_THRESHOLD_OUTPUT, TRUE);
    DEBUGF_WKPFUPDATE("WKPFUPDATE(Threshold): Native threshold: operator %x threshold %x value %x -> TRUE\n", operator, threshold, value);
  }
	else {
    wkpf_internal_write_property_boolean(wuobject, WKPF_PROPERTY_THRESHOLD_OUTPUT, FALSE);
    DEBUGF_WKPFUPDATE("WKPFUPDATE(Threshold): Native threshold: operator %x threshold %x value %x -> FALSE\n", operator, threshold, value);
  }
}
void javax_wukong_wkpf_WKPF_short_getPropertyShort_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) {
		int16_t value;
		wkpf_error_code = wkpf_internal_read_property_int16(wuobject, property_number, &value);
		dj_exec_stackPushShort(value);
	}
}
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);
    }
}