/*
FaBoFirmwareFragment
Copyright (c) 2014 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.fabo.setting.fragment;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import org.deviceconnect.android.deviceplugin.fabo.R;
import org.deviceconnect.android.deviceplugin.fabo.param.FaBoConst;
import org.deviceconnect.android.deviceplugin.fabo.setting.FaBoSettingActivity;
import java.util.HashMap;
import java.util.Iterator;
import io.fabo.android.stk500.StkWriter;
import io.fabo.android.stk500.StkWriterListenerInterface;
/**
* 設定画面用Fragment.
*
* @author NTT DOCOMO, INC.
*/
public class FaBoFirmwareFragment extends Fragment implements StkWriterListenerInterface {
/** Context. */
private static Context mContext;
/** LOG. */
private static final String TAG = "FABO_PLUGIN_SETTING";
/** Connect button. */
private static Button mButtonConnect;
/** Send button. */
private static Button mButtonSend;
/** Back button. */
private static Button mButtonBack;
/** TextView. */
private static TextView mTextViewCommment;
/** STK500. */
private static StkWriter mStkWriter;
/** Parent activity. */
private static FaBoSettingActivity mParent;
/** Activity. */
private static Activity mActivity;
/**
* newInstance.
*
* @return fragment Fragment instance.
*/
public static FaBoFirmwareFragment newInstance() {
FaBoFirmwareFragment fragment = new FaBoFirmwareFragment();
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Root view.
View root = inflater.inflate(R.layout.firmata, container, false);
// Get context.
mContext = getActivity().getBaseContext();
mActivity = getActivity();
// Get ui component.
mTextViewCommment = (TextView) root.findViewById(R.id.textViewComment);
mButtonConnect = (Button) root.findViewById(R.id.buttonConnect);
mButtonSend = (Button) root.findViewById(R.id.buttonSend);
mButtonBack = (Button) root.findViewById(R.id.buttonBack);
// USBへの接続ボタン
mButtonConnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// FaBoとの接続用のUSBをCloseする.
Intent intent = new Intent(FaBoConst.DEVICE_TO_ARDUINO_CLOSE_USB);
mContext.sendBroadcast(intent);
// ボタンがクリックされた時にUSBを開く.
if (mStkWriter.openUsb()) {
mButtonSend.setVisibility(Button.VISIBLE);
mButtonSend.setEnabled(true);
}
}
});
// 戻るボタン.
mButtonBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// FaBoとの接続用のUSBをCloseする.
Intent intent = new Intent(FaBoConst.DEVICE_TO_ARDUINO_CHECK_USB);
mContext.sendBroadcast(intent);
// 前のページに戻る.
mParent.moveConnectFirmata();
}
});
// Firmwareの送信ボタン
mButtonSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mButtonSend.setEnabled(false);
// Firmwareを転送.
mStkWriter.setData(R.raw.standardfirmata_hex);
mStkWriter.sendFirmware();
}
});
// USBの装着、脱着をReceiverで取得.
IntentFilter filter = new IntentFilter();
filter.addAction(StkWriter.ACTION_USB_PERMISSION);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
getActivity().registerReceiver(mUsbReceiver, filter);
return root;
}
@Override
public void onResume() {
super.onResume();
// SerialPortの生成
mStkWriter = new StkWriter(getActivity().getBaseContext());
mStkWriter.setListener(this);
// USBデバイスのチェック.
UsbManager manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
for (UsbDevice device : deviceList.values()) {
if (device.getVendorId() == 10755) {
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mTextViewCommment.setText(R.string.arduinoorg_find);
mButtonConnect.setEnabled(false);
mButtonSend.setVisibility(Button.INVISIBLE);
mButtonBack.setVisibility(Button.INVISIBLE);
}
});
} else if (device.getVendorId() == 9025) {
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mTextViewCommment.setText(R.string.arduinocc_find_sendfirmware);
mButtonConnect.setEnabled(true);
mButtonSend.setVisibility(Button.INVISIBLE);
mButtonBack.setVisibility(Button.INVISIBLE);
}
});
break;
}
}
}
@Override
public void onPause() {
super.onPause();
// SerialPortを閉じる
mStkWriter.closeUsb();
mStkWriter = null;
try {
getActivity().unregisterReceiver(mUsbReceiver);
}catch (Exception ignored){
}
}
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (StkWriter.ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
}
} else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
// USBを閉じる
mStkWriter.closeUsb();
mTextViewCommment.setText(R.string.disconnect_usb);
mButtonConnect.setEnabled(false);
mButtonSend.setVisibility(Button.INVISIBLE);
mButtonBack.setVisibility(Button.INVISIBLE);
}
}
};
@Override
public void onChangeStatus(int status) {
switch (status) {
case StkWriter.STATUS_USB_INIT:
break;
case StkWriter.STATUS_USB_OPEN:
break;
case StkWriter.STATUS_USB_CONNECT:
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mButtonSend.setVisibility(Button.VISIBLE);
mButtonSend.setEnabled(true);
mButtonConnect.setEnabled(false);
mTextViewCommment.setText(R.string.firmware_usb_find);
}
});
break;
case StkWriter.STATUS_USB_CLOSE:
break;
case StkWriter.STATUS_UART_START:
break;
case StkWriter.STATUS_FIRMWARE_SEND_INIT:
break;
case StkWriter.STATUS_FIRMWARE_SEND_START:
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mTextViewCommment.setText(R.string.firmware_start_send);
}
});
break;
case StkWriter.STATUS_FIRMWARE_SEND_FINISH:
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mStkWriter.closeUsb();
mTextViewCommment.setText(R.string.firmware_success_send);
mButtonBack.setVisibility(Button.VISIBLE);
}
});
break;
}
}
@Override
public void onError(int status) {
switch (status) {
case StkWriter.ERROR_FAILED_CONNECTION:
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mTextViewCommment.setText(R.string.can_not_connet_usb);
mButtonConnect.setEnabled(true);
mButtonSend.setVisibility(Button.INVISIBLE);
}
});
break;
case StkWriter.ERROR_FAILED_OPEN:
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mTextViewCommment.setText(R.string.can_not_open_usb);
mButtonConnect.setEnabled(true);
mButtonSend.setVisibility(Button.INVISIBLE);
}
});
break;
case StkWriter.ERROR_FAILED_SEND_FIRMRARE:
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mTextViewCommment.setText(R.string.failed_send_firmata);
mButtonConnect.setEnabled(true);
mButtonSend.setVisibility(Button.INVISIBLE);
}
});
break;
case StkWriter.ERROR_NO_FOUND_FIRMARE:
break;
case StkWriter.ERROR_NOT_INIT_USB:
break;
case StkWriter.ERROR_NOT_WRITE_UART:
break;
}
}
@Override
public void onAttach(Activity activity) {
mParent = (FaBoSettingActivity) activity;
super.onAttach(activity);
}
}