1 #include <stdint.h>
2 #include <stdio.h>
3 #include <log/log.h>
4 #include "fp_test.h"
5 #include <cutils/properties.h>
6 
7 #define TAG "[FP_TEST] "
8 #define LOGI(format,...) ALOGI(TAG format,##__VA_ARGS__)
9 #define LOGD(format,...) ALOGD(TAG format,##__VA_ARGS__)
10 #define LOGE(format,...) ALOGE(TAG format,##__VA_ARGS__)
11 #define CLOGI(format,...) printf(TAG format,##__VA_ARGS__)
12 #define CLOGD(format,...) printf(TAG format,##__VA_ARGS__)
13 #define CLOGE(format,...) printf(TAG format,##__VA_ARGS__)
14 
15 #define LOGI_BOTH(format,...) {        \
16     ALOGI(TAG format,##__VA_ARGS__)       \
17     prinft(TAG format, ##__VA_ARGS__) \
18 }                                     \
19 
20 #define ARRAY_SIZE(arr)  (sizeof(arr) / sizeof(arr[0]))
21 #define STRING_SIZE 32
22 
23 #define FPS_SRV_PROP "fps_hal"
24 #define FPS_SRV_FULL_PROP "init.svc.fps_hal"
25 #define FPS_SRV_STATUS_PROP "vendor.fp.status"
26 
27 enum ErrorType {
28     OK,
29     ERROR
30 };
31 
32 static const char* const cmdUsage[] = {
33     "-------fp_test tool usage--------",
34     "fp_test -e: Enable FPS service",
35     "fp_test -d: Disable FPS service",
36     "fp_test -i: Idle Mode",
37     "fp_test -n: Navigation Mode",
38     "fp_test -a: Authentication Mode",
39     "---------------------------------",
40 };
41 
toolUsage(void)42 void toolUsage(void) {
43     int numCmdUsage = ARRAY_SIZE(cmdUsage);
44     for(int i = 0; i< numCmdUsage; i++)
45         CLOGI("%s\n",cmdUsage[i]);
46 }
47 
checkParameter(int num,char ** strArray)48 int checkParameter(int num, char **strArray)
49 {
50     int ret = 0;
51     char parameter[STRING_SIZE] = {0,};
52     if (num != 2 || (strlen(strArray[1]) > STRING_SIZE)) {
53         return -ERROR;
54     }
55     strcpy(parameter, strArray[1]);
56     if (!strncmp(parameter, "-a", sizeof("-a"))) {
57         CLOGI("Start Authentication Mode!\n");
58         LOGI("Start Authentication Mode!\n");
59         ret = 'a';
60     } else if (!strncmp(parameter, "-n", sizeof("-n"))) {
61         CLOGI("Start Navigation Mode!\n");
62         LOGI("Start Navigation Mode!\n");
63         ret = 'n';
64     } else if (!strncmp(parameter, "-i", sizeof("-i"))) {
65         CLOGI("Start Idle Mode!\n");
66         LOGI("Start Idle Mode!\n");
67         ret = 'n';
68     } else if (!strncmp(parameter, "-e", sizeof("-e"))) {
69         CLOGI("Start enabling FPS service!\n");
70         LOGI("Start enabling FPS service!\n");
71         ret = 'e';
72     } else if (!strncmp(parameter, "-d", sizeof("-d"))) {
73         CLOGI("Start disabling FPS service!\n");
74         LOGI("Start disabling FPS service!\n");
75         ret = 'd';
76     } else {
77         ret = -ERROR;
78     }
79     return ret;
80 }
81 
enable_disable_fps(bool set)82 int enable_disable_fps(bool set)
83 {
84     int ret  = 0;
85     // Set property to enable/disable fingerprint service
86     if (set == true) {
87        ret = property_set("ctl.start", FPS_SRV_PROP);
88     } else {
89        ret = property_set("ctl.stop", FPS_SRV_PROP);
90     }
91 
92     if (ret != 0) {
93         CLOGE("Failed to %s FPS service\n", set? "enable" : "disable");
94         LOGE("Failed to %s FPS service\n", set? "enable" : "disable");
95         return -ERROR;
96     }
97 
98     return ret;
99 }
100 
run_auth_cmd()101 int run_auth_cmd() {
102     RequestStatus hidlRet;
103     uint64_t operationId = 0;
104     uint32_t gid = 0;
105     char tempbuf[PROPERTY_VALUE_MAX];
106 
107     property_get(FPS_SRV_FULL_PROP, tempbuf, 0);
108     LOGE("%s : current fp service status is %s!\n",__func__, tempbuf);
109     if (!strncmp(tempbuf, "stopped", strlen("stopped"))) {
110         return -ERROR;
111     }
112 
113     sp<IBiometricsFingerprint> service = IBiometricsFingerprint::getService();
114     if (service == nullptr) {
115         CLOGE("%s : Fail to get FingerprintService!\n",__func__);
116         LOGE("%s : Fail to get FingerprintService!\n",__func__);
117         return -ERROR;
118     }
119 
120     hidlRet = service->authenticate(operationId, gid);
121     if (hidlRet == RequestStatus::SYS_OK) {
122         return OK;
123     } else {
124         return -ERROR;
125     }
126 }
127 
run_cancel_cmd()128 int run_cancel_cmd() {
129 
130     RequestStatus hidlRet;
131     char tempbuf[PROPERTY_VALUE_MAX];
132 
133     property_get(FPS_SRV_FULL_PROP, tempbuf, 0);
134     LOGE("%s : current fp service status is %s!\n",__func__, tempbuf);
135     if (!strncmp(tempbuf, "stopped", strlen("stopped"))) {
136         return -ERROR;
137     }
138 
139     sp<IBiometricsFingerprint> service = IBiometricsFingerprint::getService();
140     if (service == nullptr) {
141         CLOGE("%s : Fail to get FingerprintService!\n",__func__);
142         LOGE("%s : Fail to get FingerprintService!\n",__func__);
143         return -ERROR;
144     }
145 
146     hidlRet = service->cancel();
147     if (hidlRet == RequestStatus::SYS_OK) {
148         return OK;
149     } else {
150         return -ERROR;
151     }
152 }
153 
main(int argc,char * argv[])154 int main(int argc, char *argv[])
155 {
156     int input=0;
157     int32_t ret = 0;
158     LOGI("%s",__func__);
159     input = checkParameter(argc, argv);
160     if (input == -ERROR){
161         LOGE("Invalid Parameter\n");
162         CLOGE("Invalid Parameter\n");
163         toolUsage();
164         return -ERROR;
165     }
166 
167     switch (input) {
168         case 'e':
169             CLOGI("%s: Enable fingerprint service\n",__func__);
170             LOGI("%s: Enable fingerprint service\n",__func__);
171             ret = enable_disable_fps(true);
172             break;
173         case 'd':
174             CLOGI("%s: Disable fingerprint service\n",__func__);
175             LOGI("%s: Disable fingerprint service\n",__func__);
176             ret = enable_disable_fps(false);
177             break;
178         case 'a':
179             ret = run_auth_cmd();
180             break;
181         // For the rear fingerprint module, calling cancel() will go to the
182         // navigation mode by default.
183         // For other device not enabling naivgation feature, default mode will
184         // be "Idle" by invoking cancel().
185         case 'n':
186         case 'i':
187         default:
188             ret = run_cancel_cmd();
189             break;
190     }
191 
192     if (ret != OK)
193         CLOGE("FP HIDL fail to excute cmd '%c'\n", input);
194     else
195         CLOGI("FP HIDL excute cmd '%c' successfully\n", input);
196 
197     return ret;
198 
199 }
200 
201