Subversion Repositories HomeAutomation

Rev

Rev 450 | Rev 1634 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. using System.Threading;
  2. using System;
  3.  
  4. public class CanNMT {
  5.     private const byte CAN_NMT              = 0x00;
  6.    
  7.     private const byte CAN_NMT_RESET        = 0x04;
  8.     private const byte CAN_NMT_BIOS_START   = 0x08;
  9.     private const byte CAN_NMT_PGM_START    = 0x0C;
  10.     private const byte CAN_NMT_PGM_DATA     = 0x10;
  11.     private const byte CAN_NMT_PGM_END      = 0x14;
  12.     private const byte CAN_NMT_PGM_COPY     = 0x18;
  13.     private const byte CAN_NMT_PGM_ACK      = 0x1C;
  14.     private const byte CAN_NMT_PGM_NACK     = 0x20;
  15.     private const byte CAN_NMT_START_APP    = 0x24;
  16.     private const byte CAN_NMT_APP_START    = 0x28;
  17.     private const byte CAN_NMT_HEARTBEAT    = 0x2C;
  18.  
  19.     CanPacket cp;
  20.     private bool running = false;
  21.    
  22.     public CanNMT() {
  23.         cp = new CanPacket();
  24.         cp.setExt(1);
  25.     }
  26.  
  27.     public CanNMT(CanPacket cp) {
  28.         this.cp = cp;
  29.         this.cp.setExt(1);
  30.     }
  31.    
  32.     public byte getSender() {
  33.         return (byte)((cp.getId()>>8)&0xFF);
  34.     }
  35.    
  36.     public bool isNMTPacket() {
  37.         if (((cp.getId()>>24)&0xFF) == 0) {
  38.             return true;
  39.         }
  40.         return false;
  41.     }
  42.  
  43.     public byte getType() {
  44.         return (byte)((cp.getId()>>16)&0xFF);
  45.     }
  46.    
  47.     public byte getReceiver() {
  48.         return (byte)((cp.getId()>>0)&0xFF);
  49.     }
  50.    
  51.     public void setSender(byte id) {
  52.         cp.setId( ( ( cp.getId()&0x00FF00FF )|((uint)id<<8) ) );
  53.     }
  54.     public void setReceiver(byte id) {
  55.         cp.setId( ( ( cp.getId()&0x00FFFF00 )|((uint)id) ) );
  56.     }
  57.    
  58.     public CanPacket getResetPacket() {
  59.         cp.setId( ( cp.getId()&0x0000FFFF )|( CAN_NMT_RESET<<16 ) );
  60.         cp.setDataLength(0);
  61.         return cp;
  62.     }
  63.  
  64.     public CanPacket getStartPacket() {
  65.         cp.setId( ( cp.getId()&0x0000FFFF )|( CAN_NMT_START_APP<<16 ) );
  66.         cp.setDataLength(0);
  67.         return cp;
  68.     }
  69.  
  70.     public CanPacket getPgmStartPacket(byte[] data) {
  71.         cp.setId( ( cp.getId()&0x0000FFFF )|( CAN_NMT_PGM_START<<16 ) );
  72.         cp.setData(data);
  73.         cp.setDataLength(4);
  74.         return cp;
  75.     }
  76.  
  77.     public CanPacket getPgmDataPacket(byte[] data, byte datalen) {
  78.         cp.setId( ( cp.getId()&0x0000FFFF )|( CAN_NMT_PGM_DATA<<16 ) );
  79.         cp.setData(data);
  80.         cp.setDataLength(datalen);
  81.         return cp;
  82.     }
  83.  
  84.     public CanPacket getPgmEndPacket() {
  85.         cp.setId( ( cp.getId()&0x0000FFFF )|( CAN_NMT_PGM_END<<16 ) );
  86.         cp.setDataLength(0);
  87.         return cp;
  88.     }
  89.  
  90.     public CanPacket getPgmCopyPacket(byte[] data) {
  91.         cp.setId( ( cp.getId()&0x0000FFFF )|( CAN_NMT_PGM_COPY<<16 ) );
  92.         cp.setData(data);
  93.         cp.setDataLength(6);
  94.         return cp;
  95.     }
  96.    
  97.     public bool isBiosStart(CanPacket cp, byte sender) {
  98.         bool returnval = false;
  99.         uint id = cp.getId();
  100.         if ((id&0x00FF0000) == (CAN_NMT_BIOS_START<<16) && (id&0x0000FF00) == (sender<<8)) {
  101.             returnval = true;
  102.             byte[] data = cp.getData();
  103.             string appinfo = "Application installed";
  104.             if (data[2] == 0) {
  105.                 appinfo = "No application installed";
  106.             }
  107.             Console.WriteLine("Bios started on node 0x" + String.Format("{0:x2}", sender) +
  108.                                 ", bios version 0x" + String.Format("{0:x2}", data[1]) + String.Format("{0:x2}", data[0]) +
  109.                                 ", " + appinfo
  110.                                 );
  111.         }
  112.         return returnval;
  113.     }
  114.  
  115.     public bool doStart(DaemonConnection dc, byte receiver) {
  116.         return doStart(dc, receiver, 0);
  117.     }
  118.    
  119.     public bool doStart(DaemonConnection dc, byte receiver, byte sender) {
  120.         bool success = true;
  121.        
  122.         setReceiver(receiver);
  123.         dc.sendCanPacket(getStartPacket());
  124.         return success;
  125.     }
  126.  
  127.     public bool doReset(DaemonConnection dc, byte receiver) {
  128.         return doReset(dc, receiver, 0);
  129.     }
  130.    
  131.     public bool doReset(DaemonConnection dc, byte receiver, byte sender) {
  132.         bool success = false;
  133.        
  134.         setReceiver(receiver);
  135.         dc.sendCanPacket(getResetPacket());
  136.         CanPacket getcp;
  137.         running = true;
  138.         dc.flushData();
  139.         for (int i = 0; i < 150; i++) {
  140.             Thread.Sleep(50);
  141.             if (dc.getData(out getcp)) {
  142.                 if (isBiosStart(getcp, receiver)) {
  143.                     success = true;
  144.                     break;
  145.                 }
  146.             }
  147.            
  148.             if (!running) {
  149.                 break;
  150.             }
  151.         }
  152.         if (!success) {
  153.             Console.WriteLine("Timed out while waiting for node to reset");
  154.         }
  155.         return success;
  156.     }
  157.    
  158.     public void stop() {
  159.         running = false;
  160.     }
  161.    
  162. }
  163.