package com.example.serial;
|
import androidx.activity.EdgeToEdge;
|
import androidx.appcompat.app.AppCompatActivity;
|
import android.os.Bundle;
|
import android.text.method.ScrollingMovementMethod;
|
import android.util.Log;
|
import android.view.View;
|
import android.widget.AdapterView;
|
import android.widget.ArrayAdapter;
|
import android.widget.Button;
|
import android.widget.EditText;
|
import android.widget.Spinner;
|
import android.widget.TextView;
|
import android.widget.Toast;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
import java.util.TimeZone;
|
|
public class CanActivity extends AppCompatActivity {
|
private volatile boolean receiving = false;
|
private Thread receiveThread;
|
|
private String data; // 存放发送的数据
|
private String canId;
|
private String dlc;
|
private String canName;
|
private String status = "send";
|
|
private Button mBtnSend;
|
private Button mBtnRecv;
|
private Button mBtnSendClear;
|
private Button mBtnRecvClear;
|
private TextView mTvSend;
|
private TextView mTvRecv;
|
private EditText mEdId;
|
private EditText mEdDlc;
|
private EditText mEdData;
|
private Spinner mSpCan;
|
private Spinner mSpBit;
|
|
private CanControl canControl = new CanControl();
|
|
|
@Override
|
protected void onCreate(Bundle savedInstanceState) {
|
super.onCreate(savedInstanceState);
|
EdgeToEdge.enable(this);
|
setContentView(R.layout.activity_can);
|
|
mBtnSend = findViewById(R.id.can_send);
|
mBtnRecv = findViewById(R.id.can_recv);
|
mBtnSendClear = findViewById(R.id.can_send_clear);
|
mBtnRecvClear = findViewById(R.id.can_recv_clear);
|
mTvSend = findViewById(R.id.can_tv_send);
|
mTvRecv = findViewById(R.id.can_tv_recv);
|
mEdId = findViewById(R.id.can_ed_id);
|
mEdDlc = findViewById(R.id.can_ed_dlc);
|
mEdData = findViewById(R.id.can_ed_data);
|
mSpCan = findViewById(R.id.sp_can);
|
|
mTvSend.setMovementMethod(ScrollingMovementMethod.getInstance());
|
mTvRecv.setMovementMethod(ScrollingMovementMethod.getInstance());
|
|
|
ArrayAdapter<CharSequence> adapter_name;
|
adapter_name = ArrayAdapter.createFromResource(CanActivity.this, R.array.can_name, android.R.layout.simple_spinner_item);
|
adapter_name.setDropDownViewResource(android.R.layout.simple_spinner_item);
|
mSpCan.setAdapter(adapter_name);
|
mSpCan.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
@Override
|
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
canName = getResources().getStringArray(R.array.can_name)[position];
|
}
|
|
@Override
|
public void onNothingSelected(AdapterView<?> parent) {
|
}
|
});
|
|
|
setListener();
|
|
|
}
|
|
private void setListener() {
|
OnClick onClick = new OnClick();
|
mBtnRecv.setOnClickListener(onClick);
|
mBtnRecvClear.setOnClickListener(onClick);
|
mBtnSend.setOnClickListener(onClick);
|
mBtnSendClear.setOnClickListener(onClick);
|
}
|
|
private class OnClick implements View.OnClickListener {
|
public void onClick(View v) {
|
int id = v.getId();
|
if (id == R.id.can_send) {
|
status = "send";
|
if (canName == null){
|
Toast.makeText(CanActivity.this, "请选择CAN!", Toast.LENGTH_SHORT).show();
|
}
|
canId = mEdId.getText().toString();
|
dlc = mEdDlc.getText().toString();
|
data = mEdData.getText().toString();
|
if (Integer.parseInt(canId) > 0xFFF || Integer.parseInt(canId) < 0x000) {
|
Toast.makeText(CanActivity.this, "请输入正确的ID!", Toast.LENGTH_SHORT).show();
|
}else if (Integer.parseInt(dlc) > 7 || Integer.parseInt(canId) < 0){
|
Toast.makeText(CanActivity.this, "请输入正确的DLC!", Toast.LENGTH_SHORT).show();
|
}else {
|
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
df.setTimeZone(TimeZone.getTimeZone("GMT+8"));
|
String date = df.format(new Date());
|
int rv = canControl.sendMessage(canId, dlc, data, canName);
|
if (rv < 0) {
|
Log.e("Send", "Send failed");
|
Toast.makeText(CanActivity.this, "发送失败,检查网络是否连接!", Toast.LENGTH_SHORT).show();
|
}else {
|
mTvSend.post(() -> {
|
String sendData = date + "\t" + "ID=" + canId + " DLC=" + dlc + " Data=" + data;
|
String currentText = mTvSend.getText().toString();
|
String newText = currentText + "\n" + sendData; // 追加新数据
|
mTvSend.append("\n" + sendData);
|
});
|
}
|
}
|
} else if (id == R.id.can_send_clear) {
|
mTvSend.setText("");
|
} else if (id == R.id.can_recv) {
|
if (canName == null){
|
Toast.makeText(CanActivity.this, "请选择CAN!", Toast.LENGTH_SHORT).show();
|
}
|
status = "recv";
|
startReceiving();
|
} else if (id == R.id.can_recv_clear) {
|
status = "stopRecv";
|
mTvRecv.setText("");
|
}
|
}
|
}
|
public void startReceiving() {
|
receiving = true;
|
Log.d("TAG", "startReceiving: "+status);
|
receiveThread = new Thread(() -> {
|
Log.d("TAG", "startReceiving: "+status);
|
while (status.equals("recv")) {
|
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
df.setTimeZone(TimeZone.getTimeZone("GMT+8"));
|
String date = df.format(new Date());
|
String buf = canControl.receiveMessage(canName);
|
if (buf == null) {
|
Log.e("Recv", "Receive failed");
|
}
|
Log.d("Recv", buf);
|
mTvRecv.post(() -> {
|
String revData = date + "\t" + buf;
|
String currentText = mTvRecv.getText().toString();
|
String newText = currentText + "\n" + revData; // 追加新数据
|
mTvRecv.setText(newText);
|
});
|
try {
|
Thread.sleep(10); // 每 10 ms 读取一次数据
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
}
|
});
|
receiveThread.start();
|
}
|
}
|