{"id":333,"date":"2018-01-15T05:19:20","date_gmt":"2018-01-15T07:19:20","guid":{"rendered":"http:\/\/vejas.defas.lt\/?p=333"},"modified":"2018-10-27T17:01:46","modified_gmt":"2018-10-27T19:01:46","slug":"rpi-programos-kodas","status":"publish","type":"post","link":"http:\/\/vejas.defas.lt\/?p=333","title":{"rendered":"Rpi programos kodas"},"content":{"rendered":"<p>Kompiliavimo eilut\u0117<\/p>\n<pre style=\"font-size: small;\">gcc -o test3.o -lmysqlclient -I\/usr\/local\/include -L\/usr\/local\/lib -lwiringPi test2.c\r\n<\/pre>\n<p>Programos kodas:<\/p>\n<pre style=\"font-size: small;\">\/*****Configures an Raspberry Pi as an SPI master and demonstrates bidirectional communication with an***\/\r\n#include &lt;mysql\/mysql.h&gt;        \/\/used by mysql\r\n#include              \/\/used by mysql\r\n#include \r\n#include &lt;sys\/ioctl.h&gt;\r\n#include &lt;linux\/spi\/spidev.h&gt;\r\n#include \r\n#include \r\n#include              \/\/used by string\r\n\/\/#include \r\n\/*******Declare Global Variables*****************************\/\r\nunsigned short int spiTxRx(char txDat);\r\nint fd;\r\nunsigned char AR_command[]={0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\r\n\/\/AR_command antras baitas nurodo siunciamos komandos ilgi be pirmo ir antro baitu jis uzpildomas siunciant seka\r\nunsigned char AR_Komanda[512];\r\nunsigned int AR_Komanda_Size;\r\nunsigned char AR_command1[] = {0x20, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12};\r\nunsigned char spi_bitsPerWord;\r\nunsigned char spi_mode;\r\nstruct connection_details{char *server;char *user;char *password;char *database;};\r\nMYSQL* mysql_connection_setup(struct connection_details mysql_details){\/\/ first of all create a mysql instance and initialize the variables within\r\n        MYSQL *connection = mysql_init(NULL); \/\/ connect to the database with the details attached.\r\n        if (!mysql_real_connect(connection,mysql_details.server, mysql_details.user, mysql_details.password, mysql_details.database, 0, NULL, 0)) {\r\n                printf(\"Conection error : %s\\n\", mysql_error(connection));exit(1);\r\n        }\r\n        return connection;\r\n}\r\nMYSQL_RES* mysql_perform_query(MYSQL *connection, char *sql_query){\r\n        if (mysql_query(connection, sql_query)) {\/\/ send the query to the database\r\n                printf(\"MySQL query error : %s\\n\", mysql_error(connection));\r\n                exit(1);\r\n        }\r\n        return mysql_use_result(connection);\r\n}\r\nstruct connection_details mysqlD;\r\nMYSQL *conn;                            \/\/ the connection\r\nMYSQL_RES *res;                         \/\/ the results\r\nMYSQL_ROW row;                          \/\/ the results row (line by line)\r\n\/**********************************************************\r\nMain\r\n    Setup SPI\r\n    Open file spidev0.0 (chip enable 0) for read\/write access with the file descriptor \"fd\"\r\n    Configure transfer speed(1MHz)\r\n***********************************************************\/\r\nunsigned short int resu[512];\r\nint main (void){\r\n    mysqlD.server = \"localhost\";                \/\/ where the mysql database is\r\n    mysqlD.user = \"vejojegaines\";               \/\/ the root user of mysql\r\n    mysqlD.password = \"vejojegaines\";           \/\/ the password of the root user in mysql\r\n    mysqlD.database = \"vejojegaines\";           \/\/ the databse to pick\r\n    conn = mysql_connection_setup(mysqlD);      \/\/ connect to the mysql database\r\n    unsigned char result[20];\r\n    unsigned char buffH[1];\r\n    unsigned char buffL[1];\r\n    fd = open(\"\/dev\/spidev0.0\", O_RDWR);\r\n    unsigned int speed =100000;\r\n    ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &amp;speed);\r\n    unsigned short int i;\r\n    unsigned short int j=0;\r\n    unsigned short int jmax=30;\r\n    unsigned short int TS=100;\r\n    unsigned short int TS_Prev=100;\r\n    unsigned short int *TSa2Point;\r\n    unsigned char qu[255];\r\n    char *lai;\r\n    unsigned int retx;\r\n    unsigned int iii;\r\n    unsigned int iiii;\r\n    unsigned short int DisableWork=0;\r\n    unsigned short int DisableWorkPrevious=0;\r\n    unsigned char Komanda;\r\n    void KomandosVykdymas();\r\n    void LokalusDarbas();\r\n    unsigned int id;\r\n    char *pChar;\r\n    while (1) {\r\n        res = mysql_perform_query(conn, \"select id, Komanda, Atlikta from komandos where Atlikta=0 order by ModData asc limit 1\");\r\n        while ((row = mysql_fetch_row(res))!=NULL) {\r\n            for (iiii=0; iiii&lt;strlen(row[1]); iiii=iiii+2) {\r\n                AR_Komanda[iiii\/2]=hex_char_to_bin(row[1][iiii])*16+hex_char_to_bin(row[1][iiii+1]);\r\n            }\r\n            AR_Komanda_Size=strlen(row[1])\/2;\r\n            if (atoi(row[2])==0) {DisableWork=1;} else {DisableWork=0;}\r\n            if (DisableWork!=DisableWorkPrevious) {\r\n                \/\/printf(\"Darbo rezimas: %d\\n\", DisableWork);\r\n                DisableWorkPrevious=DisableWork;\r\n            }\r\n            id=atoi(row[0]);\r\n        }\r\n        mysql_free_result(res);\r\n        if (DisableWork==1) {\r\n            KomandosVykdymas();\r\n            sprintf(qu, \"update komandos set Atlikta=1 where id=%d\", id);\r\n            res = mysql_perform_query(conn, qu);\r\n            mysql_free_result(res);\r\n            DisableWork=0;\r\n          } else {\r\n            \/\/LokalusDarbas();\r\n        }\r\n        LokalusDarbas();        \/\/testavimui\r\n        usleep(1000000);\/\/sekundes uzdelsimas tarp duomenu uzklausu\r\n    }\r\n    exit(1);\r\n}\r\nvoid KomandosVykdymas() {\r\n    unsigned int i, pakartojimas;\r\n    printf(\"(ilgis=%d) vykdymas\\n\", AR_Komanda_Size);\r\n    SR_packet(AR_Komanda, AR_Komanda_Size);\r\n    while (SR_packet(AR_Komanda, AR_Komanda_Size)==0){\r\n        for (i=0; i&lt;AR_Komanda_Size; i++) {printf(\"%02X \", AR_Komanda[i]);} printf(\"Kartojimas Komandos (%d baitu ilgis) vykdymas (%u kartas)\\n\", AR_Komanda_Size, pakartojimas); if (pakartojimas++&gt;100) {\r\n            printf(\"Pasiektas limitas kartojimui: %d. Vykdymas nesekmingas\\n\");\r\n            break;\r\n        }\r\n    }\r\n}\r\nvoid LokalusDarbas() {\r\n    unsigned int A0, A1, A2, A3, A4, A5, TS1, TS2, VGRA, VGRB, GenHzA, GenHzB;\r\n    unsigned int i, pakartojimas;\r\n    unsigned char qu[255];\r\n    while (SR_packet(AR_command, sizeof(AR_command))==0){\r\n        for (i=0; i&lt;sizeof(AR_command); i++) {printf(\"%02X \", AR_command[i]);} SR_packet(AR_command, sizeof(AR_command)); printf(\"Kartojimas Komandos (%d baitu ilgis) vykdymas (%u kartas)\\n\", sizeof(AR_command), pakartojimas); if (pakartojimas++&gt;100) {\r\n            printf(\"Pasiektas limitas kartojimui (LokalusDarbas): %d. Vykdymas nesekmingas\\n\");\r\n            return ;\r\n            break;\r\n        }\r\n    }\r\n    printf(\"Uzklausa(lokali):\");\r\n    for (i=0; i&lt;sizeof(AR_command); i++) {printf(\"%02X \", AR_command[i]);}\r\n    printf(\"Rezultatas:\");\r\n    for (i=0; i&lt;sizeof(AR_command); i++) {printf(\"%02X \", resu[i]);}\r\n    printf(\"\\n \");\r\n        A0=resu[3] + resu[4]*256;\r\n        A1=resu[5] + resu[6]*256;\r\n        A2=resu[7] + resu[8]*256;\r\n        A3=resu[9] + resu[10]*256;\r\n        A4=resu[11] + resu[12]*256;\r\n        A5=resu[13] + resu[14]*256;\r\n        VGRA=resu[15] + resu[16]*256;\r\n        VGRB=resu[17] + resu[18]*256;\r\n        GenHzA=resu[19] + resu[20]*256;\r\n        GenHzB=resu[21] + resu[22]*256;\r\n        TS1=resu[23] + resu[24]*256;\r\n        TS2=resu[25] + resu[26]*256;\r\n        \/\/TSa2Point=&amp;TSa2[0];\r\n        \/\/TS=AtmestiKrastinesReikmes(TSa2Point, jmax);\r\n        \/\/int A0min=0xFFFF;int A0max=0;for (j=0; j&lt;jmax; j++) {if (A0a[j]&gt;A0max) A0max=A0a[j];if (A0a[j]&lt;A0min) A0min=A0a[j];}\r\n        \/\/int A1min=0xFFFF;int A1max=0;for (j=0; j&lt;jmax; j++) {if (A1a[j]&gt;A1max) A1max=A1a[j];if (A1a[j]&lt;A1min) A1min=A1a[j];}\r\n        \/\/int A2min=0xFFFF;int A2max=0;for (j=0; j&lt;jmax; j++) {if (A2a[j]&gt;A2max) A2max=A2a[j];if (A2a[j]&lt;A2min) A2min=A2a[j];}\r\n        \/\/int A3min=0xFFFF;int A3max=0;for (j=0; j&lt;jmax; j++) {if (A3a[j]&gt;A3max) A3max=A3a[j];if (A3a[j]&lt;A3min) A3min=A3a[j];}\r\n        \/\/int A4min=0xFFFF;int A4max=0;for (j=0; j&lt;jmax; j++) {if (A4a[j]&gt;A4max) A4max=A4a[j];if (A4a[j]&lt;A4min) A4min=A4a[j];}\r\n        \/\/int A5min=0xFFFF;int A5max=0;for (j=0; j&lt;jmax; j++) {if (A5a[j]&gt;A5max) A5max=A5a[j];if (A5a[j]&lt;A5min) A5min=A5a[j];}\r\n        sprintf(qu, \"insert into vejojegaines.spi values (\\\"\\\",%i,%i,%i,%i,%i,%i,%i,%i,%i,null)\",A0,A1,A2,A3,A4,A5, VGRA+VGRB*256*256, GenHzA+GenHzB*256*256, TS1+TS2*256*256);\r\n        \/\/printf(\"qu=%s\\n\", qu);\r\n        res=mysql_perform_query(conn, qu);      \/\/ assign the results return to the MYSQL_RES pointer\r\n        mysql_free_result(res);                 \/\/clean up the database result set\r\n}\r\nint SR_packet(char AR[], int KKiek) {\r\n    unsigned short int cs, css, i;\r\n    cs=spiTxRx(0x81);\/\/pradinis sekos baitas\r\n    cs=0;\/\/pirmas baitas dummy - jis neapskaitomas issiunciamojoje kontrolineje sumoje\r\n    css=0x81;   \/\/pirmas baitas ir pradeda kontrolin\u2592 siun\u2592iamos bait\u2592 sekos sum\u2592\r\n    for (i=0; i&lt;KKiek; i++) { if (i==1) {AR[i]=KKiek-2;}\/\/siunciamu baitu kiekis irasomas i seka, kad priimantis irenginys zinotu ilgi resu[i] = spiTxRx(AR[i]); cs+=resu[i];if(cs&gt;255) {cs=cs-256;}\r\n        css+=AR[i];if(css&gt;255) {css=css-256;}\r\n    }\r\n    resu[i]=spiTxRx(255-css);\/\/kontrolin\u2592 siunciam\u2592 bait\u2592 sekos suma\r\n    cs+=resu[i++];if(cs&gt;255) {cs=cs-256;}\r\n    resu[i]=spiTxRx(0x00);\/\/finalinis baitas 'dymmy' skirtas nuskaityti paskutin\u2592 gaunam\u2592 bait\u2592\r\n    cs+=resu[i];if(cs&gt;255) {cs=cs-256;}\r\n    if (cs!=0xff){\r\n        printf(\"Bloga kontroline suma (checksum send) sc=%x\\n\", cs);return 0;\r\n        } else {\r\n        return 1;\r\n    }\r\n}\r\n\/**********************************************************\r\nspiTxRx\r\n    Transmits one byte via the SPI device, and returns one byte as the result.\r\n    Establishes a data structure, spi_ioc_transfer as defined by spidev.h and loads the various members to pass the data\r\n    and configuration parameters to the SPI device via IOCTL\r\n    Local variables txDat and rxDat are defined and passed by reference.\r\n***********************************************************\/\r\nunsigned short int spiTxRx(char txDat){\r\n    unsigned char rxDat;\r\n    struct spi_ioc_transfer spi;\r\n    memset (&amp;spi, 0, sizeof (spi));\r\n    spi.tx_buf        = (unsigned long)&amp;txDat;\r\n    spi.rx_buf        = (unsigned long)&amp;rxDat;\r\n    spi.len           = 1;\r\n    ioctl (fd, SPI_IOC_MESSAGE(1), &amp;spi);\r\n    return rxDat;\r\n}\r\nvoid ToMySQL(char qu[]) {\r\n        res=mysql_perform_query(conn, qu);      \/\/ assign the results return to the MYSQL_RES pointer\r\n        mysql_free_result(res);                 \/\/clean up the database result set\r\n}\r\nint AtmestiKrastinesReikmes(unsigned short int *ar_ptr, int jmax) {\r\n    unsigned short int i;\r\n    unsigned short int max=0;\r\n    unsigned short int min=1024;\r\n    unsigned int res=0;\r\n    unsigned long int res1=55555555;\r\n    unsigned short int ct=0;\r\n    for (i=0;i&lt;jmax; i++) { if (*(ar_ptr+i)&gt;max) max=*(ar_ptr+i);\r\n        if (*(ar_ptr+i)&lt;min) min=*(ar_ptr+i);\r\n        \/\/printf(\"%hu,\", *(ar_ptr+i));\r\n    }\r\n    for (i=0;i&lt;jmax; i++) {\r\n        if (*(ar_ptr+i)!=max &amp;&amp; *(ar_ptr+i)!=min) {\r\n            res+=*(ar_ptr+i);\r\n            ct++;\r\n        }\r\n    }\r\n    if (ct==0) {\r\n        \/\/printf(\".max:%hu, min: %hu, ct: %hu, res1: %li,--------\\n\", max, min, ct, max);\r\n        return max;\r\n      } else {\r\n        res1=(double)res\/(double)ct;\r\n        res=res1;\r\n        \/\/printf(\".max:%hu, min: %hu, ct: %hu, res1: %li,--------\\n\", max, min, ct, res);\r\n        return res;\r\n    }\r\n}\r\nint hex_char_to_bin(unsigned char *c){\/\/ TODO handle default \/ error\r\n    switch(toupper(c)) {\r\n        case '0': return 0;\r\n        case '1': return 1;\r\n        case '2': return 2;\r\n        case '3': return 3;\r\n        case '4': return 4;\r\n        case '5': return 5;\r\n        case '6': return 6;\r\n        case '7': return 7;\r\n        case '8': return 8;\r\n        case '9': return 9;\r\n        case 'A': return 10;\r\n        case 'B': return 11;\r\n        case 'C': return 12;\r\n        case 'D': return 13;\r\n        case 'E': return 14;\r\n        case 'F': return 15;\r\n    }\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Kompiliavimo eilut\u0117 gcc -o test3.o -lmysqlclient -I\/usr\/local\/include -L\/usr\/local\/lib -lwiringPi test2.c Programos kodas: \/*****Configures an Raspberry Pi as an SPI master and demonstrates bidirectional communication with an***\/ #include &lt;mysql\/mysql.h&gt; \/\/used by mysql #include \/\/used by mysql #include #include &lt;sys\/ioctl.h&gt; #include &lt;linux\/spi\/spidev.h&gt; #include #include #include \/\/used by string \/\/#include \/*******Declare Global Variables*****************************\/ unsigned short int spiTxRx(char txDat); &hellip; <a href=\"http:\/\/vejas.defas.lt\/?p=333\" class=\"more-link\">Skaityti toliau: <span class=\"screen-reader-text\">Rpi programos kodas<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_forum_subforum_count":0,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-333","post","type-post","status-publish","format-standard","hentry","category-be-kategorijos"],"acf":[],"_links":{"self":[{"href":"http:\/\/vejas.defas.lt\/index.php?rest_route=\/wp\/v2\/posts\/333","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/vejas.defas.lt\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/vejas.defas.lt\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/vejas.defas.lt\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/vejas.defas.lt\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=333"}],"version-history":[{"count":6,"href":"http:\/\/vejas.defas.lt\/index.php?rest_route=\/wp\/v2\/posts\/333\/revisions"}],"predecessor-version":[{"id":459,"href":"http:\/\/vejas.defas.lt\/index.php?rest_route=\/wp\/v2\/posts\/333\/revisions\/459"}],"wp:attachment":[{"href":"http:\/\/vejas.defas.lt\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/vejas.defas.lt\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=333"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/vejas.defas.lt\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}