Subversion Repositories HomeAutomation

Rev

Rev 434 | Blame | Last modification | View Log | SVN | RSS feed

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.IO.Ports;
  5. using System.Net;
  6. using System.Net.Sockets;
  7.  
  8. public class SerialConnection {
  9.     const byte DEBUG_LEVEL = 3; //0, 1, 2, 3
  10.    
  11.     public const byte UART_START_BYTE = 253;
  12.     public const byte UART_END_BYTE = 250;
  13.     public const int PACKET_LENGTH = 17;
  14.     private const int readBufferSize = 8192;
  15.     public const byte UART_CONN_BYTE = 252;
  16.    
  17.     private Socket udpserver = null;
  18.     private IPEndPoint iep = null;
  19.     private string remoteIP = null;
  20.     private int remotePort = 1100;
  21.    
  22.     private SerialPort serial_conn = null;
  23.     private byte[] iBuff = new byte[8192];
  24.     private int iBuffPointer = 0;
  25.    
  26.     public SerialConnection() {  }
  27.    
  28.     public bool open() {
  29.         if (serial_conn != null) {
  30.             if (!serial_conn.IsOpen) serial_conn.Open();
  31.             return true;
  32.         } else if (udpserver != null) {
  33.             return true;
  34.         } else {
  35.             return false;
  36.         }
  37.     }
  38.    
  39.     public bool close() {
  40.         if (serial_conn != null) {
  41.             if (serial_conn.IsOpen) serial_conn.Close();
  42.             return true;
  43.         } else if (udpserver != null) {
  44.             udpserver.Close();
  45.             return true;
  46.         } else {
  47.             return false;
  48.         }
  49.        
  50.     }
  51.    
  52.     public bool isOpen() {
  53.         if (serial_conn != null) {
  54.             return serial_conn.IsOpen;
  55.         } else if (udpserver != null) {
  56.             return true;
  57.         } else {
  58.             return false;
  59.         }
  60.     }
  61.    
  62.     public void setConfiguration(int baudRate, Parity parity, string portName, StopBits stopbits, int databits, bool rtsEnable) {
  63.         if (DEBUG_LEVEL>1) { Console.WriteLine("Connecting to target..."); }
  64.        
  65.         if (!portName.Contains("/udp")) {
  66.             try {
  67.                 serial_conn = new SerialPort();
  68.                 serial_conn.ReadBufferSize = readBufferSize;
  69.                 serial_conn.BaudRate = baudRate;
  70.                 serial_conn.Parity = parity;
  71.                 serial_conn.PortName = portName;
  72.                 serial_conn.StopBits = stopbits;
  73.                 serial_conn.DataBits = databits;
  74.                 serial_conn.RtsEnable = rtsEnable;
  75.                 if (DEBUG_LEVEL>1) { Console.WriteLine("Serial port opened to target"); }
  76.                 if (DEBUG_LEVEL>1) { Console.WriteLine("Establishing serial connection to target"); }
  77.                 byte[] bytes = new byte[1];
  78.                 bytes[0] = UART_CONN_BYTE;
  79.                 //... ...
  80.                
  81.                
  82.             }
  83.             catch (Exception e) {
  84.                 throw e;
  85.             }
  86.         } else {
  87.             try {
  88.                 string[] splitted = portName.Split('/');
  89.                 if (splitted.Length == 4) {
  90.                     if (splitted[0] == "" && splitted[1] == "udp") {
  91.                         remoteIP = splitted[2];
  92.                         remotePort = Int32.Parse(splitted[3]);
  93.                         iep = new IPEndPoint(IPAddress.Any, remotePort);
  94.                         udpserver = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  95.                         udpserver.Bind(iep);
  96.                        
  97.                         if (DEBUG_LEVEL>1) { Console.WriteLine("Establishing UDP connection to target"); }
  98.                         byte[] bytes = new byte[1];
  99.                         bytes[0] = UART_CONN_BYTE;
  100.                         udpserver.SendTo(bytes, bytes.Length, SocketFlags.None, new IPEndPoint(IPAddress.Parse(remoteIP), remotePort));
  101.                        
  102.                         //... här ska man vänta på svar från servern ...
  103.                        
  104.                         if (DEBUG_LEVEL>1) { Console.WriteLine("UDP connection established to target"); }
  105.                     }
  106.                 }
  107.                
  108.             } catch (Exception e) {
  109.                 throw e;
  110.             }
  111.         }
  112.     }
  113.    
  114.     public bool writePacket(CanPacket cp) {
  115.         if (serial_conn != null) {
  116.             if (serial_conn.IsOpen) {
  117.                 byte[] bytes = new byte[PACKET_LENGTH];
  118.                 Array.Copy(cp.getBytes(), 0, bytes, 1, PACKET_LENGTH - 2);
  119.                 bytes[0] = UART_START_BYTE;
  120.                 bytes[PACKET_LENGTH - 1] = UART_END_BYTE;
  121.                 serial_conn.Write(bytes, 0, PACKET_LENGTH);
  122.                 return true;
  123.             }
  124.             return false;
  125.         } else if (udpserver != null) {
  126.             byte[] bytes = new byte[PACKET_LENGTH];
  127.             Array.Copy(cp.getBytes(), 0, bytes, 1, PACKET_LENGTH - 2);
  128.             bytes[0] = UART_START_BYTE;
  129.             bytes[PACKET_LENGTH - 1] = UART_END_BYTE;
  130.            
  131.             udpserver.SendTo(bytes, bytes.Length, SocketFlags.None, new IPEndPoint(IPAddress.Parse(remoteIP), remotePort));
  132.             return true;
  133.         } else {
  134.             return false;
  135.         }
  136.     }
  137.    
  138.     public bool getPacket(out CanPacket cp) {
  139.         cp = null;
  140.         if ((serial_conn != null) || (udpserver != null)) {
  141.            
  142.             if (serial_conn != null) {
  143.                 int bytesToRead = serial_conn.BytesToRead;
  144.                 if (bytesToRead > 0) {
  145.                     byte[] data = new byte[bytesToRead];
  146.                    
  147.                     try {
  148.                         serial_conn.Read(data, 0, data.Length);
  149.                     } catch (Exception e) {
  150.                         Console.WriteLine("Exception " + e + " occured\n");
  151.                     }
  152.                    
  153.                     Array.Copy(data, 0, iBuff, iBuffPointer, data.Length);
  154.                     iBuffPointer += bytesToRead;
  155.                 }
  156.             } else if (udpserver != null) {
  157.                 int bytesToRead = udpserver.Available;
  158.                 if (udpserver.Available > 0) {
  159.                     byte[] data = new byte[bytesToRead];
  160.                     try {
  161.                         EndPoint tmpRemote = (EndPoint)iep;
  162.                         udpserver.ReceiveFrom(data, ref tmpRemote);
  163.                     } catch (Exception e) {
  164.                         Console.WriteLine("Exception " + e + " occured\n");
  165.                     }
  166.                    
  167.                     int bytestomove = data.Length;
  168.                     if (bytestomove ==18) {
  169.                         bytestomove = data.Length -1;
  170.                     }
  171.                     Array.Copy(data, 0, iBuff, iBuffPointer, bytestomove);
  172.                     iBuffPointer += bytestomove;
  173.                 }
  174.                
  175.             }
  176.            
  177.             // N�r array st�rre eller lika med PACKET_LENGTH...
  178.             while (iBuffPointer >= PACKET_LENGTH) {
  179.                 int startIndex = 0;
  180.                
  181.                 // S�k igenom efter start byte fr�n b�rjan.
  182.                 for (int i = 0; i < iBuffPointer; i++) {
  183.                     // Poppa alla bytes som inte �r startbyte.
  184.                     if (iBuff[i] != UART_START_BYTE) startIndex++;
  185.                     else {
  186.                         // N�r startbyte hittas, kolla om �terst�ende l�ngd �r st�rre eller lika med PACKET_LENGTH (inkl startbyte)
  187.                         if ((iBuffPointer - startIndex) >= PACKET_LENGTH) {
  188.                             //om s�, kolla PACKET_LENGTH-1 byte fram.
  189.                             if (iBuff[startIndex + PACKET_LENGTH - 1] == UART_END_BYTE) {
  190.                                 // Om byte PACKET_LENGTH-1 �r slutbyte s� extraktas startIndex till slutbyteindex.
  191.                                 CanPacket cm = new CanPacket(iBuff, (uint)startIndex + 1);
  192.                                 // S�tt ny startindex och avsluta loop.
  193.                                 startIndex += PACKET_LENGTH;
  194.                                 cp = cm;
  195.                                 // och i slutet g�ra en array copy.
  196.                                 // Flytta ner allt efter slutbyte till index 0 i array.
  197.                                 Array.Copy(iBuff, startIndex, iBuff, 0, iBuffPointer - PACKET_LENGTH);
  198.                                 iBuffPointer -= startIndex;
  199.                                
  200.                                 return true;
  201.                             }
  202.                         }
  203.                     }
  204.                 }
  205.                 // och i slutet g�ra en array copy.
  206.                 // Flytta ner allt efter slutbyte till index 0 i array.
  207.                 Array.Copy(iBuff, startIndex, iBuff, 0, iBuffPointer - PACKET_LENGTH);
  208.                 iBuffPointer -= startIndex;
  209.             }
  210.             return false;
  211.            
  212.         } else {
  213.             return false;
  214.         }
  215.     }
  216.  
  217. }
  218.