Advertisement
Guest User

Untitled

a guest
May 28th, 2016
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //#define DEV_ADDRESS 0xfe800000
  2. // DEV_ADDRESS : lspci -nn -v -d 1172:1f32 (/proc/bus/pci)
  3.  
  4. /* zablokovani prostradniho tlacitka mysi
  5. http://askubuntu.com/questions/4507/how-do-i-disable-middle-mouse-button-click-paste
  6. xmodmap -e "pointer = 1 25 3 4 5 6 7 8 9 10"
  7. */
  8.  
  9. //#define DEV_ENABLE "/sys/bus/pci/devicyes/0000:03:00.0/enable"
  10.  
  11. #include "main.h"
  12.  
  13. #define TRUE 1
  14. #define FALSE 0
  15. volatile uint32_t* DEV_ADDRESS;
  16. unsigned char* base;
  17. char* data; // recieved data from socket connection
  18. char* msg;
  19. char* buffer;
  20. char* serverMsgID;
  21. int i;
  22.  
  23. int mode = 0;
  24.  
  25. clock_t start, start2;
  26. int diff, diff2;
  27.  
  28. // CLIENT VARIABLES
  29. int sockfd = 0;
  30. struct sockaddr_in clntAddr; /* Local adress */
  31. unsigned short servPort;
  32. char* ipName;
  33. char* client_ID;
  34.  
  35. int main(int argc, char** argv)
  36. {
  37.     if (argc < 2) {
  38.         printf("Usage: client_ID host.");
  39.         return 1;
  40.     }
  41.  
  42.     char* host = (char*)argv[2];
  43.     int client_ID = atoi((char*)argv[1]);
  44.  
  45.     data = malloc(50 * sizeof(char));
  46.     msg = malloc(16 * sizeof(char));
  47.     buffer = malloc(50 * sizeof(char));
  48.     serverMsgID = malloc(2 * sizeof(char));
  49.  
  50.     memset(data, '\0', 50);
  51.     memset(msg, '\0', 16);
  52.     memset(buffer, '\0', 50);
  53.     memset(serverMsgID, '\0', 2);
  54.  
  55.     int file = 0;
  56.     if ((file = open("/dev/mem", O_RDWR | O_SYNC)) == -1) {
  57.         printf("Failure to open dev/mem\n");
  58.         printf("Try to run utility: devmemrw from terminal.\n");
  59.  
  60.         return 1;
  61.     }
  62.     if ((DEV_ADDRESS = listdir("/proc/bus/pci", 0)) == NULL) {
  63.         printf("%s", "Neni vlozena karta PCI\n");
  64.         exit(1);
  65.     }
  66.  
  67.     base = mmap(NULL, length, PROT_WRITE | PROT_READ, MAP_SHARED, file, (long)DEV_ADDRESS);
  68.     if (base == MAP_FAILED) {
  69.         printf("Failure to map device\n");
  70.         return 2;
  71.     }
  72.  
  73.     initClient(client_ID, host);
  74.  
  75.     *(base + PCI_CTRL) = 0x80; // zapni napajeni
  76.  
  77.     initLCD();
  78.  
  79.     writeString("Hi!", 0);
  80.     sleep(1);
  81.  
  82.     writeSequenceLED("00000000");
  83.  
  84.     recieveMessage();
  85.  
  86.     *(base + PCI_CTRL) = 0x00; // vypni napajeni
  87.  
  88.     int iter = 0;
  89.     // not sure jestli funguje
  90.     while (iter < 10) {
  91.         printf("%c \n", readChar());
  92.         iter++;
  93.         sleep(1);
  94.     }
  95.  
  96.     end();
  97.     printf("\n Ok, that!s enough, good bye! \n");
  98.  
  99.     free(data);
  100.     free(msg);
  101.     free(buffer);
  102.     free(serverMsgID);
  103.  
  104.     return 0;
  105. }
  106.  
  107. void nanowait(long time_seconds, long time_nanoseconds)
  108. {
  109.     const long int ONESECOND = 1000000000;
  110.     struct timespec wait_time = { .tv_sec = time_seconds,                 /* seconds */
  111.                               .tv_nsec = time_nanoseconds % ONESECOND /* nanoseconds [0 .. 999999999] */
  112.     };
  113.  
  114.     clock_nanosleep(CLOCK_MONOTONIC, 0, &wait_time, NULL);
  115. }
  116.  
  117. void beep()
  118. {
  119.     writeBus(3, 0xFF);
  120.     usleep(100000);
  121.     writeBus(3, 0x7F);
  122. }
  123.  
  124. // SKENOVAN KLAVESNICE
  125. char readChar()
  126. {
  127.     unsigned char row;
  128.     do {
  129.         writeBus(3, 3);
  130.         nanowait(0, 10000);
  131.         row = readBus(0);
  132.         switch (row) {
  133.         case 0xFE:
  134.             return '1';
  135.         case 0xFD:
  136.             return '4';
  137.         case 0xFB:
  138.             return '7';
  139.         case 0xF7:
  140.             return '*';
  141.         case 0xEF:
  142.             return '!';
  143.         }
  144.         writeBus(3, 5);
  145.         nanowait(0, 10000);
  146.         row = readBus(0);
  147.         switch (row) {
  148.         case 0xFE:
  149.             return '2';
  150.         case 0xFD:
  151.             return '5';
  152.         case 0xFB:
  153.             return '8';
  154.         case 0xF7:
  155.             return '0';
  156.         case 0xEF:
  157.             return '?';
  158.         }
  159.         writeBus(3, 6);
  160.         nanowait(0, 10000);
  161.         row = readBus(0);
  162.         switch (row) {
  163.         case 0xFE:
  164.             return '3';
  165.         case 0xFD:
  166.             return '6';
  167.         case 0xFB:
  168.             return '9';
  169.         case 0xF7:
  170.             return '#';
  171.         }
  172.         diff = ((int)((clock() - start))) / 100000;
  173.  
  174.         if (mode == 0) {
  175.             if (diff == 5) {
  176.                 start = clock();
  177.             }
  178.         }
  179.  
  180.     } while (1);
  181.  
  182.     return -1;
  183. }
  184.  
  185. /*
  186.  *
  187.  *
  188.  * */
  189. int writeBus(unsigned char adr, unsigned char value)
  190. {                                                                           // funkce pro zapis na sbernici
  191.     *(base + PCI_DATA_OUT) = value;                                     // zapis dat
  192.     *(base + PCI_ADDR) = adr;                                           // adresa
  193.     *(base + PCI_CTRL) = BIT_POWER | BIT_CSNOT | BIT_RDNOT;             // PWR=1 + WR=0
  194.     *(base + PCI_CTRL) = BIT_POWER | BIT_RDNOT;                         // PWR=1 + CS=0 + WR=0
  195.     usleep(10);                                                         // cekani
  196.     *(base + PCI_CTRL) = BIT_POWER | BIT_CSNOT | BIT_RDNOT;             // PWR=1 + WR=0
  197.     *(base + PCI_CTRL) = BIT_POWER | BIT_CSNOT | BIT_RDNOT | BIT_WRNOT; // PWR=1
  198.  
  199.     return 1;
  200. }
  201.  
  202. unsigned char readBus(unsigned char adr)
  203. { // funkce pro cteni dat ze sbernice
  204.     unsigned char value;
  205.     *(base + PCI_CTRL) = BIT_POWER | BIT_CSNOT | BIT_WRNOT; // PWR=1 + RD=0
  206.     *(base + PCI_ADDR) = adr;                               // adresa
  207.     *(base + PCI_CTRL) = BIT_POWER | BIT_WRNOT;             // PWR=1 + CS=0 + RD=0
  208.     usleep(10);                                             // 10us
  209.     value = *(base + PCI_DATA_IN);
  210.     usleep(50);                                                         // 10us
  211.     *(base + PCI_CTRL) = BIT_POWER | BIT_WRNOT;                         // PWR=1 + CS=0 + RD=0
  212.     *(base + PCI_CTRL) = BIT_POWER | BIT_CSNOT | BIT_WRNOT | BIT_RDNOT; // PWR=1 + CS=0 + RD=0
  213.  
  214.     return value; // hodnota
  215. }
  216.  
  217. void terminate()
  218. {
  219.     sleep(1);
  220.     close(sockfd);
  221. }
  222.  
  223. void writeSequenceLED(char* value)
  224. {
  225.     if (strlen(value) != 8) {
  226.         printf("Put only 8 letter strings to LCD!");
  227.         return;
  228.     }
  229.     int ln = 0, i;
  230.     for (i = 0; i < 8; i++) {
  231.         if (value[i] == '0') {
  232.             ln += pow(2, i);
  233.         }
  234.     }
  235.  
  236.     writeBus(BUS_LED_WR_o, ln);
  237.     nanowait(1, 0);
  238. }
  239.  
  240. void recieveMessage()
  241. {
  242.     writeString("Waiting", FALSE);
  243.  
  244.     start = clock();
  245.     while ((readChar()) == 0) {
  246.     }
  247.     clearLCD();
  248.     writeString("Message recvd!", FALSE);
  249.     sleep(2);
  250.     writeString(".....", FALSE);
  251.  
  252.     mode = 3;
  253.     readChar();
  254.  
  255.     clearLCD();
  256.     writeString("Message:", FALSE);
  257.  
  258.     getIdFromData();
  259.  
  260.     strcpy(buffer, "confirmmessage 42 ");
  261.  
  262.     strcat(buffer, serverMsgID);
  263.     strcat(buffer, "\n");
  264.  
  265.     write(sockfd, buffer, strlen(buffer));
  266.  
  267.     getMessageFromData();
  268.     writeString(data, TRUE);
  269.  
  270.     sleep(2);
  271.     readChar();
  272.  
  273.     mode = 0;
  274.  
  275.     memset(data, '\0', 50);
  276.     recv(sockfd, data, 49, 0);
  277.     sleep(1);
  278.     clearLCD();
  279.     memset(data, '\0', 50);
  280. }
  281.  
  282. void clearLCD()
  283. {
  284.     writeBus(BUS_LCD_INST_o, CHMOD_LCD_CLR);
  285.     usleep(10000); // cekani
  286. }
  287.  
  288. void writeString(char* s, int secondLine)
  289. {
  290.     int i, len;
  291.  
  292.     len = strlen(s);
  293.     if (len > 16)
  294.         len = 16;
  295.     for (i = 0; i < len; i++) {
  296.         if (secondLine == 0) {
  297.             writeChar(s[i], i);
  298.         } else {
  299.             writeChar(s[i], i + 0x40);
  300.         }
  301.     }
  302. }
  303.  
  304. void writeChar(char c, int position)
  305. {
  306.     while (readBus(BUS_LCD_STAT_o) == CHMOD_LCD_BF) { // waiting till can write
  307.         usleep(10000);
  308.     }
  309.     writeBus(BUS_LCD_INST_o, CHMOD_LCD_POS + position);
  310.     writeBus(BUS_LCD_WDATA_o, c);
  311. }
  312.  
  313. void getMessageFromData()
  314. {
  315.     int counter = 0;
  316.     int index = 0;
  317.     int i;
  318.  
  319.     memset(buffer, '\0', 50);
  320.  
  321.     for (i = 0; i < strlen(data); ++i) {
  322.  
  323.         if (data[i] == ' ') {
  324.             counter++;
  325.             continue;
  326.         }
  327.         if (counter == 4 && data[i] != ' ') {
  328.             buffer[index] = data[i];
  329.             index++;
  330.         }
  331.     }
  332.  
  333.     buffer[--index] = ' ';
  334.     strcpy(data, buffer);
  335. }
  336.  
  337. void getIdFromData()
  338. {
  339.     int counter = 0;
  340.     int index = 0;
  341.     int i;
  342.     for (i = 0; i < strlen(data); ++i) {
  343.  
  344.         if (data[i] == ' ') {
  345.             counter++;
  346.             continue;
  347.         }
  348.         if (counter == 2 && data[i] != ' ') {
  349.             buffer[index] = data[i];
  350.             index++;
  351.         }
  352.     }
  353.     serverMsgID[0] = buffer[0];
  354. }
  355.  
  356. void error(char* s)
  357. {
  358.     printf("%s\n", s);
  359.     exit(1);
  360. }
  361.  
  362. void initClient(int client_ID, char* host)
  363. {
  364.     servPort = 55556;
  365.  
  366.     memset(&clntAddr, '0', sizeof(clntAddr));
  367.  
  368.     if ((inet_pton(AF_INET, ipName, &clntAddr.sin_addr)) <= 0) {
  369.         error("INVALID HOST");
  370.     }
  371.  
  372.     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  373.         error("SOCKET NOT FOUND");
  374.     }
  375.  
  376.     clntAddr.sin_family = AF_INET;
  377.     clntAddr.sin_port = htons(servPort);
  378.     clntAddr.sin_addr.s_addr = inet_addr(ipName);
  379.  
  380.     if (connect(sockfd, (struct sockaddr*)&clntAddr, sizeof(clntAddr)) < 0) {
  381.         error("CONNECTION FAILURES");
  382.     }
  383. }
  384.  
  385. void initLCD()
  386. {
  387.     writeBus(BUS_LCD_INST_o, CHMOD_LCD_MOD);
  388.     usleep(10000); // cekani
  389.     writeBus(BUS_LCD_INST_o, CHMOD_LCD_MOD);
  390.     usleep(10000); // cekani
  391.     writeBus(BUS_LCD_INST_o, CHMOD_LCD_CLR);
  392.     usleep(10000); // cekani
  393.     writeBus(BUS_LCD_INST_o, CHMOD_LCD_DON);
  394.     usleep(10000); // cekani
  395. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement