mirror of
				https://github.com/mik3y/usb-serial-for-android
				synced 2025-10-30 18:07:21 +00:00 
			
		
		
		
	new setBreak() method
This commit is contained in:
		
							parent
							
								
									1e75f91467
								
							
						
					
					
						commit
						768f716600
					
				| @ -141,6 +141,25 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag | |||||||
|         if (id == R.id.clear) { |         if (id == R.id.clear) { | ||||||
|             receiveText.setText(""); |             receiveText.setText(""); | ||||||
|             return true; |             return true; | ||||||
|  |         } else if( id == R.id.send_break) { | ||||||
|  |             if(!connected) { | ||||||
|  |                 Toast.makeText(getActivity(), "not connected", Toast.LENGTH_SHORT).show(); | ||||||
|  |             } else { | ||||||
|  |                 try { | ||||||
|  |                     usbSerialPort.setBreak(true); | ||||||
|  |                     Thread.sleep(100); // should show progress bar instead of blocking UI thread | ||||||
|  |                     usbSerialPort.setBreak(false); | ||||||
|  |                     SpannableStringBuilder spn = new SpannableStringBuilder(); | ||||||
|  |                     spn.append("send <break>\n"); | ||||||
|  |                     spn.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorSendText)), 0, spn.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); | ||||||
|  |                     receiveText.append(spn); | ||||||
|  |                 } catch(UnsupportedOperationException ignored) { | ||||||
|  |                     Toast.makeText(getActivity(), "BREAK not supported", Toast.LENGTH_SHORT).show(); | ||||||
|  |                 } catch(Exception e) { | ||||||
|  |                     Toast.makeText(getActivity(), "BREAK failed: " + e.getMessage(), Toast.LENGTH_SHORT).show(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             return true; | ||||||
|         } else { |         } else { | ||||||
|             return super.onOptionsItemSelected(item); |             return super.onOptionsItemSelected(item); | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -6,4 +6,8 @@ | |||||||
|         android:icon="@drawable/ic_delete_white_24dp" |         android:icon="@drawable/ic_delete_white_24dp" | ||||||
|         android:title="Clear" |         android:title="Clear" | ||||||
|         app:showAsAction="always" /> |         app:showAsAction="always" /> | ||||||
|  |     <item | ||||||
|  |         android:id="@+id/send_break" | ||||||
|  |         android:title="Send BREAK" | ||||||
|  |         app:showAsAction="never" /> | ||||||
| </menu> | </menu> | ||||||
|  | |||||||
| @ -1740,6 +1740,30 @@ public class DeviceTest { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     @Test | ||||||
|  |     public void setBreak() throws Exception { | ||||||
|  |         usb.open(); | ||||||
|  |         telnet.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |         usb.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|  |         doReadWrite(""); | ||||||
|  |         usb.serialPort.setBreak(true); | ||||||
|  |         Thread.sleep(100); | ||||||
|  |         usb.serialPort.setBreak(false); | ||||||
|  |         // RFC2217 has SET_CONTROL + REQ_BREAK_STATE request, but this is not supported by pyserial | ||||||
|  |         // as there is no easy notification on <break> condition. By default break is returned as | ||||||
|  |         // 0 byte on Linux, see https://man7.org/linux/man-pages/man3/termios.3.html -> BRKINT | ||||||
|  |         byte[] data = telnet.read(1); | ||||||
|  |         if (usb.serialDriver instanceof CdcAcmSerialDriver) { | ||||||
|  |             // BREAK forwarding not implemented by arduino_leonardo_bridge.ino | ||||||
|  |             assertThat("<break>", data, equalTo(new byte[]{})); | ||||||
|  |         } else if(isCp21xxRestrictedPort) { | ||||||
|  |             assertThat("<break>", data, equalTo(new byte[]{0x26})); // send the last byte again? | ||||||
|  |         } else { | ||||||
|  |             assertThat("<break>", data, equalTo(new byte[]{0})); | ||||||
|  |         } | ||||||
|  |         doReadWrite(""); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     @Test |     @Test | ||||||
|     public void deviceConnection() throws Exception { |     public void deviceConnection() throws Exception { | ||||||
|         byte[] buf = new byte[256]; |         byte[] buf = new byte[256]; | ||||||
| @ -1813,6 +1837,11 @@ public class DeviceTest { | |||||||
|             } catch (IOException ignored) { |             } catch (IOException ignored) { | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         try { | ||||||
|  |             usb.serialPort.setBreak(true); | ||||||
|  |             fail("setBreak error expected"); | ||||||
|  |         } catch (IOException ignored) { | ||||||
|  |         } | ||||||
|         usb.close(); |         usb.close(); | ||||||
|         try { |         try { | ||||||
|             usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD, UsbWrapper.OpenCloseFlags.NO_DEVICE_CONNECTION)); |             usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD, UsbWrapper.OpenCloseFlags.NO_DEVICE_CONNECTION)); | ||||||
|  | |||||||
| @ -278,6 +278,12 @@ public class CdcAcmSerialDriver implements UsbSerialDriver { | |||||||
|         public EnumSet<ControlLine> getSupportedControlLines() throws IOException { |         public EnumSet<ControlLine> getSupportedControlLines() throws IOException { | ||||||
|             return EnumSet.of(ControlLine.RTS, ControlLine.DTR); |             return EnumSet.of(ControlLine.RTS, ControlLine.DTR); | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public void setBreak(boolean value) throws IOException { | ||||||
|  |             sendAcmControlMessage(SEND_BREAK, value ? 0xffff : 0, null); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static Map<Integer, int[]> getSupportedDevices() { |     public static Map<Integer, int[]> getSupportedDevices() { | ||||||
|  | |||||||
| @ -341,6 +341,25 @@ public class Ch34xSerialDriver implements UsbSerialDriver { | |||||||
| 		public EnumSet<ControlLine> getSupportedControlLines() throws IOException { | 		public EnumSet<ControlLine> getSupportedControlLines() throws IOException { | ||||||
| 			return EnumSet.allOf(ControlLine.class); | 			return EnumSet.allOf(ControlLine.class); | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void setBreak(boolean value) throws IOException { | ||||||
|  | 			byte[] req = new byte[2]; | ||||||
|  | 			if(controlIn(0x95, 0x1805, 0, req) < 0) { | ||||||
|  | 				throw new IOException("Error getting BREAK condition"); | ||||||
|  | 			} | ||||||
|  | 			if(value) { | ||||||
|  | 				req[0] &= ~1; | ||||||
|  | 				req[1] &= ~0x40; | ||||||
|  | 			} else { | ||||||
|  | 				req[0] |= 1; | ||||||
|  | 				req[1] |= 0x40; | ||||||
|  | 			} | ||||||
|  | 			int val = (req[1] & 0xff) << 8 | (req[0] & 0xff); | ||||||
|  | 			if(controlOut(0x9a, 0x1805, val) < 0) { | ||||||
|  | 				throw new IOException("Error setting BREAK condition"); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public static Map<Integer, int[]> getSupportedDevices() { | 	public static Map<Integer, int[]> getSupportedDevices() { | ||||||
|  | |||||||
| @ -264,4 +264,7 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { | |||||||
|         throw new UnsupportedOperationException(); |         throw new UnsupportedOperationException(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     @Override | ||||||
|  |     public void setBreak(boolean value) throws IOException { throw new UnsupportedOperationException(); } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -59,6 +59,7 @@ public class Cp21xxSerialDriver implements UsbSerialDriver { | |||||||
|          */ |          */ | ||||||
|         private static final int SILABSER_IFC_ENABLE_REQUEST_CODE = 0x00; |         private static final int SILABSER_IFC_ENABLE_REQUEST_CODE = 0x00; | ||||||
|         private static final int SILABSER_SET_LINE_CTL_REQUEST_CODE = 0x03; |         private static final int SILABSER_SET_LINE_CTL_REQUEST_CODE = 0x03; | ||||||
|  |         private static final int SILABSER_SET_BREAK_REQUEST_CODE = 0x05; | ||||||
|         private static final int SILABSER_SET_MHS_REQUEST_CODE = 0x07; |         private static final int SILABSER_SET_MHS_REQUEST_CODE = 0x07; | ||||||
|         private static final int SILABSER_SET_BAUDRATE = 0x1E; |         private static final int SILABSER_SET_BAUDRATE = 0x1E; | ||||||
|         private static final int SILABSER_FLUSH_REQUEST_CODE = 0x12; |         private static final int SILABSER_FLUSH_REQUEST_CODE = 0x12; | ||||||
| @ -314,6 +315,10 @@ public class Cp21xxSerialDriver implements UsbSerialDriver { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         @Override | ||||||
|  |         public void setBreak(boolean value) throws IOException { | ||||||
|  |             setConfigSingle(SILABSER_SET_BREAK_REQUEST_CODE, value ? 1 : 0); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static Map<Integer, int[]> getSupportedDevices() { |     public static Map<Integer, int[]> getSupportedDevices() { | ||||||
|  | |||||||
| @ -84,6 +84,7 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|         private boolean baudRateWithPort = false; |         private boolean baudRateWithPort = false; | ||||||
|         private boolean dtr = false; |         private boolean dtr = false; | ||||||
|         private boolean rts = false; |         private boolean rts = false; | ||||||
|  |         private int breakConfig = 0; | ||||||
| 
 | 
 | ||||||
|         public FtdiSerialPort(UsbDevice device, int portNumber) { |         public FtdiSerialPort(UsbDevice device, int portNumber) { | ||||||
|             super(device, portNumber); |             super(device, portNumber); | ||||||
| @ -280,6 +281,7 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|             if (result != 0) { |             if (result != 0) { | ||||||
|                 throw new IOException("Setting parameters failed: result=" + result); |                 throw new IOException("Setting parameters failed: result=" + result); | ||||||
|             } |             } | ||||||
|  |             breakConfig = config; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private int getStatus() throws IOException { |         private int getStatus() throws IOException { | ||||||
| @ -366,7 +368,7 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|                 int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, |                 int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, | ||||||
|                         RESET_PURGE_RX, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); |                         RESET_PURGE_RX, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|                 if (result != 0) { |                 if (result != 0) { | ||||||
|                     throw new IOException("purge write buffer failed: result=" + result); |                     throw new IOException("Purge write buffer failed: result=" + result); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
| @ -374,11 +376,22 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|                 int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, |                 int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, | ||||||
|                         RESET_PURGE_TX, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); |                         RESET_PURGE_TX, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|                 if (result != 0) { |                 if (result != 0) { | ||||||
|                     throw new IOException("purge read buffer failed: result=" + result); |                     throw new IOException("Purge read buffer failed: result=" + result); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         @Override | ||||||
|  |         public void setBreak(boolean value) throws IOException { | ||||||
|  |             int config = breakConfig; | ||||||
|  |             if(value) config |= 0x4000; | ||||||
|  |             int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_DATA_REQUEST, | ||||||
|  |                     config, mPortNumber+1,null, 0, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|  |             if (result != 0) { | ||||||
|  |                 throw new IOException("Setting BREAK failed: result=" + result); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         public void setLatencyTimer(int latencyTime) throws IOException { |         public void setLatencyTimer(int latencyTime) throws IOException { | ||||||
|             int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_LATENCY_TIMER_REQUEST, |             int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_LATENCY_TIMER_REQUEST, | ||||||
|                     latencyTime, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); |                     latencyTime, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); | ||||||
|  | |||||||
| @ -77,6 +77,7 @@ public class ProlificSerialDriver implements UsbSerialDriver { | |||||||
| 
 | 
 | ||||||
|         private static final int SET_LINE_REQUEST = 0x20; // same as CDC SET_LINE_CODING |         private static final int SET_LINE_REQUEST = 0x20; // same as CDC SET_LINE_CODING | ||||||
|         private static final int SET_CONTROL_REQUEST = 0x22; // same as CDC SET_CONTROL_LINE_STATE |         private static final int SET_CONTROL_REQUEST = 0x22; // same as CDC SET_CONTROL_LINE_STATE | ||||||
|  |         private static final int SEND_BREAK_REQUEST = 0x23; // same as CDC SEND_BREAK | ||||||
|         private static final int GET_CONTROL_REQUEST = 0x87; |         private static final int GET_CONTROL_REQUEST = 0x87; | ||||||
|         private static final int STATUS_NOTIFICATION = 0xa1; // similar to CDC SERIAL_STATE but different length |         private static final int STATUS_NOTIFICATION = 0xa1; // similar to CDC SERIAL_STATE but different length | ||||||
| 
 | 
 | ||||||
| @ -492,6 +493,11 @@ public class ProlificSerialDriver implements UsbSerialDriver { | |||||||
|                 vendorOut(FLUSH_TX_REQUEST, 0, null); |                 vendorOut(FLUSH_TX_REQUEST, 0, null); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public void setBreak(boolean value) throws IOException { | ||||||
|  |             ctrlOut(SEND_BREAK_REQUEST, value ? 0xffff : 0, 0, null); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static Map<Integer, int[]> getSupportedDevices() { |     public static Map<Integer, int[]> getSupportedDevices() { | ||||||
|  | |||||||
| @ -248,6 +248,13 @@ public interface UsbSerialPort extends Closeable { | |||||||
|      */ |      */ | ||||||
|     public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException; |     public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException; | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * send BREAK condition. | ||||||
|  |      * | ||||||
|  |      * @param value set/reset | ||||||
|  |      */ | ||||||
|  |     public void setBreak(boolean value) throws IOException; | ||||||
|  | 
 | ||||||
|     /** |     /** | ||||||
|      * Returns the current state of the connection. |      * Returns the current state of the connection. | ||||||
|      */ |      */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user