Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*****************************************************/
- /* Symulator sterownika z systemów wbudowanych */
- /* wersja 0.3 */
- /* Napisał Maciej Drożdż */
- /* Dziękuję za pomoc Piotrowi G. */
- /* W końcu się na coś przydał :v */
- /*****************************************************/
- #include <allegro5\allegro.h>
- #include <allegro5\allegro_native_dialog.h>
- #include <allegro5\color.h>
- #include <allegro5\keyboard.h>
- #include <allegro5\allegro_image.h>
- #include "Rectangle.h"
- #include <string>
- #include <stdio.h>
- #include <conio.h>
- #define screenWidth 112*5
- #define screenHeight 350
- #pragma region deklaracje_LCD
- bool LCD_i = false;
- int LCDx = 0, LCDy = 0;
- char disp[2][40];
- char buf[80];
- void LCD_init();
- void LCD_xy(int x, int y);
- void LCD_puts(char * s);
- char COM_recv();
- void COM_send(char znak);
- #pragma endregion
- int main()
- {
- #pragma region init
- ALLEGRO_DISPLAY * display;
- CRectangle *rectangle = new CRectangle;
- if (!al_init())
- return -1;
- display = al_create_display(screenWidth, screenHeight);
- if (!display)
- return -1;
- bool done = false;
- ALLEGRO_EVENT_QUEUE * event_queue = al_create_event_queue();
- al_init_primitives_addon();
- al_init_font_addon();
- al_init_ttf_addon();
- al_init_image_addon();
- al_install_keyboard();
- ALLEGRO_KEYBOARD_STATE keyState;
- ALLEGRO_TIMER *timer = al_create_timer(1.0f / 10);
- al_register_event_source(event_queue, al_get_keyboard_event_source());
- al_register_event_source(event_queue, al_get_timer_event_source(timer));
- al_register_event_source(event_queue, al_get_display_event_source(display));
- ALLEGRO_COLOR off;
- ALLEGRO_COLOR on;
- ALLEGRO_COLOR curColor1, curColor2, curColor3, curColor4, curColor5;
- ALLEGRO_COLOR aKon, aKoff, aKcur1, aKcur2, aKcur3, aKcur4, aKcur5;
- ALLEGRO_BITMAP * lcd_img = al_load_bitmap("lcd.png");
- int LCD_pos = 0, LED_pos = 153, aK_pos = 153;
- aKon = al_map_rgb(200, 200, 200);
- aKoff = al_map_rgb(100, 100, 100);
- aKcur1 = aKcur2 = aKcur3 = aKcur4 = aKcur5 = aKoff;
- off = al_map_rgb(100, 0, 0);
- on = al_map_rgb(255, 0, 0);
- curColor1 = curColor2 = curColor3 = curColor4 = curColor5 = off;
- ALLEGRO_FONT * font = al_load_ttf_font("Roboto-Black.ttf", 20, NULL);
- ALLEGRO_FONT * LCD_font = al_load_ttf_font("REGISTER.ttf", 46, NULL);
- rectangle->init(font);
- std::string title, LCD_row0, LCD_row1;
- bool L1 = false, L2 = false, L3 = false, L4 = false, L5 = false;
- bool aK1 = false, aK2 = false, aK3 = false, aK4 = false, aK5 = false;
- #pragma endregion
- char pK1 = 0, pK2, pK3, pK4, pK5;
- /* USER VARIABLES STARTS HERE */
- char Z1, Z2, Z3, x1, x2, x3, x4, M;
- /* ZEROWANIE ZMIENNYCH */
- /* teraz zerowanie zmiennych jest wymagane bo nie uzywamy aK1 itp więc nie zerują się same */
- Z1 = Z2 = Z3 = x1 = x2 = x3 = x4 = M = 0;
- char T1 = 3, T2 = 1, T3 = 3, T4 = 1, T5 = 5;
- char znak, stank = 1, a, b, c, d;
- char stan1 = 1, stan2 = 1, tim = 0;
- LCD_init();
- /* USER VARIABLES ENDS HERE */
- al_start_timer(timer);
- std::cout << "KOMUNIKACJA" << std::endl;
- std::cout << "do komunikacji okno cmd musi byc aktywne" << std::endl;
- while (!done)
- {
- ALLEGRO_EVENT ev;
- al_wait_for_event(event_queue, &ev);
- al_get_keyboard_state(&keyState);
- if (ev.type == ALLEGRO_EVENT_TIMER)
- {
- #pragma region kod_uzytkownika
- /* YOUR CODE STARTS HERE */
- switch (stan1)
- {
- case 1: Z1 = 1; if (x3){ tim = T1 * 10; stan1 = 2; } break;
- case 2: Z1 = 1; if (x4) stan1 = 4; else if (!tim) { tim = T2 * 10; stan1 = 3; }
- else if (!x3) stan1 = 1; break;
- case 3: Z1 = 0; if (!tim) { tim = T1 * 10; stan1 = 2; }
- else if (!x3) stan1 = 1; break;
- case 4: Z1 = 0; if (!x4) { tim = T1 * 10; stan1 = 2; } break;
- }
- znak = COM_recv() & 0x7f;
- if (znak != 0)
- {
- switch (stank)
- {
- case 1:
- if (znak == ':') stank = 2; break;
- case 2:
- if ((znak >= 'A' && znak <= 'C') || (znak >= '1' && znak <= '9'))
- {
- a = znak - '0'; stank = 3;
- }
- else stank = 1;
- break;
- case 3:
- if ((znak >= 'A' && znak <= 'B') || (znak >= '0' && znak <= '9'))
- {
- b = znak - '0'; stank = 4;
- }
- else if (znak == '#')
- {
- if (a + '0' == 'A')
- {
- COM_send(':'); COM_send(x3 + '0'); COM_send(x4 + '0'); COM_send('#');
- }
- else if (a + '0' == 'B')
- {
- COM_send(':'); COM_send(x1 + '0'); COM_send(x2 + '0'); COM_send('#');
- }
- stank = 1;
- }
- else stank = 1;
- break;
- case 4:
- if (znak >= '0' && znak <= '9')
- {
- c = znak - '0'; stank = 5;
- }
- else if (znak == '#')
- {
- if (a + '0' == 'C')
- {
- if (b + '0' == 'A')
- {
- COM_send(':'); COM_send(T1 + '0'); COM_send(T2 + '0'); COM_send('#');
- }
- else if (b + '0' == 'B')
- {
- COM_send(':'); COM_send(T3 + '0'); COM_send(T4 + '0'); COM_send(T5 + '0'); COM_send('#');
- }
- }
- stank = 1;
- }
- else stank = 1;
- break;
- case 5:
- if (znak >= '0' && znak <= '4')
- {
- d = znak - '0'; stank = 6;
- }
- else if (znak == '#')
- {
- if (a >= 1 && b >= 1)
- {
- if ((a + b + c) % 5 == 0)
- {
- T1 = a; T2 = b;
- }
- }
- stank = 1;
- }
- else stank = 1;
- break;
- case 6:
- if (znak == '#')
- {
- if (a + '0' == 'A')
- {
- if ((a + b + c + d) % 2 == 0)
- {
- x3 = b; x4 = c;
- }
- }
- else if (a + '0' == 'B')
- {
- if ((a + b + c + d) % 2 == 1)
- {
- x1 = b; x2 = c;
- }
- }
- else if (a >= 1 && b >= 1 && c >= 1)
- {
- if ((a + b + c + d) % 3 == 0)
- {
- T3 = a; T4 = b; T5 = c;
- }
- }
- stank = 1;
- }
- else stank = 1;
- break;
- }
- }
- //std::cout << znak;
- L1 = Z1; L2 = Z2; L3 = Z3;
- if (tim) --tim;
- LCD_xy(0, 0); sprintf(buf, "stank = %d" , (int)stank);
- LCD_puts(buf);
- LCD_xy(0, 1); sprintf(buf, "stan1 = %d", (int)stan1);
- LCD_puts(buf);
- /* YOUR CODE ENDS HERE */
- #pragma endregion
- #pragma region klawisze
- if (al_key_down(&keyState, ALLEGRO_KEY_ESCAPE))
- {
- done = true;
- }
- if (al_key_down(&keyState, ALLEGRO_KEY_1))
- aK1 = true;
- else
- aK1 = false;
- if (al_key_down(&keyState, ALLEGRO_KEY_2))
- aK2 = true;
- else
- aK2 = false;
- if (al_key_down(&keyState, ALLEGRO_KEY_3))
- aK3 = true;
- else
- aK3 = false;
- if (al_key_down(&keyState, ALLEGRO_KEY_4))
- aK4 = true;
- else
- aK4 = false;
- if (al_key_down(&keyState, ALLEGRO_KEY_5))
- aK5 = true;
- else
- aK5 = false;
- #pragma endregion
- }
- #pragma region diody
- if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
- {
- done = true;
- }
- if (L1)
- curColor1 = on;
- else
- curColor1 = off;
- if (L2)
- curColor2 = on;
- else
- curColor2 = off;
- if (L3)
- curColor3 = on;
- else
- curColor3 = off;
- if (L4)
- curColor4 = on;
- else
- curColor4 = off;
- if (L5)
- curColor5 = on;
- else
- curColor5 = off;
- if (aK1)
- aKcur1 = aKon;
- else
- aKcur1 = aKoff;
- if (aK2)
- aKcur2 = aKon;
- else
- aKcur2 = aKoff;
- if (aK3)
- aKcur3 = aKon;
- else
- aKcur3 = aKoff;
- if (aK4)
- aKcur4 = aKon;
- else
- aKcur4 = aKoff;
- if (aK5)
- aKcur5 = aKon;
- else
- aKcur5 = aKoff;
- #pragma endregion
- #pragma region rysowanie
- al_draw_bitmap(lcd_img, 0, 0, NULL);
- if (LCD_i)
- {
- LCD_row0 = "";
- LCD_row1 = "";
- for (int i = 16; i < 40; i++)
- {
- disp[0][i] = ' ';
- disp[1][i] = ' ';
- }
- for (int i = 0; i < 40; i++)
- {
- if (disp[0][i] == '\0') disp[0][i] = ' ';
- LCD_row0 += disp[0][i];
- if (disp[1][i] == '\0') disp[1][i] = ' ';
- LCD_row1 += disp[1][i];
- }
- rectangle->draw(20, LCD_pos + 40, screenWidth - 50, 60, al_map_rgba(0, 0, 0, 0), LCD_row0.c_str(), LCD_font);
- rectangle->draw(20, LCD_pos + 100, screenWidth - 50, 60, al_map_rgba(0, 0, 0, 0), LCD_row1.c_str(), LCD_font);
- }
- //title = "SYMULATOR STEROWNIKA || STAN = " + std::to_string(stan);
- //al_draw_text(font, al_map_rgb(255, 255, 255), screenWidth / 2, 15, ALLEGRO_ALIGN_CENTRE, title.c_str());
- rectangle->draw(10, LED_pos + 50, 100, 100, curColor1, "L1");
- rectangle->draw(120, LED_pos + 50, 100, 100, curColor2, "L2");
- rectangle->draw(230, LED_pos + 50, 100, 100, curColor3, "L3");
- rectangle->draw(340, LED_pos + 50, 100, 100, curColor4, "L4");
- rectangle->draw(450, LED_pos + 50, 100, 100, curColor5, "L5");
- rectangle->draw(10, aK_pos + 160, 100, 30, aKcur1, "aK1");
- rectangle->draw(120, aK_pos + 160, 100, 30, aKcur2, "aK2");
- rectangle->draw(230, aK_pos + 160, 100, 30, aKcur3, "aK3");
- rectangle->draw(340, aK_pos + 160, 100, 30, aKcur4, "aK4");
- rectangle->draw(450, aK_pos + 160, 100, 30, aKcur5, "aK5");
- al_flip_display();
- al_clear_to_color(al_map_rgb(0, 0, 0));
- #pragma endregion
- }
- #pragma region koniec_programu
- al_destroy_display(display);
- al_destroy_event_queue(event_queue);
- return 0;
- #pragma endregion
- }
- #pragma region funkcje_LCD
- void LCD_init()
- {
- LCD_i = true;
- }
- void LCD_xy(int x, int y)
- {
- LCDx = x;
- LCDy = y;
- }
- void LCD_puts(char *s)
- {
- if (LCDy == 0)
- {
- if (LCDx < 40 && LCDx >= 0)
- {
- //sprintf(buf[0], s);
- strcpy(&disp[0][LCDx], s);
- //strcpy(&buf[LCDx], s);
- }
- }
- else if (LCDy == 1)
- {
- if (LCDx < 40 && LCDx >= 0)
- {
- //sprintf(buf[1], s);
- //strcpy(&buf[LCDx+40], s);
- strcpy(&disp[1][LCDx], s);
- }
- }
- else
- {
- }
- }
- #pragma endregion
- #pragma region funkcje komunikacji
- char COM_recv()
- {
- char tempChar = 0;
- if (_kbhit())
- tempChar = _getch();
- return tempChar;
- }
- void COM_send(char znak)
- {
- std::cout << znak;
- }
- #pragma endregion
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement