Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.77 KB | None | 0 0
  1. #define LED_PIN 13 // (Arduino is 13, Teensy is 11, Teensy++ is 6)
  2.  
  3. // packet structure for InvenSense teapot demo
  4. // 0x12 - START
  5. // 0x13 - END
  6. // 0x7D - escape character
  7. //uint8_t teapotPacket[14] = { 0x12, 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', 0x13 };
  8. const int DEFAULT_OUTGOING_PACKET_SIZE = 30;
  9. uint8_t dataPacket[DEFAULT_OUTGOING_PACKET_SIZE * 2];
  10.  
  11. bool requestToSend = false;
  12.  
  13. ////// Reading Incoming SerialPort Related Varables /////////
  14. const int DEFAULT_INCOMING_PACKET_SIZE = 12;
  15.  
  16. bool previouslyFoundSTART = false;
  17. bool previouslyFoundESCAPE = false;
  18. bool previouslyFoundEND = false;
  19.  
  20. int incomingPacketByteIndex = 0;
  21. uint8_t incomingPacketArrayBytes[DEFAULT_INCOMING_PACKET_SIZE];
  22.  
  23. #define INCOMING_PACKET_START_INDEX 0
  24. #define INCOMING_PACKET_END_INDEX (DEFAULT_INCOMING_PACKET_SIZE-1)
  25. #define INCOMING_PACKET_COMMAND_INDEX 1
  26. //////////////////////////////////////////////////////////////
  27.  
  28. const unsigned long BAUD_RATE = 250000;//115200;
  29.  
  30. int status_D5;
  31. int status_D6;
  32. int status_D7;
  33. int status_D8;
  34. int status_D9;
  35. int status_D10;
  36. int status_D11;
  37. int status_D12;
  38. int status_D13;
  39.  
  40. int status_D22;
  41.  
  42. //int a0_value;
  43.  
  44. void setup() {
  45. // initialize serial communication
  46. Serial.begin(BAUD_RATE);
  47. while (!Serial); // wait for Leonardo enumeration, others continue immediately
  48. while (Serial.available() && Serial.read());
  49. delay(1000);
  50.  
  51. // configure LED for output
  52. pinMode(15, OUTPUT);
  53. //pinMode(16, OUTPUT);
  54. //pinMode(17, OUTPUT);
  55. //pinMode(LED_PIN, OUTPUT);
  56.  
  57. pinMode(5, INPUT_PULLUP);
  58. pinMode(6, INPUT_PULLUP);
  59. pinMode(7, INPUT_PULLUP);
  60. pinMode(8, INPUT_PULLUP);
  61. pinMode(9, INPUT_PULLUP);
  62. pinMode(10, INPUT_PULLUP);
  63. pinMode(11, INPUT_PULLUP);
  64. pinMode(12, INPUT_PULLUP);
  65. pinMode(13, INPUT_PULLUP);
  66.  
  67. pinMode(22, INPUT_PULLUP);
  68.  
  69. //pinMode(A0, INPUT);
  70. }
  71.  
  72. // ================================================================
  73. // === MAIN PROGRAM LOOP ===
  74. // ================================================================
  75.  
  76. void loop() {
  77.  
  78. FillDataPacket();
  79. delay(10);
  80. }
  81.  
  82. void serialEvent() {
  83. ////////////////////////////////////////////////////////////////////////////////////
  84. while (Serial.available()) {
  85. int b = Serial.read();
  86.  
  87. //check the START of a packet
  88. if (b == 0x12) {
  89. //clear the packet
  90. for (int i = 0; i < DEFAULT_INCOMING_PACKET_SIZE; i++) incomingPacketArrayBytes[i] = 0;
  91.  
  92. incomingPacketArrayBytes[incomingPacketByteIndex++] = b;
  93. previouslyFoundSTART = true;
  94. }//check the ESCAPE flag
  95. else if (b == 0x7D && previouslyFoundSTART) {
  96. if (previouslyFoundESCAPE == false) {
  97. previouslyFoundESCAPE = true;
  98. }
  99. else {
  100. incomingPacketArrayBytes[incomingPacketByteIndex++] = b;
  101. previouslyFoundESCAPE = false;
  102. }
  103. }//check the END of a packet
  104. else if (b == 0x13 && previouslyFoundSTART)
  105. {
  106. if (previouslyFoundESCAPE == false) {
  107. incomingPacketArrayBytes[incomingPacketByteIndex++] = b;
  108.  
  109. previouslyFoundEND = true;
  110. previouslyFoundSTART = false;
  111. //break the while loop, proceed to process the packet below
  112. break;
  113. }
  114. else {
  115. previouslyFoundESCAPE = false;
  116. incomingPacketArrayBytes[incomingPacketByteIndex++] = b;
  117. }
  118. }//the DATA block
  119. else
  120. {
  121. if (previouslyFoundESCAPE == false) {
  122. incomingPacketArrayBytes[incomingPacketByteIndex++] = b;
  123. }
  124. else {
  125. previouslyFoundESCAPE = false;
  126. incomingPacketArrayBytes[incomingPacketByteIndex++] = b;
  127. }
  128. }
  129. }
  130. ////////////////////////////////////////////////////////////////////////////////////
  131.  
  132. //Processing the packet information
  133. if (previouslyFoundEND && incomingPacketByteIndex == DEFAULT_INCOMING_PACKET_SIZE) {
  134. previouslyFoundEND = false;
  135. incomingPacketByteIndex = 0;
  136.  
  137. //Request to send the MPU6050 data
  138. if (incomingPacketArrayBytes[INCOMING_PACKET_COMMAND_INDEX] == 0x01) {
  139.  
  140. SendPacket();
  141.  
  142. if (incomingPacketArrayBytes[2] == 0x03) {
  143. if (incomingPacketArrayBytes[3] & 0x01) digitalWrite(15, HIGH); else digitalWrite(15, LOW);
  144. /*if (incomingPacketArrayBytes[3] & 0x02) digitalWrite(11, HIGH); else digitalWrite(11, LOW);
  145. if (incomingPacketArrayBytes[3] & 0x04) digitalWrite(12, HIGH); else digitalWrite(12, LOW);
  146. if (incomingPacketArrayBytes[3] & 0x08) digitalWrite(13, HIGH); else digitalWrite(13, LOW);*/
  147. /*if (incomingPacketArrayBytes[4] & 0x01) digitalWrite(15, HIGH); else digitalWrite(15, LOW);
  148. if (incomingPacketArrayBytes[5] & 0x01) digitalWrite(15, HIGH); else digitalWrite(15, LOW);
  149. if (incomingPacketArrayBytes[6] & 0x01) digitalWrite(15, HIGH); else digitalWrite(15, LOW);
  150. if (incomingPacketArrayBytes[7] & 0x01) digitalWrite(15, HIGH); else digitalWrite(15, LOW);
  151. if (incomingPacketArrayBytes[8] & 0x01) digitalWrite(15, HIGH); else digitalWrite(15, LOW);
  152. if (incomingPacketArrayBytes[9] & 0x01) digitalWrite(15, HIGH); else digitalWrite(15, LOW);*/
  153. }
  154.  
  155. }
  156. else if (incomingPacketArrayBytes[INCOMING_PACKET_COMMAND_INDEX] == 0x02) {
  157.  
  158.  
  159. }
  160. }
  161. else {
  162. //Something wrong, the packet is incomplete, discard it (ignore it).
  163. previouslyFoundSTART = false;
  164. previouslyFoundESCAPE = false;
  165. previouslyFoundEND = false;
  166. incomingPacketByteIndex = 0;
  167. }
  168. }
  169.  
  170. void FillDataPacket() {
  171.  
  172. dataPacket[2] = 0;
  173. dataPacket[3] = 0;
  174. dataPacket[4] = 0;
  175. dataPacket[5] = 0;
  176. dataPacket[6] = 0;
  177. dataPacket[7] = 0;
  178. dataPacket[8] = 0;
  179. dataPacket[9] = 0;
  180.  
  181. dataPacket[10] = 0;
  182.  
  183. dataPacket[11] = 0;
  184. dataPacket[12] = 0;
  185. dataPacket[13] = 0;
  186. dataPacket[14] = 0;
  187. dataPacket[15] = 0;
  188. dataPacket[16] = 0;
  189.  
  190. dataPacket[17] = 0;
  191. dataPacket[18] = 0;
  192. dataPacket[19] = 0;
  193. dataPacket[20] = 0;
  194. dataPacket[21] = 0;
  195. dataPacket[22] = 0;
  196.  
  197. /////////////////////////////////////////////////////
  198. uint8_t digitalPinStatus = 0x00;
  199. uint8_t digitalPinStatus_2 = 0x00;
  200.  
  201. status_D5 = digitalRead(5); //bit 0
  202. status_D6 = digitalRead(6); //bit 1
  203. status_D7 = digitalRead(7); //bit 2
  204. status_D8 = digitalRead(8); //bit 3
  205. status_D9 = digitalRead(9); //bit 4
  206. status_D10 = digitalRead(10); //bit 5
  207. status_D11 = digitalRead(11); //bit 6
  208. status_D12 = digitalRead(12); //bit 7
  209. status_D13 = digitalRead(13); //bit 1_2
  210.  
  211. status_D22 = digitalRead(22); //bit 2_2
  212.  
  213.  
  214. digitalPinStatus = status_D5 == HIGH ? digitalPinStatus & B11111110 : digitalPinStatus | B00000001;
  215. digitalPinStatus = status_D6 == HIGH ? digitalPinStatus & B11111101 : digitalPinStatus | B00000010;
  216. digitalPinStatus = status_D7 == HIGH ? digitalPinStatus & B11111011 : digitalPinStatus | B00000100;
  217. digitalPinStatus = status_D8 == HIGH ? digitalPinStatus & B11110111 : digitalPinStatus | B00001000;
  218. digitalPinStatus = status_D9 == HIGH ? digitalPinStatus & B11101111 : digitalPinStatus | B00010000;
  219. digitalPinStatus = status_D10 == HIGH ? digitalPinStatus & B11011111 : digitalPinStatus | B00100000;
  220. digitalPinStatus = status_D11 == HIGH ? digitalPinStatus & B10111111 : digitalPinStatus | B01000000;
  221. digitalPinStatus = status_D12 == HIGH ? digitalPinStatus & B01111111 : digitalPinStatus | B10000000;
  222. digitalPinStatus_2 = status_D13 == HIGH ? digitalPinStatus_2 & B11111110 : digitalPinStatus_2 | B00000001;
  223.  
  224. digitalPinStatus_2 = status_D22 == HIGH ? digitalPinStatus_2 & B11111101 : digitalPinStatus_2 | B00000010;
  225.  
  226. dataPacket[23] = digitalPinStatus;
  227. dataPacket[24] = digitalPinStatus_2;
  228. /////////////////////////////////////////////////////
  229.  
  230. /////////////////////////////////////////////////////
  231. //a0_value = analogRead(A0);
  232. //dataPacket[24] = (uint8_t)(a0_value >> 8);
  233. //dataPacket[25] = (uint8_t)(a0_value);
  234. /////////////////////////////////////////////////////
  235. }
  236.  
  237. void SendPacket() {
  238. //////////////////////////////////////////////////////////////////////////////////////////
  239. //////////////// SET the packet values ////////////////
  240. //Set the START byte
  241. dataPacket[0] = 0x12;
  242. //Set the END byte
  243. dataPacket[DEFAULT_OUTGOING_PACKET_SIZE - 1] = 0x13;
  244.  
  245. ///////// Assign packet data values ///////////////
  246. dataPacket[1] = DEFAULT_OUTGOING_PACKET_SIZE;
  247. FillDataPacket();
  248. ////////////////////////////////////////////////////////
  249.  
  250.  
  251. ///////// Check special character inside the data blocks ///////////////
  252. //Check the array's data elements if it contains the START, END, or ESCAPE
  253. int addMoreBytes = 0;
  254.  
  255. for (int i = 1; i < DEFAULT_OUTGOING_PACKET_SIZE - 1; i++) {
  256. if (dataPacket[i] == 0x12 || dataPacket[i] == 0x13 || dataPacket[i] == 0x7D) {
  257. addMoreBytes++;
  258. }
  259. }
  260. //If the array content contains the special value i.e., START, END, or ESCAPE.
  261. //It has to be escaped.
  262. int newPacketSize = DEFAULT_OUTGOING_PACKET_SIZE + addMoreBytes;
  263. if (addMoreBytes > 0) {
  264. //Copy dataPacket array values to tmp array
  265. uint8_t tmpDataPacket[DEFAULT_OUTGOING_PACKET_SIZE];
  266. for (int i = 0; i < DEFAULT_OUTGOING_PACKET_SIZE; i++) {
  267. tmpDataPacket[i] = dataPacket[i];
  268. }
  269.  
  270. dataPacket[0] = 0x12; //START
  271. //dataPacket[newPacketSize - 1] = 0x13; //END
  272. dataPacket[1] = newPacketSize; // packet size data block
  273. int newPacketIndex = 1;
  274. for (int i = 1; i < DEFAULT_OUTGOING_PACKET_SIZE - 1; i++)
  275. {
  276. if (tmpDataPacket[i] == 0x12 || tmpDataPacket[i] == 0x13 || tmpDataPacket[i] == 0x7D) {
  277. dataPacket[newPacketIndex] = 0x7D;
  278. dataPacket[newPacketIndex + 1] = tmpDataPacket[i];
  279. newPacketIndex += 2;
  280. }
  281. else {
  282. dataPacket[newPacketIndex++] = tmpDataPacket[i];
  283. }
  284. }
  285. dataPacket[newPacketIndex] = 0x13;
  286. }
  287. //////////////////////////////////////////////////////////////////
  288.  
  289. //Send data via Serial port
  290. Serial.write(dataPacket, newPacketSize);
  291. Serial.flush();
  292. //////////////////////////////////////////////////////////////////////////////////////////
  293. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement