Advertisement
Guest User

Untitled

a guest
Jun 25th, 2018
400
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.76 KB | None | 0 0
  1.  
  2. /*
  3. +-----+
  4. +----[PWR]-------------------| USB |--+
  5. | +-----+ |
  6. | GND/RST2 [ ][ ] |
  7. | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | C5
  8. | 5V/MISO2 [ ][ ] A4/SDA[ ] | C4
  9. | AREF[ ] |
  10. | GND[ ] |
  11. | [ ]N/C SCK/13[ ] | B5 //usb BT
  12. | [ ]IOREF MISO/12[ ] | . //usb BT
  13. | [ ]RST MOSI/11[ ]~| . //usb BT
  14. | [ ]3V3 +---+ 10[ ]~| .
  15. | [ ]5v -| A |- 9[ ]~| .
  16. | [ ]GND -| R |- 8[ ] | B0
  17. | [ ]GND -| D |- |
  18. | [ ]Vin -| U |- 7[ ] | D7
  19. | -| I |- 6[ ]~| .
  20. | [ ]A0 -| N |- 5[ ]~| .
  21. | [ ]A1 -| O |- 4[ ] | .
  22. | [ ]A2 +---+ INT1/3[ ]~| .
  23. | [ ]A3 INT0/2[ ] | .
  24. | [ ]A4/SDA RST SCK MISO TX>1[ ] | .
  25. | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | D0
  26. | [ ] [ ] [ ] |
  27. | UNO_R3 GND MOSI 5V ____________/
  28. \_______________________/
  29. */
  30.  
  31. #include <PS4BT.h>
  32. #include <usbhub.h>
  33. #ifdef dobogusinclude
  34. #include <spi4teensy3.h>
  35. #endif
  36. #include <SPI.h>
  37. //routines//
  38. typedef void (*PFUNC) (void);
  39. PFUNC myfuncs[] = {&routine1, &routine2, &routine3, &routine4, &routine5, &routine6 ,&routine7};
  40. #define CNT_PFUNCS (sizeof(myfuncs)/sizeof(myfuncs[0]))
  41. uint8_t ifunc = 0;
  42. bool Qstop1 = true;
  43. bool Qstop2 = true;
  44. bool playmode = false;
  45. bool playing = true;
  46. bool enabled = false;
  47. //routines end//
  48. //stepper//
  49. #define DIR_PIN 4 //stepper one = x
  50. #define STEP_PIN 3
  51. #define ENABLE_PIN 5
  52. int step_speed = 500;
  53. //new stepper stuff
  54. #define STEP_HIGH PORTD |= 0b00001000;
  55. #define STEP_LOW PORTD &= ~0b00001000;
  56. #define TIMER1_INTERRUPTS_ON TIMSK1 |= (1 << OCIE1A);
  57. #define TIMER1_INTERRUPTS_OFF TIMSK1 &= ~(1 << OCIE1A);
  58. unsigned int c0;
  59.  
  60. volatile int dir = 0;
  61. volatile unsigned int maxSpeed = 500;
  62. volatile unsigned long n = 0;
  63. volatile float d;
  64. volatile unsigned long stepCount = 0;
  65. volatile unsigned long rampUpStepCount = 0;
  66. volatile unsigned long totalSteps = 0;
  67. volatile int stepPosition = 0;
  68. volatile bool movementDone = false;
  69. //stepper end//
  70. USB Usb;
  71. BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
  72. //PS4BT PS4(&Btd, PAIR); //use this to pair with new device
  73. PS4BT PS4(&Btd); //use this to keep link and uncomment the pair line of code above.
  74. bool printAngle, printTouch;
  75. uint8_t oldL2Value, oldR2Value;
  76. // _
  77. // ___ ___| |_ _ _ _ __
  78. /// __|/ _ \ __| | | | '_ \
  79. //\__ \ __/ |_| |_| | |_) |
  80. //|___/\___|\__|\__,_| .__/
  81. // |_|
  82. void setup() {
  83. Serial.begin(115200);
  84.  
  85. #if !defined(__MIPSEL__)
  86. while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
  87. #endif
  88. if (Usb.Init() == -1) {
  89. Serial.print(F("\r\nOSC Aint workin"));
  90. while(1); // Halt
  91. }
  92. Serial.print(F("\r\nPS4 Bluetooth workin Well\n\n"));
  93. Serial.println("Please press the playstation button to connect\n\n");
  94. Serial.print("Waiting..");delay(700); Serial.print("for no reason apparantly!.."); delay(500); Serial.print("...");delay(200);Serial.print(".");delay(500);Serial.print("..");delay(500);Serial.print(".....");
  95. Serial.println("\nButton layout is as follows:");
  96. Serial.println(" optionsB = key-map");
  97. Serial.println("optionsB + left or right = changes current mode.");
  98. Serial.println(" optionsB + up or down = changes stepper speed.");
  99. Serial.println(" optionsB + cross = enter current mode.");
  100. Serial.println(" optionsB + circle = enables/disables stepper");
  101. Serial.println(" optionsB + share = playmode shows all sensor and button info,same button to exit");
  102. Serial.println(" triangleB = exits current mode playing / note: disables all motors.");
  103. //stepper//
  104. pinMode(STEP_PIN, OUTPUT);
  105. pinMode(DIR_PIN, OUTPUT);
  106. pinMode(ENABLE_PIN, OUTPUT);
  107. // digitalWrite(ENABLE_PIN, HIGH); //is off high || low is on
  108. noInterrupts();
  109. TCCR1A = 0;
  110. TCCR1B = 0;
  111. TCNT1 = 0;
  112. OCR1A = 1000;
  113. TCCR1B |= (1 << WGM12);
  114. TCCR1B |= ((1 << CS11) | (1 << CS10));
  115. interrupts();
  116. c0 = 1600; //2000 * sqrt( 1 ) * 0.67703;
  117. // stepper//
  118. }
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125. ISR(TIMER1_COMPA_vect)
  126. {
  127. if ( stepCount < totalSteps ) {
  128. STEP_HIGH
  129. STEP_LOW
  130. stepCount++;
  131. stepPosition += dir;
  132. }
  133. else {
  134. movementDone = true;
  135. TIMER1_INTERRUPTS_OFF
  136. }
  137.  
  138. if ( rampUpStepCount == 0 ) { // ramp up phase
  139. n++;
  140. d = d - (2 * d) / (4 * n + 1);
  141. if ( d <= maxSpeed ) {
  142. d = maxSpeed;
  143. rampUpStepCount = stepCount;
  144. }
  145. if ( stepCount >= totalSteps / 2 ) {
  146. rampUpStepCount = stepCount;
  147. }
  148. }
  149. else if ( stepCount >= totalSteps - rampUpStepCount ) { // ramp down phase
  150. n--;
  151. d = (d * (4 * n + 1)) / (4 * n + 1 - 2);
  152. }
  153.  
  154. OCR1A = d;
  155. }
  156.  
  157.  
  158.  
  159. void moveNSteps(int steps) {
  160.  
  161. digitalWrite(DIR_PIN, steps < 0 ? HIGH : LOW);
  162. dir = steps > 0 ? 1 : -1;
  163. totalSteps = abs(steps);
  164. d = c0;
  165. OCR1A = d;
  166. stepCount = 0;
  167. n = 0;
  168. rampUpStepCount = 0;
  169. movementDone = false;
  170.  
  171. TIMER1_INTERRUPTS_ON
  172. }
  173. void moveToPosition(int p, bool wait = true) {
  174. moveNSteps(p - stepPosition);
  175. while ( wait && ! movementDone );
  176. }
  177. void Movecount(){
  178. int count = 0;
  179. while ( !movementDone ) {
  180. if ( count > 3 ) {
  181. movementDone = true;
  182. TIMER1_INTERRUPTS_OFF
  183. }
  184. else {
  185. Serial.print(count++);
  186. Serial.print(" ");
  187. Serial.println( stepPosition );
  188. delay(500);
  189. }
  190. }
  191.  
  192. Serial.println("Finished.");
  193. Serial.println( stepPosition );
  194. while (true);
  195. }
  196.  
  197.  
  198. // _
  199. //| | ___ ___ _ __
  200. //| |/ _ \ / _ \| '_
  201. //| | (_) | (_) | |_) |
  202. //|_|\___/ \___/| .__/
  203. // |_|
  204. void loop() {
  205. checkconection();
  206. Usb.Task();
  207. routselect();
  208. freeplay();
  209. // Movecount();
  210. }
  211.  
  212. // int count = 0;
  213. // while ( !movementDone ) {
  214. // if ( count > 3 ) {
  215. // movementDone = true;
  216. // TIMER1_INTERRUPTS_OFF
  217. // }
  218. // else {
  219. // Serial.print(count++);
  220. // Serial.print(" ");
  221. // Serial.println( stepPosition );
  222. // delay(500);
  223. // }
  224. // }
  225.  
  226.  
  227.  
  228.  
  229. // _ _ _ _
  230. // ___| |__ ___ ___ | | __ ___ ___ _ __ _ __ ___ ___| |_(_) ___ _ __
  231. // / __| '_ \ / _ \/ __ | |/ / __/ _ \| '_ \| '_ \ / _ \/ __| __| |/ _ \| '_
  232. //| (__| | | | __/ (__ | < (_| (_) | | | | | | | __/ (__| |_| | (_) | | | |
  233. // \___|_| |_|\___|\___ |_|\_ps4\___\___/|_| |_|_| |_|\___|\___|\__|_|\___/|_| |_|
  234. void checkconection(){
  235. if (PS4.connected() && Qstop1 == true){
  236. Serial.println("\nBT-ps4-connected");
  237. Serial.println("ENJOY....(*_*)....\n\n");
  238. Qstop1 = false;
  239. }}
  240.  
  241. // __ _
  242. // / _|_ __ ___ ___ _ __ | | __ _ _ _
  243. //| |_| '__/ _ \/ _ \ '_ \| |/ _` | | | |
  244. //| _| | | __/ __/ |_) | | (_| | |_| |
  245. //|_| |_| \___|\___| .__/|_|\__,_|\__, |
  246. // |_| |___/
  247. void freeplay(){
  248. if (PS4.connected()) {
  249. if (PS4.getButtonPress(OPTIONS) && PS4.getButtonClick(SHARE)) {
  250. playmode = !playmode;
  251. if (Qstop2 == true){
  252. Serial.print("playmode\n\n");
  253. }
  254. if (Qstop2 == false ){
  255. Serial.print("\n\n");
  256. Serial.print("playmode deselected\n\n");
  257. digitalWrite(ENABLE_PIN, HIGH);
  258. }
  259. Qstop2 = !Qstop2;
  260. }}
  261. if (playmode == true){
  262. ps4();
  263. }}
  264.  
  265.  
  266. // _ _
  267. // _ __ ___| || |
  268. //| '_ \/ __| || |_
  269. //| |_) \__ \__ _|
  270. //| .__/|___/ |_|
  271. //|_|
  272. void ps4(){
  273. if (PS4.connected()) {
  274. if (PS4.getAnalogHat(LeftHatX) > 137 || PS4.getAnalogHat(LeftHatX) < 117 || PS4.getAnalogHat(LeftHatY) > 137 || PS4.getAnalogHat(LeftHatY) < 117 || PS4.getAnalogHat(RightHatX) > 137 || PS4.getAnalogHat(RightHatX) < 117 || PS4.getAnalogHat(RightHatY) > 137 || PS4.getAnalogHat(RightHatY) < 117) {
  275. Serial.print(F("\r\nLeftHatX: ")); Serial.print(PS4.getAnalogHat(LeftHatX)); Serial.print(F("\tLeftHatY: "));
  276. Serial.print(PS4.getAnalogHat(LeftHatY)); Serial.print(F("\tRightHatX: "));
  277. Serial.print(PS4.getAnalogHat(RightHatX)); Serial.print(F("\tRightHatY: "));- Serial.print(PS4.getAnalogHat(RightHatY));
  278. }
  279. if (PS4.getAnalogButton(L2) || PS4.getAnalogButton(R2)) { // These are the only analog buttons on the PS4 controller
  280. Serial.print(F("\r\nL2: "));
  281. Serial.print(PS4.getAnalogButton(L2));
  282. Serial.print(F("\tR2: "));
  283. Serial.print(PS4.getAnalogButton(R2));
  284. }
  285. if (PS4.getAnalogButton(L2) != oldL2Value || PS4.getAnalogButton(R2) != oldR2Value) // Only write value if it's different
  286. PS4.setRumbleOn(PS4.getAnalogButton(L2), PS4.getAnalogButton(R2));
  287. oldL2Value = PS4.getAnalogButton(L2);
  288. oldR2Value = PS4.getAnalogButton(R2);
  289.  
  290. if (PS4.getButtonClick(PS)) {
  291. Serial.print(F("\r\nPS"));
  292. PS4.disconnect();
  293. }
  294. else {
  295. if (PS4.getButtonClick(TRIANGLE)) {
  296. Serial.print(F("\r\nTraingle"));
  297. PS4.setRumbleOn(RumbleLow);
  298. }
  299. if (PS4.getButtonClick(CIRCLE)) {
  300. Serial.print(F("\r\nCircle"));
  301. PS4.setRumbleOn(RumbleHigh);
  302. }
  303. if (PS4.getButtonPress(SQUARE)) {
  304. Serial.print(F("\r\nSquare"));
  305. }
  306. if (PS4.getButtonClick(CROSS)) {
  307. Serial.print(F("\r\nSquare"));
  308. }
  309. if (PS4.getButtonClick(UP)) {
  310. Serial.print(F("\r\nUp"));
  311. PS4.setLed(Red);
  312. } if(PS4.getButtonPress(RIGHT)) {
  313. Serial.print(F("\r\nRight"));
  314. } if (PS4.getButtonClick(DOWN)) {
  315. Serial.print(F("\r\nDown"));
  316. PS4.setLed(Yellow);
  317. } if (PS4.getButtonPress(LEFT)) {
  318. Serial.print(F("\r\nLeft"));
  319. }
  320. if (PS4.getButtonClick(L1))
  321. Serial.print(F("\r\nL1"));
  322. if (PS4.getButtonClick(L3))
  323. Serial.print(F("\r\nL3"));
  324. if (PS4.getButtonClick(R1))
  325. Serial.print(F("\r\nR1"));
  326. if (PS4.getButtonClick(R3))
  327. Serial.print(F("\r\nR3"));
  328.  
  329. if (PS4.getButtonClick(SHARE)){
  330. Serial.print(F("\r\nShare")); Serial.print(F("\nGyro X: "));
  331. Serial.print(PS4.getSensor(gX)); Serial.print(F("\tGyro Y: "));
  332. Serial.print(PS4.getSensor(gY)); Serial.print(F("\tGyro Z: "));
  333. Serial.print(PS4.getSensor(gZ)); Serial.print(F("\n\r"));
  334. }
  335. if (PS4.getButtonClick(TOUCHPAD)) {
  336. Serial.print(F("\r\nTouchpad"));
  337. printTouch = !printTouch;
  338. }
  339.  
  340. if (printAngle){ // Print angle calculated using the accelerometer only
  341. Serial.print(F("\r\nPitch: "));Serial.print(PS4.getAngle(Pitch));
  342. Serial.print(F("\tRoll: ")); Serial.print(PS4.getAngle(Roll));
  343. }
  344. if (printTouch) { // Print the x, y coordinates of the touchpad
  345. if (PS4.isTouching(0) || PS4.isTouching(1)) // Print newline and carriage return if any of the fingers are touching the touchpad
  346. Serial.print(F("\r\n"));
  347. for (uint8_t i = 0; i < 2; i++) { // The touchpad track two fingers
  348. if (PS4.isTouching(i)) { // Print the position of the finger if it is touching the touchpad
  349. Serial.print(F("X")); Serial.print(i + 1); Serial.print(F(": "));
  350. Serial.print(PS4.getX(i));
  351. Serial.print(F("\tY")); Serial.print(i + 1); Serial.print(F(": "));
  352. Serial.print(PS4.getY(i));
  353. Serial.print(F("\t"));
  354. }}}}}}
  355.  
  356.  
  357.  
  358.  
  359.  
  360.  
  361.  
  362.  
  363.  
  364. // _ _
  365. // _ __ ___ _ _| |_(_)_ __ ___ ___
  366. //| '__/ _ \| | | | __| | '_ \ / _ \/ __|
  367. //| | | (_) | |_| | |_| | | | | __/\__ \
  368. //|_| \___/ \__,_|\__|_|_| |_|\___||___/ Stuff...
  369. void routselect(){
  370. if (PS4.getButtonPress(OPTIONS) && PS4.getButtonClick(LEFT)) {
  371. Serial.print(F("\n\r"));
  372. ifunc--;
  373. if (ifunc < 0)
  374. ifunc = CNT_PFUNCS - 1;
  375. printroutine();
  376. }
  377. if (PS4.getButtonPress(OPTIONS) && PS4.getButtonClick(RIGHT)) {
  378. Serial.print(F("\n\r"));
  379. ifunc++;
  380. if (ifunc >= CNT_PFUNCS)
  381. ifunc = 0;
  382. printroutine();
  383. }
  384. if (PS4.getButtonPress(OPTIONS) && PS4.getButtonClick(CIRCLE)) {
  385. Serial.print(F("\n\r"));
  386. Serial.print(F("circle hello"));
  387. enabled = !enabled;
  388. if (enabled == false){
  389. digitalWrite(ENABLE_PIN, LOW);
  390. Serial.print(F("steppers disabled"));
  391.  
  392. }
  393. if (enabled == true){
  394. Serial.print(F("steppers enabled "));
  395. digitalWrite(ENABLE_PIN, HIGH);
  396. }
  397. }
  398. if (PS4.getButtonPress(OPTIONS) && PS4.getButtonClick(CROSS)) {
  399. playing = true;
  400. Serial.print(F("\n\n"));
  401. Serial.println("now running:");
  402. printroutine();
  403. (*myfuncs[ifunc])();
  404. }}
  405. void printroutine(){
  406. if (myfuncs[ifunc] == &routine1) Serial.print("\n\nfunc1");
  407. else if(myfuncs[ifunc] == &routine2) Serial.print("\n\nfunc2");
  408. else if(myfuncs[ifunc] == &routine3) Serial.println("\n\nstepper control");
  409. else if(myfuncs[ifunc] == &routine4) Serial.print("\n\nfunc4");
  410. else if(myfuncs[ifunc] == &routine5) Serial.print("\n\nfunc5");
  411. else if(myfuncs[ifunc] == &routine6) Serial.print("\n\nfunc6");
  412. else if(myfuncs[ifunc] == &routine7) Serial.print("\n\nfunc7");
  413. }
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  
  421. void routine1(){
  422. Serial.println("running routine1");
  423. digitalWrite(ENABLE_PIN, LOW);
  424. while(playing == true){
  425.  
  426. stplft();
  427.  
  428.  
  429. Usb.Task();
  430. if (PS4.connected()) {
  431. if (PS4.getButtonClick(TRIANGLE)) {
  432. Serial.println("exiting routine1");
  433. digitalWrite(ENABLE_PIN, HIGH);
  434. playing= false;
  435. }
  436. }
  437. }
  438.  
  439.  
  440. }
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451. void routine2(void)
  452. {
  453. while(playing == true){
  454. Serial.print(F("\n\n"));
  455. Serial.println("routine2");
  456. Usb.Task();
  457. if (PS4.connected()) {
  458. if (PS4.getButtonClick(TRIANGLE)) {
  459. Serial.println("triangloooo");
  460. playing= false;
  461. }
  462. }
  463. }}
  464.  
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  
  480.  
  481.  
  482.  
  483.  
  484.  
  485. // _ _ _ __ __
  486. // ___| |_ ___ _ __ _ __ (_)_ __ __ _ ___| |_ _ _ / _|/ _|
  487. /// __| __/ _ \ '_ \| '_ \| | '_ \ / _` | / __| __| | | | |_| |_
  488. //\__ \ || __/ |_) | |_) | | | | | (_| | \__ \ |_| |_| | _| _|
  489. //|___/\__\___| .__/| .__/|_|_| |_|\__, | |___/\__|\__,_|_| |_|
  490. // |_| |_| |___/
  491. void routine3()
  492. { digitalWrite(ENABLE_PIN, LOW);
  493. while(playing == true){
  494. while (PS4.getButtonPress(RIGHT)) {
  495. stprght();
  496. Usb.Task();
  497. } while (PS4.getButtonPress(LEFT)) {
  498. stplft();
  499. Usb.Task();
  500. }
  501. if(PS4.getButtonClick(UP)) {
  502. step_speed=step_speed+20;
  503. if(step_speed > 5000){
  504. step_speed = 5000;
  505. }
  506. Serial.println(step_speed);
  507. }
  508. if (PS4.getButtonClick(DOWN)){
  509. step_speed=step_speed-20;
  510. if(step_speed < 300){
  511. step_speed = 300;
  512. }
  513. Serial.println(step_speed);
  514. }
  515. Usb.Task();
  516. if (PS4.connected()) {
  517. if (PS4.getButtonClick(TRIANGLE)) {
  518. Serial.println("exiting stepper control mode");
  519. playing= false;
  520. digitalWrite(ENABLE_PIN, HIGH);
  521. }
  522. }
  523. }}
  524. void stplft(){//stepping stepper motor left
  525. digitalWrite(DIR_PIN, LOW);
  526. digitalWrite(STEP_PIN, HIGH);
  527. delayMicroseconds(step_speed);
  528. digitalWrite(STEP_PIN, LOW);
  529. delayMicroseconds(step_speed);
  530. }
  531. void stprght(){//stepping stepper motor right
  532. digitalWrite(DIR_PIN, HIGH);
  533. digitalWrite(STEP_PIN, HIGH);
  534. delayMicroseconds(step_speed);
  535. digitalWrite(STEP_PIN, LOW);
  536. delayMicroseconds(step_speed);
  537. }
  538.  
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.  
  546.  
  547.  
  548.  
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.  
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569.  
  570.  
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581. void routine4(void)
  582. { while(playing == true){
  583. Serial.print(F("\n\n"));
  584. Serial.println("routine4");
  585. Usb.Task();
  586. if (PS4.connected()) {
  587. if (PS4.getButtonClick(TRIANGLE)) {
  588. Serial.println("triangloooo");
  589. playing= false;
  590. }
  591. }
  592.  
  593.  
  594. }}
  595.  
  596.  
  597.  
  598.  
  599. void routine5(void)
  600. { while(playing == true){
  601. Serial.print(F("\n\n"));
  602. Serial.println("routine5");
  603. Usb.Task();
  604. if (PS4.connected()) {
  605. if (PS4.getButtonClick(TRIANGLE)) {
  606. Serial.println("triangloooo");
  607. playing= false;
  608. }
  609. }
  610.  
  611.  
  612. }}
  613.  
  614.  
  615.  
  616. void routine6(void)
  617. { while(playing == true){
  618. Serial.print(F("\n\n"));
  619. Serial.println("routine6");
  620. Usb.Task();
  621. if (PS4.connected()) {
  622. if (PS4.getButtonClick(TRIANGLE)) {
  623. Serial.println("triangloooo");
  624. moveToPosition( 800, false);
  625. playing= false;
  626. }
  627. }
  628.  
  629.  
  630. }}
  631.  
  632.  
  633. void routine7(void)
  634. { while(playing == true){
  635. Serial.print(F("\n\n"));
  636. Serial.println("routine7");
  637. Usb.Task();
  638. if (PS4.connected()) {
  639. if (PS4.getButtonClick(TRIANGLE)) {
  640. Serial.println("triangloooo");
  641. playing= false;
  642. }
  643. }
  644.  
  645.  
  646.  
  647. }}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement