|
|
@ -32,6 +32,10 @@ public class RelayController { |
|
|
|
private static final String PWM_FLASH_OUT_2 = "/sys/class/gpio/gpio123/direction"; |
|
|
|
private static final String PWM_FLASH_2 = "/sys/class/gpio/gpio123/value"; |
|
|
|
|
|
|
|
// 第7批设备GPIO路径 |
|
|
|
private static final String PWM_FLASH_OUT_7 = "/sys/class/gpio/gpio88/direction"; |
|
|
|
private static final String PWM_FLASH_7 = "/sys/class/gpio/gpio88/value"; |
|
|
|
|
|
|
|
// GPIO操作命令 |
|
|
|
private static final byte[] OPEN_RELAY = {'1'}; |
|
|
|
private static final byte[] CLOSE_RELAY = {'0'}; |
|
|
@ -52,6 +56,9 @@ public class RelayController { |
|
|
|
// 第七批设备管理器 |
|
|
|
private DeviceType7Manager deviceType7Manager; |
|
|
|
|
|
|
|
// 当前设备类型(5=第6批,6=第7批等) |
|
|
|
private int deviceType = -1; |
|
|
|
|
|
|
|
private RelayController() { |
|
|
|
handler = new Handler(Looper.getMainLooper()); |
|
|
|
} |
|
|
@ -73,12 +80,28 @@ public class RelayController { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 设置设备类型 |
|
|
|
* @param deviceType 设备类型(5=第6批,6=第7批等) |
|
|
|
*/ |
|
|
|
public void setDeviceType(int deviceType) { |
|
|
|
this.deviceType = deviceType; |
|
|
|
LogManager.logInfo(TAG, "设置设备类型: " + deviceType); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获取当前设备类型(需要根据实际情况实现) |
|
|
|
* @return 设备类型 |
|
|
|
*/ |
|
|
|
private String getCurrentPadType() { |
|
|
|
// TODO: 根据设备信息返回正确的类型,这里暂时返回默认 |
|
|
|
return PAD_TYPE_DEFAULT; |
|
|
|
// 根据设备类型返回对应的padType |
|
|
|
if (deviceType == 6) { |
|
|
|
return PAD_TYPE_SEVEN; // deviceType=6表示第7批设备,使用DeviceType7Manager |
|
|
|
} else if (deviceType == 5) { |
|
|
|
return PAD_TYPE_TWO; // deviceType=5表示第6批设备,使用第2批的GPIO路径 |
|
|
|
} else { |
|
|
|
// 其他情况返回默认 |
|
|
|
return PAD_TYPE_DEFAULT; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@ -193,6 +216,33 @@ public class RelayController { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 直接写入GPIO值到文件 |
|
|
|
* @param value 要写入的值 |
|
|
|
* @param valuePath GPIO值文件路径 |
|
|
|
* @return 是否成功 |
|
|
|
*/ |
|
|
|
private boolean writeGpioValueDirect(byte[] value, String valuePath) { |
|
|
|
FileOutputStream fos = null; |
|
|
|
try { |
|
|
|
fos = new FileOutputStream(valuePath); |
|
|
|
fos.write(value); |
|
|
|
LogManager.logInfo(TAG, "GPIO值写入成功: " + valuePath + " -> " + new String(value)); |
|
|
|
return true; |
|
|
|
} catch (IOException e) { |
|
|
|
LogManager.logError(TAG, "GPIO值写入失败: " + valuePath + ", 错误: " + e.getMessage(), e); |
|
|
|
return false; |
|
|
|
} finally { |
|
|
|
if (fos != null) { |
|
|
|
try { |
|
|
|
fos.close(); |
|
|
|
} catch (IOException e) { |
|
|
|
LogManager.logError(TAG, "关闭FileOutputStream失败", e); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 写入GPIO值 |
|
|
|
* @param value 要写入的值 |
|
|
|
* @param padType 设备类型 |
|
|
@ -211,38 +261,19 @@ public class RelayController { |
|
|
|
return success; |
|
|
|
} else { |
|
|
|
// 其他设备使用文件操作 |
|
|
|
FileOutputStream fos = null; |
|
|
|
try { |
|
|
|
String valuePath = PAD_TYPE_TWO.equals(padType) ? PWM_FLASH_2 : PWM_FLASH; |
|
|
|
fos = new FileOutputStream(valuePath); |
|
|
|
fos.write(value); |
|
|
|
String valuePath = PAD_TYPE_TWO.equals(padType) ? PWM_FLASH_2 : PWM_FLASH; |
|
|
|
|
|
|
|
// 第一次尝试 |
|
|
|
if (writeGpioValueDirect(value, valuePath)) { |
|
|
|
return true; |
|
|
|
} catch (Exception e) { |
|
|
|
if (e instanceof IOException) { |
|
|
|
// 如果写入失败,尝试设置GPIO方向后重试 |
|
|
|
LogManager.logWarning(TAG, "GPIO写入失败,尝试设置方向后重试"); |
|
|
|
setGpioDirection(padType); |
|
|
|
try { |
|
|
|
if (fos != null) { |
|
|
|
fos.write(value); |
|
|
|
return true; |
|
|
|
} |
|
|
|
} catch (IOException ioException) { |
|
|
|
LogManager.logError(TAG, "重试写入GPIO值失败", ioException); |
|
|
|
} |
|
|
|
} else { |
|
|
|
LogManager.logError(TAG, "写入GPIO值时发生意外异常", e); |
|
|
|
} |
|
|
|
return false; |
|
|
|
} finally { |
|
|
|
if (fos != null) { |
|
|
|
try { |
|
|
|
fos.close(); |
|
|
|
} catch (IOException e) { |
|
|
|
LogManager.logError(TAG, "关闭FileOutputStream失败", e); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 如果失败,尝试设置GPIO方向后重试 |
|
|
|
LogManager.logWarning(TAG, "GPIO写入失败,尝试设置方向后重试"); |
|
|
|
setGpioDirection(padType); |
|
|
|
|
|
|
|
// 第二次尝试 |
|
|
|
return writeGpioValueDirect(value, valuePath); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -251,7 +282,7 @@ public class RelayController { |
|
|
|
* @return 是否成功 |
|
|
|
*/ |
|
|
|
public boolean openRelay() { |
|
|
|
return openRelay(PAD_TYPE_DEFAULT); |
|
|
|
return openRelay(getCurrentPadType()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@ -275,7 +306,7 @@ public class RelayController { |
|
|
|
* @return 是否成功 |
|
|
|
*/ |
|
|
|
public boolean closeRelay() { |
|
|
|
return closeRelay(PAD_TYPE_DEFAULT); |
|
|
|
return closeRelay(getCurrentPadType()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|