xref: /OK3568_Linux_fs/external/rk_pcba_test/pcba_minui/script.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun 
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun #include <sys/types.h>
4*4882a593Smuzhiyun #include <sys/ipc.h>
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include <ctype.h>
7*4882a593Smuzhiyun #include <errno.h>
8*4882a593Smuzhiyun #include <string.h>
9*4882a593Smuzhiyun #include <stdlib.h>
10*4882a593Smuzhiyun #include <stdio.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun //#include "shm.h"
13*4882a593Smuzhiyun #include "script.h"
14*4882a593Smuzhiyun #include "debug.h"
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define DATA_TYPE_SINGLE_WORD           1
18*4882a593Smuzhiyun #define DATA_TYPE_STRING                2
19*4882a593Smuzhiyun #define DATA_TYPE_MULTI_WORD            3
20*4882a593Smuzhiyun #define DATA_TYPE_GPIO                  4
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun struct script_head
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun     int mainkey_cnt;
25*4882a593Smuzhiyun     int version[3];
26*4882a593Smuzhiyun };
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun struct script_mainkey
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun     char name[32];
31*4882a593Smuzhiyun     int length;
32*4882a593Smuzhiyun     int offset;
33*4882a593Smuzhiyun };
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun struct script_subkey
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun     char name[32];
38*4882a593Smuzhiyun     int offset;
39*4882a593Smuzhiyun     int pattern;
40*4882a593Smuzhiyun };
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun static char *script_buf = NULL;
43*4882a593Smuzhiyun static int mainkey_cnt = 0;
44*4882a593Smuzhiyun 
init_script(char * buf)45*4882a593Smuzhiyun int init_script(char* buf)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun #if 0
48*4882a593Smuzhiyun     script_buf = shmat(shmid, 0, 0);
49*4882a593Smuzhiyun     if (script_buf == (void *)-1) {
50*4882a593Smuzhiyun         db_error("script: attach the share memory segment failed(%s)\n",
51*4882a593Smuzhiyun                 strerror(errno));
52*4882a593Smuzhiyun         return -1;
53*4882a593Smuzhiyun     }
54*4882a593Smuzhiyun #else
55*4882a593Smuzhiyun    script_buf = buf;
56*4882a593Smuzhiyun #endif
57*4882a593Smuzhiyun     struct script_head *head = (struct script_head *)script_buf;
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun     mainkey_cnt = head->mainkey_cnt;
60*4882a593Smuzhiyun     db_debug("script: main key count #%d\n", mainkey_cnt);
61*4882a593Smuzhiyun     db_msg("script: V%d.%d.%d\n", head->version[0],
62*4882a593Smuzhiyun             head->version[1], head->version[2]);
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun     return 0;
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun 
deinit_script(void)67*4882a593Smuzhiyun void deinit_script(void)
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun     if (script_buf) {
70*4882a593Smuzhiyun        // shmdt(script_buf);
71*4882a593Smuzhiyun         script_buf = NULL;
72*4882a593Smuzhiyun     }
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun     mainkey_cnt = 0;
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun 
script_mainkey_cnt(void)77*4882a593Smuzhiyun int script_mainkey_cnt(void)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun     return mainkey_cnt;
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun 
script_mainkey_name(int idx,char * name)82*4882a593Smuzhiyun int script_mainkey_name(int idx, char *name)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun     struct script_mainkey *mainkey;
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun     if (script_buf == NULL) {
87*4882a593Smuzhiyun         return -1;
88*4882a593Smuzhiyun     }
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun     mainkey = (struct script_mainkey *)(script_buf + sizeof(struct script_head) +
91*4882a593Smuzhiyun             idx * sizeof(struct script_mainkey));
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun     strncpy(name, mainkey->name, 32);
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun     return 0;
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun 
script_fetch(char * main_name,char * sub_name,int value[],int count)98*4882a593Smuzhiyun int script_fetch(char *main_name, char *sub_name, int value[], int count)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun     int i, j;
101*4882a593Smuzhiyun     struct script_mainkey *mainkey;
102*4882a593Smuzhiyun     struct script_subkey *subkey;
103*4882a593Smuzhiyun     int pattern, wordcnt;
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun     /* check parameter */
106*4882a593Smuzhiyun     if (script_buf == NULL) {
107*4882a593Smuzhiyun         return -1;
108*4882a593Smuzhiyun     }
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun     if (main_name == NULL || sub_name == NULL) {
111*4882a593Smuzhiyun         return -1;
112*4882a593Smuzhiyun     }
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun     if (value == NULL) {
115*4882a593Smuzhiyun         return -1;
116*4882a593Smuzhiyun     }
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun     memset(value, 0, sizeof(int) * count);
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun     /* search main key */
121*4882a593Smuzhiyun     for (i = 0; i < mainkey_cnt; i++) {
122*4882a593Smuzhiyun         mainkey = (struct script_mainkey *)(script_buf +
123*4882a593Smuzhiyun                 sizeof(struct script_head) + i * sizeof(struct script_mainkey));
124*4882a593Smuzhiyun         if (strncmp(mainkey->name, main_name, 31)) {
125*4882a593Smuzhiyun             continue;
126*4882a593Smuzhiyun         }
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun         /* search sub key */
129*4882a593Smuzhiyun         for (j = 0; j < mainkey->length; j++) {
130*4882a593Smuzhiyun             subkey = (struct script_subkey *)(script_buf +
131*4882a593Smuzhiyun                      (mainkey->offset << 2) +
132*4882a593Smuzhiyun                      (j * sizeof(struct script_subkey)));
133*4882a593Smuzhiyun             if (strncmp(subkey->name, sub_name, 31)) {
134*4882a593Smuzhiyun                 continue;
135*4882a593Smuzhiyun             }
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun             pattern = (subkey->pattern >> 16) & 0xffff;
138*4882a593Smuzhiyun             wordcnt = subkey->pattern & 0xffff;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun             switch (pattern) {
141*4882a593Smuzhiyun                 case DATA_TYPE_SINGLE_WORD:
142*4882a593Smuzhiyun                     value[0] = *(int *)(script_buf + (subkey->offset << 2));
143*4882a593Smuzhiyun                     break;
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun                 case DATA_TYPE_STRING:
146*4882a593Smuzhiyun                     if (wordcnt == 0)
147*4882a593Smuzhiyun                         break;
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun                     if (wordcnt > count)
150*4882a593Smuzhiyun                         wordcnt = count;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun                     memcpy((char *)value, script_buf + (subkey->offset << 2),
153*4882a593Smuzhiyun                             wordcnt << 2);
154*4882a593Smuzhiyun                     break;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun                 case DATA_TYPE_GPIO:
157*4882a593Smuzhiyun                     db_debug("%s: L%d fix me\n", __func__, __LINE__);
158*4882a593Smuzhiyun                     break;
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun                 default:
161*4882a593Smuzhiyun                     db_debug("%s: L%d fix me\n", __func__, __LINE__);
162*4882a593Smuzhiyun                     break;
163*4882a593Smuzhiyun             }
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun             return 0;
166*4882a593Smuzhiyun         }
167*4882a593Smuzhiyun     }
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun     return -1;
170*4882a593Smuzhiyun }
171