main.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. /*
  2. * X10 IP播报和出厂设置检测程序
  3. * 2019.7.30 lpc
  4. *
  5. * Intercom device Funtions: Dial && PlayIP
  6. * Speaker device Funtions: PlayIP && FactoryREST
  7. */
  8. #include <sys/poll.h>
  9. #include <string.h>
  10. #include <signal.h>
  11. #include <sys/time.h>
  12. #include <time.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <sys/types.h>
  16. #include <unistd.h>
  17. #include <fcntl.h>
  18. #include <pthread.h>
  19. #define Boolean int
  20. #define TRUE 1
  21. #define FALSE 0
  22. #define MAX_PIPE_BUFSIZE 256
  23. static int playip_lock = FALSE;
  24. static int press_down = FALSE;
  25. static enum devType
  26. {
  27. INTERCOM = 0,
  28. SPEAKER
  29. };
  30. static int devType;
  31. Boolean get_ip(char * pv)
  32. {
  33. FILE * fp;
  34. char cmdbuf[128], value[32];
  35. sprintf(cmdbuf,"/sbin/ifconfig eth0 | grep inet | cut -d\":\" -f2 | cut -d\" \" -f1");
  36. fp = popen(cmdbuf, "r");
  37. if (fp == NULL) {
  38. // printf("Fail to open pipe\n");
  39. return FALSE;
  40. }
  41. memset(value,0,sizeof(value));
  42. if (!feof(fp) && fgets(value,MAX_PIPE_BUFSIZE,fp) != NULL)
  43. ;
  44. // printf("value:%s\n", value);
  45. else {
  46. printf("ip wrong\n");
  47. return FALSE;
  48. }
  49. pclose(fp);
  50. if(strlen(value) < 10)
  51. return FALSE;
  52. strcpy(pv,value);
  53. return TRUE;
  54. }
  55. int PlayIP()
  56. {
  57. //add by ssc 2019-12-26
  58. char language[32];
  59. FILE *fp = popen("sysconf /etc/speaker.conf get system language","r");
  60. if(!fp)
  61. perror("popen wrong");
  62. bzero(language,sizeof(language));
  63. fread(language,1,sizeof(language),fp);
  64. pclose(fp);
  65. language[strlen(language)] = '\0';
  66. playip_lock = TRUE;
  67. char ipaddr[16],cmd_line[240];
  68. if(!get_ip(ipaddr)) {
  69. if (strcmp(language, "en") == 0){
  70. system("mpg123 -r 48000 /home/new-speaker/target/share/sounds/en/get_ip_failed.mp3");
  71. }else{
  72. system("mpg123 -r 48000 /home/new-speaker/target/share/sounds/cn/get_ip_failed.mp3");
  73. }
  74. return 0;
  75. }
  76. if (strcmp(language, "en") == 0){
  77. strcpy(cmd_line,"cd /home/new-speaker/target/share/sounds/en/;mpg123 -r 48000 ");
  78. }else{
  79. strcpy(cmd_line,"cd /home/new-speaker/target/share/sounds/cn/;mpg123 -r 48000 ");
  80. }
  81. int i;
  82. for (i=0;i<strlen(ipaddr);i++){
  83. switch(ipaddr[i])
  84. {
  85. case '0':
  86. strcat(cmd_line,"digit-0.mp3 ");
  87. break;
  88. case '1':
  89. strcat(cmd_line,"digit-1.mp3 ");
  90. break;
  91. case '2':
  92. strcat(cmd_line,"digit-2.mp3 ");
  93. break;
  94. case '3':
  95. strcat(cmd_line,"digit-3.mp3 ");
  96. break;
  97. case '4':
  98. strcat(cmd_line,"digit-4.mp3 ");
  99. break;
  100. case '5':
  101. strcat(cmd_line,"digit-5.mp3 ");
  102. break;
  103. case '6':
  104. strcat(cmd_line,"digit-6.mp3 ");
  105. break;
  106. case '7':
  107. strcat(cmd_line,"digit-7.mp3 ");
  108. break;
  109. case '8':
  110. strcat(cmd_line,"digit-8.mp3 ");
  111. break;
  112. case '9':
  113. strcat(cmd_line,"digit-9.mp3 ");
  114. break;
  115. case '.':
  116. strcat(cmd_line,"dian.mp3 ");
  117. break;
  118. }
  119. }
  120. // printf("cmd-line:%s\n", cmd_line);
  121. system(cmd_line);
  122. playip_lock = FALSE;
  123. return 0;
  124. }
  125. static int checkSIPActive()
  126. {
  127. char enable[8];
  128. FILE *fp1;
  129. bzero(enable,sizeof(enable));
  130. fp1 = popen("sysconf /etc/speaker.conf get system enabled", "r");
  131. fread(enable,1,sizeof(enable),fp1);
  132. pclose(fp1);
  133. if(!strcmp(enable,"yes")) return TRUE;
  134. else
  135. return FALSE;
  136. }
  137. void *thread_playIP(void *p)
  138. {
  139. if(!playip_lock){
  140. system("/etc/scripts/change_output_vol.sh reduce;/etc/scripts/pa_mute.sh 0");
  141. PlayIP();
  142. system("/etc/scripts/pa_mute.sh 1;/etc/scripts/change_output_vol.sh recover");
  143. }
  144. pthread_exit(NULL);
  145. }
  146. void whoami()
  147. {
  148. char tmp[32];
  149. FILE *fp = popen("sysconf /etc/speaker.conf get system model","r");
  150. if(!fp)
  151. perror("popen wrong");
  152. bzero(tmp,sizeof(tmp));
  153. fread(tmp,1,sizeof(tmp),fp);
  154. pclose(fp);
  155. tmp[strlen(tmp)] = '\0';
  156. if(!strncasecmp(tmp, "SH30", 4) || !strncasecmp(tmp, "SW15", 4) || !strncasecmp(tmp, "SC15", 4))
  157. devType = SPEAKER;
  158. else if (!strncasecmp(tmp, "IA03", 4) || !strncasecmp(tmp, "IV03", 4))
  159. devType = INTERCOM;
  160. else
  161. devType = SPEAKER;
  162. }
  163. void emergencyCall()
  164. {
  165. char tmp[32],exten[15],buf[128];
  166. FILE *fp1;
  167. bzero(tmp,sizeof(tmp));
  168. fp1 = popen("sysconf /etc/speaker.conf get intercom repress_cancel", "r");
  169. fread(tmp,1,sizeof(tmp),fp1);
  170. pclose(fp1);
  171. if (!strcmp(tmp,"no")){
  172. bzero(exten,sizeof(exten));
  173. fp1 = popen("sysconf /etc/speaker.conf get intercom onekey_num", "r");
  174. fread(exten,1,sizeof(exten),fp1);
  175. pclose(fp1);
  176. if(strlen(exten)){
  177. sprintf(buf,"linphonecsh dial %s",exten);
  178. system(buf);
  179. }
  180. } else {
  181. bzero(tmp,sizeof(tmp));
  182. fp1 = popen("sysconf /userdata/tmp_state.conf get intercom onekey_state", "r");
  183. fread(tmp,1,sizeof(tmp),fp1);
  184. pclose(fp1);
  185. if(strlen(tmp)) {
  186. if(!strncasecmp(tmp,"idle",4)) // Dial action
  187. {
  188. bzero(exten,sizeof(exten));
  189. fp1 = popen("sysconf /etc/speaker.conf get intercom onekey_num", "r");
  190. fread(exten,1,sizeof(exten),fp1);
  191. pclose(fp1);
  192. if(strlen(exten)){
  193. sprintf(buf,"linphonecsh dial %s &",exten);
  194. system(buf);
  195. }
  196. } else if (!strncasecmp(tmp,"inUse",5)) { // Cancel or Hangup
  197. system("linphonecsh generic terminate");
  198. system("sysconf /userdata/tmp_state.conf set intercom onekey_state idle");
  199. }
  200. }
  201. }
  202. }
  203. int main(int argc, char *argv[]){
  204. struct pollfd fdset;
  205. int key1_fd, ret, len, count, i;
  206. char buf[128];
  207. time_t lastime, newtime;
  208. FILE *fp1;
  209. pthread_t thread;
  210. // Short delay
  211. sleep(5);
  212. /* KEY1 */
  213. key1_fd = open("/sys/class/gpio/gpio140/value", O_RDONLY);
  214. read(key1_fd, buf, sizeof(buf));
  215. lseek(key1_fd, 0, SEEK_SET);
  216. whoami();
  217. while(1)
  218. {
  219. memset(&fdset, 0x00, sizeof(struct pollfd));
  220. fdset.fd = key1_fd;
  221. fdset.events = POLLPRI;
  222. ret = poll(&fdset, 1, 3000);
  223. if(ret < 0){
  224. printf("npoll() faild! \n");
  225. return -1;
  226. }
  227. if(ret == 0)
  228. continue;
  229. /*KEY1*/
  230. if( fdset.revents & POLLPRI )
  231. {
  232. count = 0;
  233. for(i=0;i<50;i++){ // 50ms
  234. bzero(buf,sizeof(buf));
  235. read(fdset.fd, buf, sizeof(buf));
  236. lseek(fdset.fd, 0, SEEK_SET);
  237. if(buf[0]-'0' == 0)
  238. count++;
  239. usleep(1000);
  240. }
  241. // printf("zero counts: %d\n", count);
  242. if (count >= 30) {
  243. press_down = TRUE;
  244. time(&newtime);
  245. printf("KEY DOWN\n");
  246. } else {
  247. time(&lastime);
  248. len = lastime - newtime;
  249. printf("KEY UP, Time:%d\n", len);
  250. if(press_down){
  251. press_down = FALSE;
  252. if(devType == SPEAKER){
  253. if ( len >= 2 && len <= 9) // Play IP
  254. pthread_create(&thread, NULL, thread_playIP, NULL);
  255. else if ( len >= 1000)
  256. pthread_create(&thread, NULL, thread_playIP, NULL);
  257. else if ( len >= 10){
  258. system("/etc/scripts/play_rebooting.sh;rm -f /oem/.userdata && /sbin/reboot");
  259. }
  260. } else {
  261. if (len >= 5)
  262. pthread_create(&thread, NULL, thread_playIP, NULL);
  263. else // Make a phone call.
  264. if(checkSIPActive())
  265. emergencyCall();
  266. }
  267. }
  268. }
  269. }
  270. }
  271. }