Advertisement
Guest User

Untitled

a guest
Jun 3rd, 2015
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.87 KB | None | 0 0
  1. /*****************************************************/
  2. /*  Symulator sterownika z systemów wbudowanych         */
  3. /*                  wersja 0.3                       */
  4. /*              Napisał Maciej Drożdż                 */
  5. /*          Dziękuję za pomoc Piotrowi G.          */
  6. /*          W końcu się na coś przydał :v            */
  7. /*****************************************************/
  8.  
  9. #include <allegro5\allegro.h>
  10. #include <allegro5\allegro_native_dialog.h>
  11. #include <allegro5\color.h>
  12. #include <allegro5\keyboard.h>
  13. #include <allegro5\allegro_image.h>
  14. #include "Rectangle.h"
  15. #include <string>
  16. #include <stdio.h>
  17. #include <conio.h>
  18.  
  19. #define screenWidth 112*5
  20. #define screenHeight 350
  21.  
  22. #pragma region deklaracje_LCD
  23.  
  24. bool LCD_i = false;
  25. int LCDx = 0, LCDy = 0;
  26. char disp[2][40];
  27. char buf[80];
  28.  
  29. void LCD_init();
  30. void LCD_xy(int x, int y);
  31. void LCD_puts(char * s);
  32.  
  33. char COM_recv();
  34. void COM_send(char znak);
  35.  
  36. #pragma endregion
  37.  
  38. int main()
  39. {
  40. #pragma region init
  41.  
  42.     ALLEGRO_DISPLAY * display;
  43.     CRectangle *rectangle = new CRectangle;
  44.  
  45.     if (!al_init())
  46.         return -1;
  47.  
  48.     display = al_create_display(screenWidth, screenHeight);
  49.  
  50.     if (!display)
  51.         return -1;
  52.  
  53.     bool done = false;
  54.  
  55.     ALLEGRO_EVENT_QUEUE * event_queue = al_create_event_queue();
  56.  
  57.     al_init_primitives_addon();
  58.     al_init_font_addon();
  59.     al_init_ttf_addon();
  60.     al_init_image_addon();
  61.     al_install_keyboard();
  62.  
  63.     ALLEGRO_KEYBOARD_STATE keyState;
  64.     ALLEGRO_TIMER *timer = al_create_timer(1.0f / 10);
  65.  
  66.     al_register_event_source(event_queue, al_get_keyboard_event_source());
  67.     al_register_event_source(event_queue, al_get_timer_event_source(timer));
  68.     al_register_event_source(event_queue, al_get_display_event_source(display));
  69.    
  70.     ALLEGRO_COLOR off;
  71.     ALLEGRO_COLOR on;
  72.     ALLEGRO_COLOR curColor1, curColor2, curColor3, curColor4, curColor5;
  73.     ALLEGRO_COLOR aKon, aKoff, aKcur1, aKcur2, aKcur3, aKcur4, aKcur5;
  74.     ALLEGRO_BITMAP * lcd_img = al_load_bitmap("lcd.png");
  75.  
  76.     int LCD_pos = 0, LED_pos = 153, aK_pos = 153;
  77.  
  78.     aKon = al_map_rgb(200, 200, 200);
  79.     aKoff = al_map_rgb(100, 100, 100);
  80.     aKcur1 = aKcur2 = aKcur3 = aKcur4 = aKcur5 = aKoff;
  81.  
  82.     off = al_map_rgb(100, 0, 0);
  83.     on = al_map_rgb(255, 0, 0);
  84.     curColor1 = curColor2 = curColor3 = curColor4 = curColor5 = off;
  85.  
  86.     ALLEGRO_FONT * font = al_load_ttf_font("Roboto-Black.ttf", 20, NULL);
  87.     ALLEGRO_FONT * LCD_font = al_load_ttf_font("REGISTER.ttf", 46, NULL);
  88.  
  89.     rectangle->init(font);
  90.  
  91.     std::string title, LCD_row0, LCD_row1;
  92.  
  93.     bool L1 = false, L2 = false, L3 = false, L4 = false, L5 = false;
  94.     bool aK1 = false, aK2 = false, aK3 = false, aK4 = false, aK5 = false;
  95.  
  96. #pragma endregion
  97.  
  98.     char pK1 = 0, pK2, pK3, pK4, pK5;
  99.  
  100.     /* USER VARIABLES STARTS HERE */
  101.  
  102.     char Z1, Z2, Z3, x1, x2, x3, x4, M;
  103.  
  104.     /* ZEROWANIE ZMIENNYCH  */
  105.     /* teraz zerowanie zmiennych jest wymagane bo nie uzywamy aK1 itp więc nie zerują się same */
  106.     Z1 = Z2 = Z3 = x1 = x2 = x3 = x4 = M = 0;
  107.     char T1 = 3, T2 = 1, T3 = 3, T4 = 1, T5 = 5;
  108.  
  109.     char znak, stank = 1, a, b, c, d;
  110.     char stan1 = 1, stan2 = 1, tim = 0;
  111.  
  112.     LCD_init();
  113.  
  114.     /* USER VARIABLES ENDS HERE */
  115.  
  116.     al_start_timer(timer);
  117.  
  118.     std::cout << "KOMUNIKACJA" << std::endl;
  119.     std::cout << "do komunikacji okno cmd musi byc aktywne" << std::endl;
  120.  
  121.     while (!done)
  122.     {
  123.         ALLEGRO_EVENT ev;
  124.         al_wait_for_event(event_queue, &ev);
  125.         al_get_keyboard_state(&keyState);
  126.  
  127.         if (ev.type == ALLEGRO_EVENT_TIMER)
  128.         {
  129. #pragma region kod_uzytkownika
  130.             /* YOUR CODE STARTS HERE */
  131.  
  132.             switch (stan1)
  133.             {
  134.             case 1: Z1 = 1; if (x3){ tim = T1 * 10; stan1 = 2; } break;
  135.             case 2: Z1 = 1; if (x4) stan1 = 4; else if (!tim) { tim = T2 * 10; stan1 = 3; }
  136.                     else if (!x3) stan1 = 1; break;
  137.             case 3: Z1 = 0; if (!tim) { tim = T1 * 10; stan1 = 2; }
  138.                     else if (!x3) stan1 = 1; break;
  139.             case 4: Z1 = 0; if (!x4) { tim = T1 * 10; stan1 = 2; } break;
  140.             }
  141.  
  142.             znak = COM_recv() & 0x7f;
  143.             if (znak != 0)
  144.             {
  145.                 switch (stank)
  146.                 {
  147.                 case 1:
  148.                     if (znak == ':') stank = 2; break;
  149.                
  150.                 case 2:
  151.                     if ((znak >= 'A' && znak <= 'C') || (znak >= '1' && znak <= '9'))
  152.                     {
  153.                         a = znak - '0'; stank = 3;
  154.                     }
  155.                     else stank = 1;
  156.                     break;
  157.                
  158.                 case 3:
  159.                     if ((znak >= 'A' && znak <= 'B') || (znak >= '0' && znak <= '9'))
  160.                     {
  161.                         b = znak - '0'; stank = 4;
  162.                     }
  163.                     else if (znak == '#')
  164.                     {
  165.                         if (a + '0' == 'A')
  166.                         {
  167.                             COM_send(':'); COM_send(x3 + '0'); COM_send(x4 + '0'); COM_send('#');
  168.                         }
  169.                         else if (a + '0' == 'B')
  170.                         {
  171.                             COM_send(':'); COM_send(x1 + '0'); COM_send(x2 + '0'); COM_send('#');
  172.                         }
  173.                         stank = 1;
  174.                     }
  175.                     else stank = 1;
  176.                     break;
  177.                
  178.                 case 4:
  179.                     if (znak >= '0' && znak <= '9')
  180.                     {
  181.                         c = znak - '0'; stank = 5;
  182.                     }
  183.                     else if (znak == '#')
  184.                     {
  185.                         if (a + '0' == 'C')
  186.                         {
  187.                             if (b + '0' == 'A')
  188.                             {
  189.                                 COM_send(':'); COM_send(T1 + '0'); COM_send(T2 + '0'); COM_send('#');
  190.                             }
  191.                             else if (b + '0' == 'B')
  192.                             {
  193.                                 COM_send(':'); COM_send(T3 + '0'); COM_send(T4 + '0'); COM_send(T5 + '0'); COM_send('#');
  194.                             }
  195.                         }
  196.                         stank = 1;
  197.                     }
  198.                     else stank = 1;
  199.                     break;
  200.  
  201.                 case 5:
  202.                     if (znak >= '0' && znak <= '4')
  203.                     {
  204.                         d = znak - '0'; stank = 6;
  205.                     }
  206.                     else if (znak == '#')
  207.                     {
  208.                         if (a >= 1 && b >= 1)
  209.                         {
  210.                             if ((a + b + c) % 5 == 0)
  211.                             {
  212.                                 T1 = a; T2 = b;
  213.                             }
  214.                         }
  215.                         stank = 1;
  216.                     }
  217.                     else stank = 1;
  218.                     break;
  219.                    
  220.                 case 6:
  221.                     if (znak == '#')
  222.                     {
  223.                         if (a + '0' == 'A')
  224.                         {
  225.                             if ((a + b + c + d) % 2 == 0)
  226.                             {
  227.                                 x3 = b; x4 = c;
  228.                             }
  229.                         }
  230.                         else if (a + '0' == 'B')
  231.                         {
  232.                             if ((a + b + c + d) % 2 == 1)
  233.                             {
  234.                                 x1 = b; x2 = c;
  235.                             }
  236.                         }
  237.                         else if (a >= 1 && b >= 1 && c >= 1)
  238.                         {
  239.                             if ((a + b + c + d) % 3 == 0)
  240.                             {
  241.                                 T3 = a; T4 = b; T5 = c;
  242.                             }
  243.                         }
  244.                         stank = 1;
  245.                     }
  246.                     else stank = 1;
  247.                     break;
  248.                 }
  249.             }
  250.             //std::cout << znak;
  251.  
  252.             L1 = Z1; L2 = Z2; L3 = Z3;
  253.  
  254.             if (tim) --tim;
  255.  
  256.             LCD_xy(0, 0); sprintf(buf, "stank = %d"            , (int)stank);
  257.             LCD_puts(buf);
  258.  
  259.             LCD_xy(0, 1); sprintf(buf, "stan1 = %d", (int)stan1);
  260.             LCD_puts(buf);
  261.  
  262.             /* YOUR CODE ENDS HERE */
  263. #pragma endregion
  264.  
  265. #pragma region klawisze
  266.  
  267.             if (al_key_down(&keyState, ALLEGRO_KEY_ESCAPE))
  268.             {
  269.                 done = true;
  270.             }
  271.  
  272.             if (al_key_down(&keyState, ALLEGRO_KEY_1))
  273.                 aK1 = true;
  274.             else
  275.                 aK1 = false;
  276.  
  277.             if (al_key_down(&keyState, ALLEGRO_KEY_2))
  278.                 aK2 = true;
  279.             else
  280.                 aK2 = false;
  281.  
  282.             if (al_key_down(&keyState, ALLEGRO_KEY_3))
  283.                 aK3 = true;
  284.             else
  285.                 aK3 = false;
  286.  
  287.             if (al_key_down(&keyState, ALLEGRO_KEY_4))
  288.                 aK4 = true;
  289.             else
  290.                 aK4 = false;
  291.  
  292.             if (al_key_down(&keyState, ALLEGRO_KEY_5))
  293.                 aK5 = true;
  294.             else
  295.                 aK5 = false;
  296.  
  297. #pragma endregion
  298.         }
  299.  
  300. #pragma region diody
  301.  
  302.         if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
  303.         {
  304.             done = true;
  305.         }
  306.  
  307.         if (L1)
  308.             curColor1 = on;
  309.         else
  310.             curColor1 = off;
  311.  
  312.         if (L2)
  313.             curColor2 = on;
  314.         else
  315.             curColor2 = off;
  316.  
  317.         if (L3)
  318.             curColor3 = on;
  319.         else
  320.             curColor3 = off;
  321.  
  322.         if (L4)
  323.             curColor4 = on;
  324.         else
  325.             curColor4 = off;
  326.  
  327.         if (L5)
  328.             curColor5 = on;
  329.         else
  330.             curColor5 = off;
  331.  
  332.         if (aK1)
  333.             aKcur1 = aKon;
  334.         else
  335.             aKcur1 = aKoff;
  336.  
  337.         if (aK2)
  338.             aKcur2 = aKon;
  339.         else
  340.             aKcur2 = aKoff;
  341.  
  342.         if (aK3)
  343.             aKcur3 = aKon;
  344.         else
  345.             aKcur3 = aKoff;
  346.  
  347.         if (aK4)
  348.             aKcur4 = aKon;
  349.         else
  350.             aKcur4 = aKoff;
  351.  
  352.         if (aK5)
  353.             aKcur5 = aKon;
  354.         else
  355.             aKcur5 = aKoff;
  356.  
  357. #pragma endregion
  358.  
  359. #pragma region rysowanie
  360.  
  361.         al_draw_bitmap(lcd_img, 0, 0, NULL);
  362.  
  363.         if (LCD_i)
  364.         {
  365.             LCD_row0 = "";
  366.             LCD_row1 = "";
  367.  
  368.             for (int i = 16; i < 40; i++)
  369.             {
  370.                 disp[0][i] = ' ';
  371.                 disp[1][i] = ' ';
  372.             }
  373.  
  374.             for (int i = 0; i < 40; i++)
  375.             {
  376.                 if (disp[0][i] == '\0') disp[0][i] = ' ';
  377.                 LCD_row0 += disp[0][i];
  378.  
  379.                 if (disp[1][i] == '\0') disp[1][i] = ' ';
  380.                 LCD_row1 += disp[1][i];
  381.             }
  382.  
  383.             rectangle->draw(20, LCD_pos + 40, screenWidth - 50, 60, al_map_rgba(0, 0, 0, 0), LCD_row0.c_str(), LCD_font);
  384.             rectangle->draw(20, LCD_pos + 100, screenWidth - 50, 60, al_map_rgba(0, 0, 0, 0), LCD_row1.c_str(), LCD_font);
  385.         }
  386.  
  387.         //title = "SYMULATOR STEROWNIKA || STAN = " + std::to_string(stan);
  388.         //al_draw_text(font, al_map_rgb(255, 255, 255), screenWidth / 2, 15, ALLEGRO_ALIGN_CENTRE, title.c_str());
  389.         rectangle->draw(10, LED_pos + 50, 100, 100, curColor1, "L1");
  390.         rectangle->draw(120, LED_pos + 50, 100, 100, curColor2, "L2");
  391.         rectangle->draw(230, LED_pos + 50, 100, 100, curColor3, "L3");
  392.         rectangle->draw(340, LED_pos + 50, 100, 100, curColor4, "L4");
  393.         rectangle->draw(450, LED_pos + 50, 100, 100, curColor5, "L5");
  394.  
  395.         rectangle->draw(10, aK_pos + 160, 100, 30, aKcur1, "aK1");
  396.         rectangle->draw(120, aK_pos + 160, 100, 30, aKcur2, "aK2");
  397.         rectangle->draw(230, aK_pos + 160, 100, 30, aKcur3, "aK3");
  398.         rectangle->draw(340, aK_pos + 160, 100, 30, aKcur4, "aK4");
  399.         rectangle->draw(450, aK_pos + 160, 100, 30, aKcur5, "aK5");
  400.  
  401.         al_flip_display();
  402.         al_clear_to_color(al_map_rgb(0, 0, 0));
  403.  
  404. #pragma endregion
  405.     }
  406. #pragma region koniec_programu
  407.     al_destroy_display(display);
  408.     al_destroy_event_queue(event_queue);
  409.  
  410.     return 0;
  411. #pragma endregion
  412. }
  413.  
  414. #pragma region funkcje_LCD
  415.  
  416. void LCD_init()
  417. {
  418.     LCD_i = true;
  419. }
  420.  
  421. void LCD_xy(int x, int y)
  422. {
  423.     LCDx = x;
  424.     LCDy = y;
  425. }
  426.  
  427. void LCD_puts(char *s)
  428. {
  429.     if (LCDy == 0)
  430.     {
  431.         if (LCDx < 40 && LCDx >= 0)
  432.         {
  433.             //sprintf(buf[0], s);
  434.             strcpy(&disp[0][LCDx], s);
  435.             //strcpy(&buf[LCDx], s);
  436.         }
  437.     }
  438.     else if (LCDy == 1)
  439.     {
  440.         if (LCDx < 40 && LCDx >= 0)
  441.         {
  442.             //sprintf(buf[1], s);
  443.             //strcpy(&buf[LCDx+40], s);
  444.             strcpy(&disp[1][LCDx], s);
  445.         }
  446.     }
  447.     else
  448.     {
  449.     }
  450. }
  451.  
  452. #pragma endregion
  453.  
  454. #pragma region funkcje komunikacji
  455.  
  456. char COM_recv()
  457. {
  458.     char tempChar = 0;
  459.     if (_kbhit())
  460.         tempChar = _getch();
  461.     return tempChar;
  462. }
  463.  
  464. void COM_send(char znak)
  465. {
  466.     std::cout << znak;
  467. }
  468.  
  469. #pragma endregion
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement