Advertisement
Guest User

Untitled

a guest
Feb 24th, 2015
577
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.50 KB | None | 0 0
  1.  
  2. #include <SoftwareSerial.h>
  3.  
  4. #define Rx    10
  5. #define Tx    11
  6. #define BAUD  115200
  7. SoftwareSerial UM7Data(Rx, Tx);
  8.  
  9. int nState = 0;
  10. #define STATE_ZERO         0
  11. #define STATE_S            1
  12. #define STATE_SN           2
  13. #define STATE_SNP          3
  14. #define STATE_PT           4
  15. #define STATE_READ_DATA    5
  16. #define STATE_CHK1         6
  17. #define STATE_CHK0         7
  18. #define STATE_DONE         8
  19.  
  20. #define UM6_GET_DATA 0xAE
  21. #define UM6_QUAT_AB  0x64
  22. #define UM6_QUAT_CD  0x65
  23. #define PT_HAS_DATA  0b10000000
  24. #define PT_IS_BATCH  0b01000000
  25. #define PT_COMM_FAIL 0b00000001
  26.  
  27. #define DATA_BUFF_LEN  16
  28.  
  29. byte aPacketData[DATA_BUFF_LEN];
  30. int n = 0;
  31. byte c = 0;
  32. int nDataByteCount = 0;
  33.  
  34. typedef struct {
  35.   boolean HasData;
  36.   boolean IsBatch;
  37.   byte BatchLength;
  38.   boolean CommFail;
  39.   byte Address;
  40.   byte Checksum1;
  41.   byte Checksum0;
  42.   byte DataLength;
  43. } UM7_PacketStruct ;
  44.  
  45. UM7_PacketStruct UM7_Packet;
  46.  
  47. void setup(){
  48.   UM7Data.begin(BAUD);
  49.   Serial.begin(9600);
  50.   while(!Serial);
  51. // REQUEST FIRMWARE VERSION
  52.   UM7Data.write('s');
  53.   UM7Data.write('n');
  54.   UM7Data.write('p');
  55.   UM7Data.write((byte)0x00);
  56.   UM7Data.write(0xAA); // GET_FW_REVISION register
  57.   UM7Data.write(0x01); // CHECKSUM HIGH BYTE
  58.   UM7Data.write(0xFB); // CHECKSUM LOW BYTE
  59. }
  60.  
  61. void loop(){
  62.  
  63.   n = UM7Data.available();
  64.   if (n > 0){
  65.     c = UM7Data.read();
  66.     Serial.println(c, DEC);
  67.     switch(nState){
  68.       case STATE_ZERO : // Begin. Look for 's'.
  69.         //Serial.print("ZERO ");
  70.         Reset();
  71.         if (c == 's'){ //0x73 = 's'
  72.           nState = STATE_S;
  73.         } else {
  74.           nState = STATE_ZERO;
  75.         }
  76.         break;
  77.       case STATE_S : // Have 's'. Look for 'n'.
  78.         Serial.print("S");
  79.         if (c == 'n'){ //0x6E = 'n'
  80.           nState = STATE_SN;
  81.         } else {
  82.           nState = STATE_ZERO;
  83.         }
  84.         break;
  85.       case STATE_SN : // Have 'sn'. Look for 'p'.
  86.         Serial.print("N");
  87.         if (c == 'p'){ //0x70 = 'p'
  88.           nState = STATE_SNP;
  89.         } else {
  90.           nState = STATE_ZERO;
  91.         }
  92.         break;
  93.       case STATE_SNP : // Have 'snp'. Read PacketType and calculate DataLength.
  94.         Serial.print("P");
  95.         UM7_Packet.HasData = 1 && (c & PT_HAS_DATA);
  96.         UM7_Packet.IsBatch = 1 && (c & PT_IS_BATCH);
  97.         UM7_Packet.BatchLength = ((c >> 2) & 0b00001111);
  98.         UM7_Packet.CommFail = 1 && (c & PT_COMM_FAIL);
  99.         nState = STATE_PT;
  100.         if (UM7_Packet.IsBatch){
  101.           UM7_Packet.DataLength = UM7_Packet.BatchLength * 4;
  102.         } else {
  103.           UM7_Packet.DataLength = 4;
  104.         }
  105.         break;
  106.       case STATE_PT : // Have PacketType. Read Address.
  107.         Serial.println("PACKETBYTE");
  108.         UM7_Packet.Address = c;
  109.         nDataByteCount = 0;
  110.         nState = STATE_READ_DATA;
  111.         break;
  112.       case STATE_READ_DATA : // Read Data. (UM7_PT.BatchLength * 4) bytes.
  113.         Serial.println("READ_DATA");
  114.         aPacketData[nDataByteCount] = c;
  115.         nDataByteCount++;
  116.         if (nDataByteCount >= UM7_Packet.DataLength){
  117.           nState = STATE_CHK1;
  118.         }
  119.         break;
  120.       case STATE_CHK1 : // Read Checksum 1
  121.         Serial.println("CHK1");
  122.         UM7_Packet.Checksum1 = c;
  123.         nState = STATE_CHK0;
  124.         break;
  125.       case STATE_CHK0 : // Read Checksum 0
  126.         Serial.println("CHK0");
  127.         UM7_Packet.Checksum0 = c;
  128.         nState = STATE_DONE;
  129.         break;
  130.       case STATE_DONE : // Entire packet consumed. Process packet
  131.         Serial.println("STATE_DONE");
  132.         ProcessPacket();
  133.         nState = STATE_ZERO;
  134.         break;
  135.       }
  136.     }
  137.     else{ //Serial.println("no data");
  138.     }
  139.   }
  140.  
  141. void ProcessPacket(){
  142. int DataA = 0;
  143. int DataB = 0;
  144. int DataC = 0;
  145. int DataD = 0;
  146.  
  147.   PrintDebug();
  148.   switch(UM7_Packet.Address){
  149.     case UM6_QUAT_AB :
  150.       if (UM7_Packet.HasData && !UM7_Packet.CommFail){
  151.         DataA = (aPacketData[0] << 8) | aPacketData[1];
  152.         DataB = (aPacketData[2] << 8) | aPacketData[3];
  153.         if (UM7_Packet.DataLength > 4){
  154.           DataC = (aPacketData[4] << 8) | aPacketData[5];
  155.           DataD = (aPacketData[6] << 8) | aPacketData[7];
  156.         }
  157.       }
  158.       Serial.print("N = ");
  159.       Serial.print(n,DEC);
  160.       Serial.print(" A = ");
  161.       Serial.print(DataA,DEC);
  162.       Serial.print(" B = ");
  163.       Serial.print(DataB,DEC);
  164.       Serial.print(" C = ");
  165.       Serial.print(DataC,DEC);
  166.       Serial.print(" D = ");
  167.       Serial.print(DataD,DEC);
  168.       Serial.println(".");
  169.       break;
  170.     Serial.println("unknown packet");
  171.   }
  172. }
  173.  
  174. void Reset(){
  175.   UM7_Packet.HasData = false;
  176.   UM7_Packet.IsBatch = false;
  177.   UM7_Packet.BatchLength = 0;
  178.   UM7_Packet.CommFail = false;
  179.   UM7_Packet.Address = 0;
  180.   UM7_Packet.Checksum1 = 0;
  181.   UM7_Packet.Checksum0 = 0;
  182.   UM7_Packet.DataLength = 0;
  183. }
  184.  
  185. void PrintDebug(){
  186. // PT = has_data=1 is_batch=1 batch=0010 (2) res=0 fail=0
  187. // AD = 0x64
  188.   Serial.print("N = ");
  189.   Serial.print(n,DEC);
  190.   Serial.print(" HD = ");
  191.   Serial.print(UM7_Packet.HasData,BIN);
  192.   Serial.print(" IB = ");
  193.   Serial.print(UM7_Packet.IsBatch,BIN);
  194.   Serial.print(" BL = ");
  195.   Serial.print(UM7_Packet.BatchLength,DEC);
  196.   Serial.print(" CF = ");
  197.   Serial.print(UM7_Packet.CommFail,BIN);
  198.   Serial.print(" AD = 0x");
  199.   Serial.print(UM7_Packet.Address,HEX);
  200.   Serial.print(" CS1 = 0x");
  201.   Serial.print(UM7_Packet.Checksum1,HEX);
  202.   Serial.print(" CS0 = 0x");
  203.   Serial.print(UM7_Packet.Checksum0,HEX);
  204.   Serial.print(" DL = ");
  205.   Serial.print(UM7_Packet.DataLength,DEC);
  206.   Serial.println(".");
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement