package com.example.bluno;
import com.example.bluno.BleCmd;
import com.example.bluno.ProgressWheel;
import com.example.bluno.DeviceControlActivity;
import com.larswerkman.colorpicker.ColorPicker;
import com.larswerkman.colorpicker.ColorPicker.OnColorChangedListener;
import android.os.Bundle;
import android.os.Handler;
import android.content.Intent;
import android.graphics.Typeface;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
public class BLUNOActivity extends BlunoLibrary {
public final static String TAG = DeviceControlActivity.class.getSimpleName();
private connectionStateEnum mConnectionState=connectionStateEnum.isNull;
private PlainProtocol mPlainProtocol= new PlainProtocol();
private ProgressWheel progressWheel;
private Typeface txtotf;
private boolean isColorChange=false;
private ImageView titleImageView;
private ImageView ledImage = null;
private ImageView joystickImage = null;
private ImageView PotentiometerImage = null;
private ImageView arduinoinputdispArea = null;
private EditText oledSubmitEditText = null;
private me.imid.view.SwitchButton buzzerSwitch, relaySwitch;
private ImageView oledSubmitButton,oledClearButton;
private TextView analogTextDisp;
private TextView txtTemp;
private TextView txtHumidity;
private ColorPicker picker;
public static final int LEDMode=0;
public static final int RockerMode=1;
public static final int KnobMode=2;
private byte Modestates = LEDMode;
private static Handler receivedHandler = new Handler();
private Runnable PotentiometerRunnable = new Runnable() {
@Override
public void run() {
if(Modestates == KnobMode)
{
serialSend(mPlainProtocol.write(BleCmd.Knob));
System.out.println("update BleCmdReadPotentiometer");
}
receivedHandler.postDelayed(PotentiometerRunnable, 50);
}
};
private Runnable temperatureRunnable = new Runnable() {
@Override
public void run() {
serialSend(mPlainProtocol.write(BleCmd.Temperature));
System.out.println("update temperature");
receivedHandler.postDelayed(temperatureRunnable, 1000);
}
};
private Runnable humidityRunnable = new Runnable() {
@Override
public void run() {
serialSend(mPlainProtocol.write(BleCmd.Humidity));
System.out.println("update humidity");
receivedHandler.postDelayed(humidityRunnable, 1000);
}
};
private boolean isLastSwitchOn=false;
private Runnable colorRunnable = new Runnable() {
@Override
public void run() {
if(Modestates == LEDMode)
{
if(picker.mIsSwitchOn)
{
if(isColorChange || (isLastSwitchOn==false))
{
serialSend(mPlainProtocol.write(BleCmd.RGBLed,
((picker.getColor() & 0x00ff0000)>>16),
((picker.getColor() & 0x0000ff00)>>8),
((picker.getColor() & 0x000000ff)>>0)
));
}
isColorChange=false;
isLastSwitchOn=true;
}else{
if(isLastSwitchOn)
{
serialSend(mPlainProtocol.write(BleCmd.RGBLed,0,0,0));
}
isLastSwitchOn=false;
}
}
// System.out.println("update color");
receivedHandler.postDelayed(colorRunnable, 50);
}
};
public void onSerialReceived(String theString) {
System.out.println("displayData "+theString);
mPlainProtocol.mReceivedframe.append(theString) ;
System.out.print("mPlainProtocol.mReceivedframe:");
System.out.println(mPlainProtocol.mReceivedframe.toString());
while(mPlainProtocol.available())
{
System.out.print("receivedCommand:");
System.out.println(mPlainProtocol.receivedCommand);
if(mPlainProtocol.receivedCommand.equals(BleCmd.Rocker))
{
if(Modestates == RockerMode)
{
System.out.println("received Rocker");
switch(mPlainProtocol.receivedContent[0]){
case 0: //None input
arduinoinputdispArea.setImageResource(R.drawable.inputbutton_none);
break;
case 1: //center button pressed
arduinoinputdispArea.setImageResource(R.drawable.inputbutton_right);
break;
case 2: //up button pressed
arduinoinputdispArea.setImageResource(R.drawable.inputbutton_up);
break;
case 3: //left button pressed
arduinoinputdispArea.setImageResource(R.drawable.inputbutton_left);
break;
case 4: //down button pressed
arduinoinputdispArea.setImageResource(R.drawable.inputbutton_down);
break;
case 5: //right button pressed
arduinoinputdispArea.setImageResource(R.drawable.inputbutton_center);
break;
default:
Log.e(getLocalClassName(), "Unkown joystick state: " + mPlainProtocol.receivedContent[0]);
break;
}
}
}
else if(mPlainProtocol.receivedCommand.equals(BleCmd.Temperature))
{
System.out.println("received Temperature");
txtTemp.setText(mPlainProtocol.receivedContent[0] + "� C");
}
else if(mPlainProtocol.receivedCommand.equals(BleCmd.Humidity)){
System.out.println("received Humidity");
txtHumidity.setText(mPlainProtocol.receivedContent[0] + " %");
}
else if(mPlainProtocol.receivedCommand.equals(BleCmd.Knob)){
System.out.println("received Knob");
float pgPos = mPlainProtocol.receivedContent[0] / 3.75f;//Adjust display value to the angle
progressWheel.setProgress(Math.round(pgPos));
analogTextDisp.setText(String.valueOf(mPlainProtocol.receivedContent[0]));
}
}
}
//configure the buzzer switch and the relay switch
private void controlSwitch() {
buzzerSwitch = (me.imid.view.SwitchButton)this.findViewById(R.id.buzzerSwitch);
buzzerSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
// The toggle is enabled
serialSend(mPlainProtocol.write(BleCmd.Buzzer, 1));
} else {
// The toggle is disabled
serialSend(mPlainProtocol.write(BleCmd.Buzzer, 0));
}
}
});
relaySwitch = (me.imid.view.SwitchButton)this.findViewById(R.id.relaySwitch);
relaySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
// The toggle is enabled
serialSend(mPlainProtocol.write(BleCmd.Relay, 1));
} else {
// The toggle is disabled
serialSend(mPlainProtocol.write(BleCmd.Relay, 0));
}
}
});
}
//configure the oled Submit component
private void oledSubmitEditArea() {
oledSubmitEditText = (EditText) this.findViewById(R.id.editArea);
oledSubmitEditText.setBackgroundResource(R.drawable.edittext);
oledSubmitEditText.setTypeface(txtotf);
//Clear testing text
oledSubmitEditText.setText("");
oledSubmitEditText.setOnEditorActionListener(new OnEditorActionListener(){
@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
serialSend(mPlainProtocol.write(BleCmd.Disp + oledSubmitEditText.getText(), 0,0));
return false;
}
});
oledSubmitButton = (ImageView)this.findViewById(R.id.uploadbutton);
oledSubmitButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i(getLocalClassName(),"oled submit text");
//Note: edit BLE submission function here
serialSend(mPlainProtocol.write(BleCmd.Disp + oledSubmitEditText.getText(), 0,0));
}
});
oledClearButton = (ImageView)this.findViewById(R.id.clearbutton);
// oledClearButton.setOnTouchListener(new OnTouchListener(){
//
// @Override
// public boolean onTouch(View v, MotionEvent event) {
// if(event.getActionMasked() == MotionEvent.ACTION_DOWN)
// {
// if(mBluetoothLeService!= null && mSCharacteristic != null){
// mBleCmd = BleCmd.Relay;
// mSCharacteristic.setValue(mPlainProtocol.write(mBleCmd, 1));
// mBluetoothLeService.writeCharacteristic(mSCharacteristic);
// }
// }
// if(event.getActionMasked() == MotionEvent.ACTION_UP)
// {
// if(mBluetoothLeService!= null && mSCharacteristic != null){
// mBleCmd = BleCmd.Relay;
// mSCharacteristic.setValue(mPlainProtocol.write(mBleCmd, 0));
// mBluetoothLeService.writeCharacteristic(mSCharacteristic);
// }
// }
// return false;
// }
//
// });
oledClearButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i(getLocalClassName(),"Clear Text");
//Clear text after submission
serialSend(mPlainProtocol.write(BleCmd.Disp, 0,0));
oledSubmitEditText.setText("");
}
});
}
//configure the color Picker wheel
private void CreatePicker() {
picker = (ColorPicker) findViewById(R.id.picker);
picker.setOnColorChangedListener(new OnColorChangedListener(){
@Override
public void onColorChanged(int color) {
isColorChange=true;
}
});
}
//configure the font
private void FontConfig() {
// Font path
String fontPath = "fonts/yueregular.otf";
txtTemp = (TextView) findViewById(R.id.tempdisp);
txtHumidity = (TextView) findViewById(R.id.humiditydisp);
txtotf = Typeface.createFromAsset(getAssets(), fontPath);
txtTemp.setTypeface(txtotf);
txtHumidity.setTypeface(txtotf);
analogTextDisp = (TextView) findViewById(R.id.analogTextDisp);
analogTextDisp.setTypeface(txtotf);
}
//configure the Image View switching part in the center of the UI
public void imageConfig(){
ledImage = (ImageView)this.findViewById(R.id.ledbutton);
joystickImage = (ImageView)this.findViewById(R.id.joystickbutton);
PotentiometerImage = (ImageView)this.findViewById(R.id.potbutton);
arduinoinputdispArea = (ImageView)this.findViewById(R.id.pot_input_Area);
ledImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i(getLocalClassName(),v.getDrawableState().toString());
ledImage.setImageResource(R.drawable.led_tab_seleted);
joystickImage.setImageResource(R.drawable.joystick_unselected);
PotentiometerImage.setImageResource(R.drawable.pot_unseleted);
// modeManager area - LED controller mode
picker.setVisibility(View.VISIBLE);
arduinoinputdispArea.setVisibility(View.INVISIBLE);
analogTextDisp.setVisibility(View.INVISIBLE);
Modestates = LEDMode;
progressWheel.setVisibility(View.INVISIBLE);
isLastSwitchOn=false;
if(mConnected)
{
receivedHandler.post(colorRunnable);
receivedHandler.removeCallbacks(PotentiometerRunnable);
}
}
});
joystickImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i(getLocalClassName(),v.getDrawableState().toString());
ledImage.setImageResource(R.drawable.led_tab_unseleted);
joystickImage.setImageResource(R.drawable.joystick_selecte);
PotentiometerImage.setImageResource(R.drawable.pot_unseleted);
// modeManager area - joystick state display Mode
picker.setVisibility(View.INVISIBLE);
arduinoinputdispArea.setImageResource(R.drawable.inputbutton_none);
arduinoinputdispArea.setVisibility(View.VISIBLE);
analogTextDisp.setVisibility(View.INVISIBLE);
// check the testingThread function for the display control code
Modestates = RockerMode;
progressWheel.setVisibility(View.INVISIBLE);
if(mConnectionState==connectionStateEnum.isConnected)
{
receivedHandler.removeCallbacks(colorRunnable);
serialSend(mPlainProtocol.write(BleCmd.RGBLed,0,0,0));
receivedHandler.removeCallbacks(PotentiometerRunnable);
}
}
});
PotentiometerImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i(getLocalClassName(),v.getDrawableState().toString());
ledImage.setImageResource(R.drawable.led_tab_unseleted);
picker.setVisibility(View.INVISIBLE);
joystickImage.setImageResource(R.drawable.joystick_unselected);
PotentiometerImage.setImageResource(R.drawable.pot_selected);
arduinoinputdispArea.setImageResource(R.drawable.potmeter);
arduinoinputdispArea.setVisibility(View.INVISIBLE);
// modeManager area - joystick state display Mode
picker.setVisibility(View.INVISIBLE);
arduinoinputdispArea.setVisibility(View.VISIBLE);
analogTextDisp.setVisibility(View.VISIBLE);
// check the testingThread function for the display control code
Modestates = KnobMode;
//Add-ons progress wheel effect
progressWheel.setVisibility(View.VISIBLE);
//circleBounds.width()/2) + rimWidth + paddingLeft,
//(circleBounds.height()/2) + rimWidth + paddingTop,
//circleRadius
if(mConnectionState==connectionStateEnum.isConnected)
{
receivedHandler.post(PotentiometerRunnable);
receivedHandler.removeCallbacks(colorRunnable);
serialSend(mPlainProtocol.write(BleCmd.RGBLed,0,0,0));
}
}
});
}
//configure the progress Wheel of the Potentiometer
private void progressWheelConfig() {
progressWheel = (ProgressWheel) findViewById(R.id.pw_spinner);
}
//configure the title image which shows the connection state
void titleImageConfig()
{
titleImageView = (ImageView)findViewById(R.id.title_image_view);
titleImageView.setImageResource(R.drawable.title_scan);
titleImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonScanOnClickProcess();
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("BLUNOActivity onCreate");
setContentView(R.layout.activity_bluno);
//set the Baudrate of the Serial port
serialBegin(115200);
onCreateProcess();
imageConfig();
FontConfig();
progressWheelConfig();
titleImageConfig();
CreatePicker();
oledSubmitEditArea();
controlSwitch();
}
@Override
protected void onResume() {
super.onResume();
System.out.println("BlUNOActivity onResume");
onResumeProcess();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// User chose not to enable Bluetooth.
onActivityResultProcess(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onPause() {
super.onPause();
System.out.println("BLUNOActivity onPause");
receivedHandler.removeCallbacks(humidityRunnable);
receivedHandler.removeCallbacks(temperatureRunnable);
receivedHandler.removeCallbacks(colorRunnable);
receivedHandler.removeCallbacks(PotentiometerRunnable);
onPauseProcess();
}
protected void onStop() {
super.onStop();
onStopProcess();
System.out.println("MiUnoActivity onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("MiUnoActivity onDestroy");
onDestroyProcess();
}
@Override
public void onConectionStateChange(connectionStateEnum theConnectionState) {
mConnectionState=theConnectionState;
switch (mConnectionState) {
case isScanning:
titleImageView.setImageResource(R.drawable.title_scanning);
break;
case isConnected:
titleImageView.setImageResource(R.drawable.title_connected);
receivedHandler.post(humidityRunnable);
receivedHandler.post(temperatureRunnable);
switch (Modestates) {
case LEDMode:
receivedHandler.post(colorRunnable);
break;
case RockerMode:
break;
case KnobMode:
receivedHandler.post(PotentiometerRunnable);
break;
default:
break;
}
break;
case isConnecting:
titleImageView.setImageResource(R.drawable.title_connecting);
break;
case isToScan:
titleImageView.setImageResource(R.drawable.title_scan);
receivedHandler.removeCallbacks(humidityRunnable);
receivedHandler.removeCallbacks(temperatureRunnable);
receivedHandler.removeCallbacks(colorRunnable);
receivedHandler.removeCallbacks(PotentiometerRunnable);
break;
default:
break;
}
}
}