Yu.Ding há 6 dias atrás
pai
commit
a84482fd16
72 ficheiros alterados com 173 adições e 1638 exclusões
  1. 1 1
      Modules/play_ip/Makefile
  2. 0 750
      Modules/play_ip/cJSON.c
  3. 0 149
      Modules/play_ip/cJSON.h
  4. 0 173
      Modules/play_ip/dictionary.h
  5. 0 358
      Modules/play_ip/iniparser.h
  6. 22 26
      Modules/play_ip/main.c
  7. 0 20
      Modules/playip/Makefile
  8. 0 92
      Modules/playip/main.c
  9. 6 6
      Modules/service_process/main.c
  10. 13 10
      etc/rc.local
  11. 0 0
      usr/bin/bareservice
  12. 0 0
      usr/bin/baresip
  13. 69 26
      etc/scripts/config_store.sh
  14. 3 7
      etc/scripts/keep_tcpdump.sh
  15. BIN
      etc/scripts/play_ip
  16. 4 4
      etc/scripts/play_rebooting.sh
  17. 3 3
      etc/scripts/shell_action.sh
  18. 2 5
      etc/scripts/sipphone.sh
  19. 22 0
      lib/systemd/system/networking.service
  20. 3 3
      oem/etc/speaker.conf
  21. 20 0
      usr/bin/init.sh
  22. 0 0
      usr/bin/sysconf
  23. 0 0
      usr/lib/aarch64-linux-gnu/libcjson.so.1.7.15
  24. BIN
      usr/lib/aarch64-linux-gnu/libhiredis.so
  25. BIN
      usr/lib/aarch64-linux-gnu/libre.so
  26. BIN
      usr/lib/aarch64-linux-gnu/libre.so.24
  27. BIN
      usr/lib/baresip/modules/kaoptions.so
  28. 5 5
      usr/sbin/kiosk-start.sh
  29. 0 0
      usr/sbin/redis-cli
  30. 0 0
      usr/sbin/redis-server
  31. BIN
      usr/share/sounds/.DS_Store
  32. BIN
      usr/share/sounds/beep.mp3
  33. BIN
      usr/share/sounds/cn/dian.mp3
  34. BIN
      usr/share/sounds/cn/digit-0.mp3
  35. BIN
      usr/share/sounds/cn/digit-1.mp3
  36. BIN
      usr/share/sounds/cn/digit-2.mp3
  37. BIN
      usr/share/sounds/cn/digit-3.mp3
  38. BIN
      usr/share/sounds/cn/digit-4.mp3
  39. BIN
      usr/share/sounds/cn/digit-5.mp3
  40. BIN
      usr/share/sounds/cn/digit-6.mp3
  41. BIN
      usr/share/sounds/cn/digit-7.mp3
  42. BIN
      usr/share/sounds/cn/digit-8.mp3
  43. BIN
      usr/share/sounds/cn/digit-9.mp3
  44. BIN
      usr/share/sounds/cn/get_ip_failed.mp3
  45. BIN
      usr/share/sounds/cn/zh.mp3
  46. BIN
      usr/share/sounds/en/dian.mp3
  47. BIN
      usr/share/sounds/en/digit-0.mp3
  48. BIN
      usr/share/sounds/en/digit-1.mp3
  49. BIN
      usr/share/sounds/en/digit-2.mp3
  50. BIN
      usr/share/sounds/en/digit-3.mp3
  51. BIN
      usr/share/sounds/en/digit-4.mp3
  52. BIN
      usr/share/sounds/en/digit-5.mp3
  53. BIN
      usr/share/sounds/en/digit-6.mp3
  54. BIN
      usr/share/sounds/en/digit-7.mp3
  55. BIN
      usr/share/sounds/en/digit-8.mp3
  56. BIN
      usr/share/sounds/en/digit-9.mp3
  57. BIN
      usr/share/sounds/en/en.mp3
  58. BIN
      usr/share/sounds/en/get_ip_failed.mp3
  59. BIN
      usr/share/sounds/in/dian.mp3
  60. BIN
      usr/share/sounds/in/digit-0.mp3
  61. BIN
      usr/share/sounds/in/digit-1.mp3
  62. BIN
      usr/share/sounds/in/digit-2.mp3
  63. BIN
      usr/share/sounds/in/digit-3.mp3
  64. BIN
      usr/share/sounds/in/digit-4.mp3
  65. BIN
      usr/share/sounds/in/digit-5.mp3
  66. BIN
      usr/share/sounds/in/digit-6.mp3
  67. BIN
      usr/share/sounds/in/digit-7.mp3
  68. BIN
      usr/share/sounds/in/digit-8.mp3
  69. BIN
      usr/share/sounds/in/digit-9.mp3
  70. BIN
      usr/share/sounds/in/get_ip_failed.mp3
  71. BIN
      usr/share/sounds/in/in.mp3
  72. 0 0
      www/speaker-cgi

+ 1 - 1
Modules/play_ip/Makefile

@@ -1,7 +1,7 @@
 TARGET = play_ip
 Dir2store = /opt/Rockchip/external/X10/etc/scripts
 objects = *.o
-CFLAGS = -lhiredis -lm -L../../iniparser/iniparser-master -liniparser 
+CFLAGS = -lhiredis -lm -liniparser 
 
 ${TARGET}:$(objects)
 	${CC} -o $@ $(objects) $(CFLAGS)

+ 0 - 750
Modules/play_ip/cJSON.c

@@ -1,750 +0,0 @@
-/*
-  Copyright (c) 2009 Dave Gamble
-
-  Permission is hereby granted, free of charge, to any person obtaining a copy
-  of this software and associated documentation files (the "Software"), to deal
-  in the Software without restriction, including without limitation the rights
-  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-  copies of the Software, and to permit persons to whom the Software is
-  furnished to do so, subject to the following conditions:
-
-  The above copyright notice and this permission notice shall be included in
-  all copies or substantial portions of the Software.
-
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-  THE SOFTWARE.
-*/
-
-/* cJSON */
-/* JSON parser in C. */
-
-#include <string.h>
-#include <stdio.h>
-#include <math.h>
-#include <stdlib.h>
-#include <float.h>
-#include <limits.h>
-#include <ctype.h>
-#include "cJSON.h"
-
-static const char *ep;
-
-const char *cJSON_GetErrorPtr(void) {return ep;}
-
-static int cJSON_strcasecmp(const char *s1,const char *s2)
-{
-	if (!s1) return (s1==s2)?0:1;if (!s2) return 1;
-	for(; tolower(*s1) == tolower(*s2); ++s1, ++s2)	if(*s1 == 0)	return 0;
-	return tolower(*(const unsigned char *)s1) - tolower(*(const unsigned char *)s2);
-}
-
-static void *(*cJSON_malloc)(size_t sz) = malloc;
-static void (*cJSON_free)(void *ptr) = free;
-
-static char* cJSON_strdup(const char* str)
-{
-      size_t len;
-      char* copy;
-
-      len = strlen(str) + 1;
-      if (!(copy = (char*)cJSON_malloc(len))) return 0;
-      memcpy(copy,str,len);
-      return copy;
-}
-
-void cJSON_InitHooks(cJSON_Hooks* hooks)
-{
-    if (!hooks) { /* Reset hooks */
-        cJSON_malloc = malloc;
-        cJSON_free = free;
-        return;
-    }
-
-	cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc;
-	cJSON_free	 = (hooks->free_fn)?hooks->free_fn:free;
-}
-
-/* Internal constructor. */
-static cJSON *cJSON_New_Item(void)
-{
-	cJSON* node = (cJSON*)cJSON_malloc(sizeof(cJSON));
-	if (node) memset(node,0,sizeof(cJSON));
-	return node;
-}
-
-/* Delete a cJSON structure. */
-void cJSON_Delete(cJSON *c)
-{
-	cJSON *next;
-	while (c)
-	{
-		next=c->next;
-		if (!(c->type&cJSON_IsReference) && c->child) cJSON_Delete(c->child);
-		if (!(c->type&cJSON_IsReference) && c->valuestring) cJSON_free(c->valuestring);
-		if (!(c->type&cJSON_StringIsConst) && c->string) cJSON_free(c->string);
-		cJSON_free(c);
-		c=next;
-	}
-}
-
-/* Parse the input text to generate a number, and populate the result into item. */
-static const char *parse_number(cJSON *item,const char *num)
-{
-	double n=0,sign=1,scale=0;int subscale=0,signsubscale=1;
-
-	if (*num=='-') sign=-1,num++;	/* Has sign? */
-	if (*num=='0') num++;			/* is zero */
-	if (*num>='1' && *num<='9')	do	n=(n*10.0)+(*num++ -'0');	while (*num>='0' && *num<='9');	/* Number? */
-	if (*num=='.' && num[1]>='0' && num[1]<='9') {num++;		do	n=(n*10.0)+(*num++ -'0'),scale--; while (*num>='0' && *num<='9');}	/* Fractional part? */
-	if (*num=='e' || *num=='E')		/* Exponent? */
-	{	num++;if (*num=='+') num++;	else if (*num=='-') signsubscale=-1,num++;		/* With sign? */
-		while (*num>='0' && *num<='9') subscale=(subscale*10)+(*num++ - '0');	/* Number? */
-	}
-
-	n=sign*n*pow(10.0,(scale+subscale*signsubscale));	/* number = +/- number.fraction * 10^+/- exponent */
-	
-	item->valuedouble=n;
-	item->valueint=(int)n;
-	item->type=cJSON_Number;
-	return num;
-}
-
-static int pow2gt (int x)	{	--x;	x|=x>>1;	x|=x>>2;	x|=x>>4;	x|=x>>8;	x|=x>>16;	return x+1;	}
-
-typedef struct {char *buffer; int length; int offset; } printbuffer;
-
-static char* ensure(printbuffer *p,int needed)
-{
-	char *newbuffer;int newsize;
-	if (!p || !p->buffer) return 0;
-	needed+=p->offset;
-	if (needed<=p->length) return p->buffer+p->offset;
-
-	newsize=pow2gt(needed);
-	newbuffer=(char*)cJSON_malloc(newsize);
-	if (!newbuffer) {cJSON_free(p->buffer);p->length=0,p->buffer=0;return 0;}
-	if (newbuffer) memcpy(newbuffer,p->buffer,p->length);
-	cJSON_free(p->buffer);
-	p->length=newsize;
-	p->buffer=newbuffer;
-	return newbuffer+p->offset;
-}
-
-static int update(printbuffer *p)
-{
-	char *str;
-	if (!p || !p->buffer) return 0;
-	str=p->buffer+p->offset;
-	return p->offset+strlen(str);
-}
-
-/* Render the number nicely from the given item into a string. */
-static char *print_number(cJSON *item,printbuffer *p)
-{
-	char *str=0;
-	double d=item->valuedouble;
-	if (d==0)
-	{
-		if (p)	str=ensure(p,2);
-		else	str=(char*)cJSON_malloc(2);	/* special case for 0. */
-		if (str) strcpy(str,"0");
-	}
-	else if (fabs(((double)item->valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN)
-	{
-		if (p)	str=ensure(p,21);
-		else	str=(char*)cJSON_malloc(21);	/* 2^64+1 can be represented in 21 chars. */
-		if (str)	sprintf(str,"%d",item->valueint);
-	}
-	else
-	{
-		if (p)	str=ensure(p,64);
-		else	str=(char*)cJSON_malloc(64);	/* This is a nice tradeoff. */
-		if (str)
-		{
-			if (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60)sprintf(str,"%.0f",d);
-			else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9)			sprintf(str,"%e",d);
-			else												sprintf(str,"%f",d);
-		}
-	}
-	return str;
-}
-
-static unsigned parse_hex4(const char *str)
-{
-	unsigned h=0;
-	if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0;
-	h=h<<4;str++;
-	if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0;
-	h=h<<4;str++;
-	if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0;
-	h=h<<4;str++;
-	if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0;
-	return h;
-}
-
-/* Parse the input text into an unescaped cstring, and populate item. */
-static const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
-static const char *parse_string(cJSON *item,const char *str)
-{
-	const char *ptr=str+1;char *ptr2;char *out;int len=0;unsigned uc,uc2;
-	if (*str!='\"') {ep=str;return 0;}	/* not a string! */
-	
-	while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++;	/* Skip escaped quotes. */
-	
-	out=(char*)cJSON_malloc(len+1);	/* This is how long we need for the string, roughly. */
-	if (!out) return 0;
-	
-	ptr=str+1;ptr2=out;
-	while (*ptr!='\"' && *ptr)
-	{
-		if (*ptr!='\\') *ptr2++=*ptr++;
-		else
-		{
-			ptr++;
-			switch (*ptr)
-			{
-				case 'b': *ptr2++='\b';	break;
-				case 'f': *ptr2++='\f';	break;
-				case 'n': *ptr2++='\n';	break;
-				case 'r': *ptr2++='\r';	break;
-				case 't': *ptr2++='\t';	break;
-				case 'u':	 /* transcode utf16 to utf8. */
-					uc=parse_hex4(ptr+1);ptr+=4;	/* get the unicode char. */
-
-					if ((uc>=0xDC00 && uc<=0xDFFF) || uc==0)	break;	/* check for invalid.	*/
-
-					if (uc>=0xD800 && uc<=0xDBFF)	/* UTF16 surrogate pairs.	*/
-					{
-						if (ptr[1]!='\\' || ptr[2]!='u')	break;	/* missing second-half of surrogate.	*/
-						uc2=parse_hex4(ptr+3);ptr+=6;
-						if (uc2<0xDC00 || uc2>0xDFFF)		break;	/* invalid second-half of surrogate.	*/
-						uc=0x10000 + (((uc&0x3FF)<<10) | (uc2&0x3FF));
-					}
-
-					len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len;
-					
-					switch (len) {
-						case 4: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;
-						case 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;
-						case 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;
-						case 1: *--ptr2 =(uc | firstByteMark[len]);
-					}
-					ptr2+=len;
-					break;
-				default:  *ptr2++=*ptr; break;
-			}
-			ptr++;
-		}
-	}
-	*ptr2=0;
-	if (*ptr=='\"') ptr++;
-	item->valuestring=out;
-	item->type=cJSON_String;
-	return ptr;
-}
-
-/* Render the cstring provided to an escaped version that can be printed. */
-static char *print_string_ptr(const char *str,printbuffer *p)
-{
-	const char *ptr;char *ptr2,*out;int len=0,flag=0;unsigned char token;
-	
-	for (ptr=str;*ptr;ptr++) flag|=((*ptr>0 && *ptr<32)||(*ptr=='\"')||(*ptr=='\\'))?1:0;
-	if (!flag)
-	{
-		len=ptr-str;
-		if (p) out=ensure(p,len+3);
-		else		out=(char*)cJSON_malloc(len+3);
-		if (!out) return 0;
-		ptr2=out;*ptr2++='\"';
-		strcpy(ptr2,str);
-		ptr2[len]='\"';
-		ptr2[len+1]=0;
-		return out;
-	}
-	
-	if (!str)
-	{
-		if (p)	out=ensure(p,3);
-		else	out=(char*)cJSON_malloc(3);
-		if (!out) return 0;
-		strcpy(out,"\"\"");
-		return out;
-	}
-	ptr=str;while ((token=*ptr) && ++len) {if (strchr("\"\\\b\f\n\r\t",token)) len++; else if (token<32) len+=5;ptr++;}
-	
-	if (p)	out=ensure(p,len+3);
-	else	out=(char*)cJSON_malloc(len+3);
-	if (!out) return 0;
-
-	ptr2=out;ptr=str;
-	*ptr2++='\"';
-	while (*ptr)
-	{
-		if ((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') *ptr2++=*ptr++;
-		else
-		{
-			*ptr2++='\\';
-			switch (token=*ptr++)
-			{
-				case '\\':	*ptr2++='\\';	break;
-				case '\"':	*ptr2++='\"';	break;
-				case '\b':	*ptr2++='b';	break;
-				case '\f':	*ptr2++='f';	break;
-				case '\n':	*ptr2++='n';	break;
-				case '\r':	*ptr2++='r';	break;
-				case '\t':	*ptr2++='t';	break;
-				default: sprintf(ptr2,"u%04x",token);ptr2+=5;	break;	/* escape and print */
-			}
-		}
-	}
-	*ptr2++='\"';*ptr2++=0;
-	return out;
-}
-/* Invote print_string_ptr (which is useful) on an item. */
-static char *print_string(cJSON *item,printbuffer *p)	{return print_string_ptr(item->valuestring,p);}
-
-/* Predeclare these prototypes. */
-static const char *parse_value(cJSON *item,const char *value);
-static char *print_value(cJSON *item,int depth,int fmt,printbuffer *p);
-static const char *parse_array(cJSON *item,const char *value);
-static char *print_array(cJSON *item,int depth,int fmt,printbuffer *p);
-static const char *parse_object(cJSON *item,const char *value);
-static char *print_object(cJSON *item,int depth,int fmt,printbuffer *p);
-
-/* Utility to jump whitespace and cr/lf */
-static const char *skip(const char *in) {while (in && *in && (unsigned char)*in<=32) in++; return in;}
-
-/* Parse an object - create a new root, and populate. */
-cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated)
-{
-	const char *end=0;
-	cJSON *c=cJSON_New_Item();
-	ep=0;
-	if (!c) return 0;       /* memory fail */
-
-	end=parse_value(c,skip(value));
-	if (!end)	{cJSON_Delete(c);return 0;}	/* parse failure. ep is set. */
-
-	/* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */
-	if (require_null_terminated) {end=skip(end);if (*end) {cJSON_Delete(c);ep=end;return 0;}}
-	if (return_parse_end) *return_parse_end=end;
-	return c;
-}
-/* Default options for cJSON_Parse */
-cJSON *cJSON_Parse(const char *value) {return cJSON_ParseWithOpts(value,0,0);}
-
-/* Render a cJSON item/entity/structure to text. */
-char *cJSON_Print(cJSON *item)				{return print_value(item,0,1,0);}
-char *cJSON_PrintUnformatted(cJSON *item)	{return print_value(item,0,0,0);}
-
-char *cJSON_PrintBuffered(cJSON *item,int prebuffer,int fmt)
-{
-	printbuffer p;
-	p.buffer=(char*)cJSON_malloc(prebuffer);
-	p.length=prebuffer;
-	p.offset=0;
-	return print_value(item,0,fmt,&p);
-	return p.buffer;
-}
-
-
-/* Parser core - when encountering text, process appropriately. */
-static const char *parse_value(cJSON *item,const char *value)
-{
-	if (!value)						return 0;	/* Fail on null. */
-	if (!strncmp(value,"null",4))	{ item->type=cJSON_NULL;  return value+4; }
-	if (!strncmp(value,"false",5))	{ item->type=cJSON_False; return value+5; }
-	if (!strncmp(value,"true",4))	{ item->type=cJSON_True; item->valueint=1;	return value+4; }
-	if (*value=='\"')				{ return parse_string(item,value); }
-	if (*value=='-' || (*value>='0' && *value<='9'))	{ return parse_number(item,value); }
-	if (*value=='[')				{ return parse_array(item,value); }
-	if (*value=='{')				{ return parse_object(item,value); }
-
-	ep=value;return 0;	/* failure. */
-}
-
-/* Render a value to text. */
-static char *print_value(cJSON *item,int depth,int fmt,printbuffer *p)
-{
-	char *out=0;
-	if (!item) return 0;
-	if (p)
-	{
-		switch ((item->type)&255)
-		{
-			case cJSON_NULL:	{out=ensure(p,5);	if (out) strcpy(out,"null");	break;}
-			case cJSON_False:	{out=ensure(p,6);	if (out) strcpy(out,"false");	break;}
-			case cJSON_True:	{out=ensure(p,5);	if (out) strcpy(out,"true");	break;}
-			case cJSON_Number:	out=print_number(item,p);break;
-			case cJSON_String:	out=print_string(item,p);break;
-			case cJSON_Array:	out=print_array(item,depth,fmt,p);break;
-			case cJSON_Object:	out=print_object(item,depth,fmt,p);break;
-		}
-	}
-	else
-	{
-		switch ((item->type)&255)
-		{
-			case cJSON_NULL:	out=cJSON_strdup("null");	break;
-			case cJSON_False:	out=cJSON_strdup("false");break;
-			case cJSON_True:	out=cJSON_strdup("true"); break;
-			case cJSON_Number:	out=print_number(item,0);break;
-			case cJSON_String:	out=print_string(item,0);break;
-			case cJSON_Array:	out=print_array(item,depth,fmt,0);break;
-			case cJSON_Object:	out=print_object(item,depth,fmt,0);break;
-		}
-	}
-	return out;
-}
-
-/* Build an array from input text. */
-static const char *parse_array(cJSON *item,const char *value)
-{
-	cJSON *child;
-	if (*value!='[')	{ep=value;return 0;}	/* not an array! */
-
-	item->type=cJSON_Array;
-	value=skip(value+1);
-	if (*value==']') return value+1;	/* empty array. */
-
-	item->child=child=cJSON_New_Item();
-	if (!item->child) return 0;		 /* memory fail */
-	value=skip(parse_value(child,skip(value)));	/* skip any spacing, get the value. */
-	if (!value) return 0;
-
-	while (*value==',')
-	{
-		cJSON *new_item;
-		if (!(new_item=cJSON_New_Item())) return 0; 	/* memory fail */
-		child->next=new_item;new_item->prev=child;child=new_item;
-		value=skip(parse_value(child,skip(value+1)));
-		if (!value) return 0;	/* memory fail */
-	}
-
-	if (*value==']') return value+1;	/* end of array */
-	ep=value;return 0;	/* malformed. */
-}
-
-/* Render an array to text */
-static char *print_array(cJSON *item,int depth,int fmt,printbuffer *p)
-{
-	char **entries;
-	char *out=0,*ptr,*ret;int len=5;
-	cJSON *child=item->child;
-	int numentries=0,i=0,fail=0;
-	size_t tmplen=0;
-	
-	/* How many entries in the array? */
-	while (child) numentries++,child=child->next;
-	/* Explicitly handle numentries==0 */
-	if (!numentries)
-	{
-		if (p)	out=ensure(p,3);
-		else	out=(char*)cJSON_malloc(3);
-		if (out) strcpy(out,"[]");
-		return out;
-	}
-
-	if (p)
-	{
-		/* Compose the output array. */
-		i=p->offset;
-		ptr=ensure(p,1);if (!ptr) return 0;	*ptr='[';	p->offset++;
-		child=item->child;
-		while (child && !fail)
-		{
-			print_value(child,depth+1,fmt,p);
-			p->offset=update(p);
-			if (child->next) {len=fmt?2:1;ptr=ensure(p,len+1);if (!ptr) return 0;*ptr++=',';if(fmt)*ptr++=' ';*ptr=0;p->offset+=len;}
-			child=child->next;
-		}
-		ptr=ensure(p,2);if (!ptr) return 0;	*ptr++=']';*ptr=0;
-		out=(p->buffer)+i;
-	}
-	else
-	{
-		/* Allocate an array to hold the values for each */
-		entries=(char**)cJSON_malloc(numentries*sizeof(char*));
-		if (!entries) return 0;
-		memset(entries,0,numentries*sizeof(char*));
-		/* Retrieve all the results: */
-		child=item->child;
-		while (child && !fail)
-		{
-			ret=print_value(child,depth+1,fmt,0);
-			entries[i++]=ret;
-			if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1;
-			child=child->next;
-		}
-		
-		/* If we didn't fail, try to malloc the output string */
-		if (!fail)	out=(char*)cJSON_malloc(len);
-		/* If that fails, we fail. */
-		if (!out) fail=1;
-
-		/* Handle failure. */
-		if (fail)
-		{
-			for (i=0;i<numentries;i++) if (entries[i]) cJSON_free(entries[i]);
-			cJSON_free(entries);
-			return 0;
-		}
-		
-		/* Compose the output array. */
-		*out='[';
-		ptr=out+1;*ptr=0;
-		for (i=0;i<numentries;i++)
-		{
-			tmplen=strlen(entries[i]);memcpy(ptr,entries[i],tmplen);ptr+=tmplen;
-			if (i!=numentries-1) {*ptr++=',';if(fmt)*ptr++=' ';*ptr=0;}
-			cJSON_free(entries[i]);
-		}
-		cJSON_free(entries);
-		*ptr++=']';*ptr++=0;
-	}
-	return out;	
-}
-
-/* Build an object from the text. */
-static const char *parse_object(cJSON *item,const char *value)
-{
-	cJSON *child;
-	if (*value!='{')	{ep=value;return 0;}	/* not an object! */
-	
-	item->type=cJSON_Object;
-	value=skip(value+1);
-	if (*value=='}') return value+1;	/* empty array. */
-	
-	item->child=child=cJSON_New_Item();
-	if (!item->child) return 0;
-	value=skip(parse_string(child,skip(value)));
-	if (!value) return 0;
-	child->string=child->valuestring;child->valuestring=0;
-	if (*value!=':') {ep=value;return 0;}	/* fail! */
-	value=skip(parse_value(child,skip(value+1)));	/* skip any spacing, get the value. */
-	if (!value) return 0;
-	
-	while (*value==',')
-	{
-		cJSON *new_item;
-		if (!(new_item=cJSON_New_Item()))	return 0; /* memory fail */
-		child->next=new_item;new_item->prev=child;child=new_item;
-		value=skip(parse_string(child,skip(value+1)));
-		if (!value) return 0;
-		child->string=child->valuestring;child->valuestring=0;
-		if (*value!=':') {ep=value;return 0;}	/* fail! */
-		value=skip(parse_value(child,skip(value+1)));	/* skip any spacing, get the value. */
-		if (!value) return 0;
-	}
-	
-	if (*value=='}') return value+1;	/* end of array */
-	ep=value;return 0;	/* malformed. */
-}
-
-/* Render an object to text. */
-static char *print_object(cJSON *item,int depth,int fmt,printbuffer *p)
-{
-	char **entries=0,**names=0;
-	char *out=0,*ptr,*ret,*str;int len=7,i=0,j;
-	cJSON *child=item->child;
-	int numentries=0,fail=0;
-	size_t tmplen=0;
-	/* Count the number of entries. */
-	while (child) numentries++,child=child->next;
-	/* Explicitly handle empty object case */
-	if (!numentries)
-	{
-		if (p) out=ensure(p,fmt?depth+4:3);
-		else	out=(char*)cJSON_malloc(fmt?depth+4:3);
-		if (!out)	return 0;
-		ptr=out;*ptr++='{';
-		if (fmt) {*ptr++='\n';for (i=0;i<depth-1;i++) *ptr++='\t';}
-		*ptr++='}';*ptr++=0;
-		return out;
-	}
-	if (p)
-	{
-		/* Compose the output: */
-		i=p->offset;
-		len=fmt?2:1;	ptr=ensure(p,len+1);	if (!ptr) return 0;
-		*ptr++='{';	if (fmt) *ptr++='\n';	*ptr=0;	p->offset+=len;
-		child=item->child;depth++;
-		while (child)
-		{
-			if (fmt)
-			{
-				ptr=ensure(p,depth);	if (!ptr) return 0;
-				for (j=0;j<depth;j++) *ptr++='\t';
-				p->offset+=depth;
-			}
-			print_string_ptr(child->string,p);
-			p->offset=update(p);
-			
-			len=fmt?2:1;
-			ptr=ensure(p,len);	if (!ptr) return 0;
-			*ptr++=':';if (fmt) *ptr++='\t';
-			p->offset+=len;
-			
-			print_value(child,depth,fmt,p);
-			p->offset=update(p);
-
-			len=(fmt?1:0)+(child->next?1:0);
-			ptr=ensure(p,len+1); if (!ptr) return 0;
-			if (child->next) *ptr++=',';
-			if (fmt) *ptr++='\n';*ptr=0;
-			p->offset+=len;
-			child=child->next;
-		}
-		ptr=ensure(p,fmt?(depth+1):2);	 if (!ptr) return 0;
-		if (fmt)	for (i=0;i<depth-1;i++) *ptr++='\t';
-		*ptr++='}';*ptr=0;
-		out=(p->buffer)+i;
-	}
-	else
-	{
-		/* Allocate space for the names and the objects */
-		entries=(char**)cJSON_malloc(numentries*sizeof(char*));
-		if (!entries) return 0;
-		names=(char**)cJSON_malloc(numentries*sizeof(char*));
-		if (!names) {cJSON_free(entries);return 0;}
-		memset(entries,0,sizeof(char*)*numentries);
-		memset(names,0,sizeof(char*)*numentries);
-
-		/* Collect all the results into our arrays: */
-		child=item->child;depth++;if (fmt) len+=depth;
-		while (child)
-		{
-			names[i]=str=print_string_ptr(child->string,0);
-			entries[i++]=ret=print_value(child,depth,fmt,0);
-			if (str && ret) len+=strlen(ret)+strlen(str)+2+(fmt?2+depth:0); else fail=1;
-			child=child->next;
-		}
-		
-		/* Try to allocate the output string */
-		if (!fail)	out=(char*)cJSON_malloc(len);
-		if (!out) fail=1;
-
-		/* Handle failure */
-		if (fail)
-		{
-			for (i=0;i<numentries;i++) {if (names[i]) cJSON_free(names[i]);if (entries[i]) cJSON_free(entries[i]);}
-			cJSON_free(names);cJSON_free(entries);
-			return 0;
-		}
-		
-		/* Compose the output: */
-		*out='{';ptr=out+1;if (fmt)*ptr++='\n';*ptr=0;
-		for (i=0;i<numentries;i++)
-		{
-			if (fmt) for (j=0;j<depth;j++) *ptr++='\t';
-			tmplen=strlen(names[i]);memcpy(ptr,names[i],tmplen);ptr+=tmplen;
-			*ptr++=':';if (fmt) *ptr++='\t';
-			strcpy(ptr,entries[i]);ptr+=strlen(entries[i]);
-			if (i!=numentries-1) *ptr++=',';
-			if (fmt) *ptr++='\n';*ptr=0;
-			cJSON_free(names[i]);cJSON_free(entries[i]);
-		}
-		
-		cJSON_free(names);cJSON_free(entries);
-		if (fmt) for (i=0;i<depth-1;i++) *ptr++='\t';
-		*ptr++='}';*ptr++=0;
-	}
-	return out;	
-}
-
-/* Get Array size/item / object item. */
-int    cJSON_GetArraySize(cJSON *array)							{cJSON *c=array->child;int i=0;while(c)i++,c=c->next;return i;}
-cJSON *cJSON_GetArrayItem(cJSON *array,int item)				{cJSON *c=array->child;  while (c && item>0) item--,c=c->next; return c;}
-cJSON *cJSON_GetObjectItem(cJSON *object,const char *string)	{cJSON *c=object->child; while (c && cJSON_strcasecmp(c->string,string)) c=c->next; return c;}
-
-/* Utility for array list handling. */
-static void suffix_object(cJSON *prev,cJSON *item) {prev->next=item;item->prev=prev;}
-/* Utility for handling references. */
-static cJSON *create_reference(cJSON *item) {cJSON *ref=cJSON_New_Item();if (!ref) return 0;memcpy(ref,item,sizeof(cJSON));ref->string=0;ref->type|=cJSON_IsReference;ref->next=ref->prev=0;return ref;}
-
-/* Add item to array/object. */
-void   cJSON_AddItemToArray(cJSON *array, cJSON *item)						{cJSON *c=array->child;if (!item) return; if (!c) {array->child=item;} else {while (c && c->next) c=c->next; suffix_object(c,item);}}
-void   cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item)	{if (!item) return; if (item->string) cJSON_free(item->string);item->string=cJSON_strdup(string);cJSON_AddItemToArray(object,item);}
-void   cJSON_AddItemToObjectCS(cJSON *object,const char *string,cJSON *item)	{if (!item) return; if (!(item->type&cJSON_StringIsConst) && item->string) cJSON_free(item->string);item->string=(char*)string;item->type|=cJSON_StringIsConst;cJSON_AddItemToArray(object,item);}
-void	cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item)						{cJSON_AddItemToArray(array,create_reference(item));}
-void	cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item)	{cJSON_AddItemToObject(object,string,create_reference(item));}
-
-cJSON *cJSON_DetachItemFromArray(cJSON *array,int which)			{cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return 0;
-	if (c->prev) c->prev->next=c->next;if (c->next) c->next->prev=c->prev;if (c==array->child) array->child=c->next;c->prev=c->next=0;return c;}
-void   cJSON_DeleteItemFromArray(cJSON *array,int which)			{cJSON_Delete(cJSON_DetachItemFromArray(array,which));}
-cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string) {int i=0;cJSON *c=object->child;while (c && cJSON_strcasecmp(c->string,string)) i++,c=c->next;if (c) return cJSON_DetachItemFromArray(object,i);return 0;}
-void   cJSON_DeleteItemFromObject(cJSON *object,const char *string) {cJSON_Delete(cJSON_DetachItemFromObject(object,string));}
-
-/* Replace array/object items with new ones. */
-void   cJSON_InsertItemInArray(cJSON *array,int which,cJSON *newitem)		{cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) {cJSON_AddItemToArray(array,newitem);return;}
-	newitem->next=c;newitem->prev=c->prev;c->prev=newitem;if (c==array->child) array->child=newitem; else newitem->prev->next=newitem;}
-void   cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem)		{cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return;
-	newitem->next=c->next;newitem->prev=c->prev;if (newitem->next) newitem->next->prev=newitem;
-	if (c==array->child) array->child=newitem; else newitem->prev->next=newitem;c->next=c->prev=0;cJSON_Delete(c);}
-void   cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem){int i=0;cJSON *c=object->child;while(c && cJSON_strcasecmp(c->string,string))i++,c=c->next;if(c){newitem->string=cJSON_strdup(string);cJSON_ReplaceItemInArray(object,i,newitem);}}
-
-/* Create basic types: */
-cJSON *cJSON_CreateNull(void)					{cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_NULL;return item;}
-cJSON *cJSON_CreateTrue(void)					{cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_True;return item;}
-cJSON *cJSON_CreateFalse(void)					{cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_False;return item;}
-cJSON *cJSON_CreateBool(int b)					{cJSON *item=cJSON_New_Item();if(item)item->type=b?cJSON_True:cJSON_False;return item;}
-cJSON *cJSON_CreateNumber(double num)			{cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_Number;item->valuedouble=num;item->valueint=(int)num;}return item;}
-cJSON *cJSON_CreateString(const char *string)	{cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_String;item->valuestring=cJSON_strdup(string);}return item;}
-cJSON *cJSON_CreateArray(void)					{cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Array;return item;}
-cJSON *cJSON_CreateObject(void)					{cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Object;return item;}
-
-/* Create Arrays: */
-cJSON *cJSON_CreateIntArray(const int *numbers,int count)		{int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateNumber(numbers[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}
-cJSON *cJSON_CreateFloatArray(const float *numbers,int count)	{int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateNumber(numbers[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}
-cJSON *cJSON_CreateDoubleArray(const double *numbers,int count)	{int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateNumber(numbers[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}
-cJSON *cJSON_CreateStringArray(const char **strings,int count)	{int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateString(strings[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}
-
-/* Duplication */
-cJSON *cJSON_Duplicate(cJSON *item,int recurse)
-{
-	cJSON *newitem,*cptr,*nptr=0,*newchild;
-	/* Bail on bad ptr */
-	if (!item) return 0;
-	/* Create new item */
-	newitem=cJSON_New_Item();
-	if (!newitem) return 0;
-	/* Copy over all vars */
-	newitem->type=item->type&(~cJSON_IsReference),newitem->valueint=item->valueint,newitem->valuedouble=item->valuedouble;
-	if (item->valuestring)	{newitem->valuestring=cJSON_strdup(item->valuestring);	if (!newitem->valuestring)	{cJSON_Delete(newitem);return 0;}}
-	if (item->string)		{newitem->string=cJSON_strdup(item->string);			if (!newitem->string)		{cJSON_Delete(newitem);return 0;}}
-	/* If non-recursive, then we're done! */
-	if (!recurse) return newitem;
-	/* Walk the ->next chain for the child. */
-	cptr=item->child;
-	while (cptr)
-	{
-		newchild=cJSON_Duplicate(cptr,1);		/* Duplicate (with recurse) each item in the ->next chain */
-		if (!newchild) {cJSON_Delete(newitem);return 0;}
-		if (nptr)	{nptr->next=newchild,newchild->prev=nptr;nptr=newchild;}	/* If newitem->child already set, then crosswire ->prev and ->next and move on */
-		else		{newitem->child=newchild;nptr=newchild;}					/* Set newitem->child and move to it */
-		cptr=cptr->next;
-	}
-	return newitem;
-}
-
-void cJSON_Minify(char *json)
-{
-	char *into=json;
-	while (*json)
-	{
-		if (*json==' ') json++;
-		else if (*json=='\t') json++;	/* Whitespace characters. */
-		else if (*json=='\r') json++;
-		else if (*json=='\n') json++;
-		else if (*json=='/' && json[1]=='/')  while (*json && *json!='\n') json++;	/* double-slash comments, to end of line. */
-		else if (*json=='/' && json[1]=='*') {while (*json && !(*json=='*' && json[1]=='/')) json++;json+=2;}	/* multiline comments. */
-		else if (*json=='\"'){*into++=*json++;while (*json && *json!='\"'){if (*json=='\\') *into++=*json++;*into++=*json++;}*into++=*json++;} /* string literals, which are \" sensitive. */
-		else *into++=*json++;			/* All other characters. */
-	}
-	*into=0;	/* and null-terminate. */
-}

+ 0 - 149
Modules/play_ip/cJSON.h

@@ -1,149 +0,0 @@
-/*
-  Copyright (c) 2009 Dave Gamble
- 
-  Permission is hereby granted, free of charge, to any person obtaining a copy
-  of this software and associated documentation files (the "Software"), to deal
-  in the Software without restriction, including without limitation the rights
-  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-  copies of the Software, and to permit persons to whom the Software is
-  furnished to do so, subject to the following conditions:
- 
-  The above copyright notice and this permission notice shall be included in
-  all copies or substantial portions of the Software.
- 
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-  THE SOFTWARE.
-*/
-
-#ifndef cJSON__h
-#define cJSON__h
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/* cJSON Types: */
-#define cJSON_False 0
-#define cJSON_True 1
-#define cJSON_NULL 2
-#define cJSON_Number 3
-#define cJSON_String 4
-#define cJSON_Array 5
-#define cJSON_Object 6
-	
-#define cJSON_IsReference 256
-#define cJSON_StringIsConst 512
-
-/* The cJSON structure: */
-typedef struct cJSON {
-	struct cJSON *next,*prev;	/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
-	struct cJSON *child;		/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
-
-	int type;					/* The type of the item, as above. */
-
-	char *valuestring;			/* The item's string, if type==cJSON_String */
-	int valueint;				/* The item's number, if type==cJSON_Number */
-	double valuedouble;			/* The item's number, if type==cJSON_Number */
-
-	char *string;				/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
-} cJSON;
-
-typedef struct cJSON_Hooks {
-      void *(*malloc_fn)(size_t sz);
-      void (*free_fn)(void *ptr);
-} cJSON_Hooks;
-
-/* Supply malloc, realloc and free functions to cJSON */
-extern void cJSON_InitHooks(cJSON_Hooks* hooks);
-
-
-/* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */
-extern cJSON *cJSON_Parse(const char *value);
-/* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */
-extern char  *cJSON_Print(cJSON *item);
-/* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */
-extern char  *cJSON_PrintUnformatted(cJSON *item);
-/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
-extern char *cJSON_PrintBuffered(cJSON *item,int prebuffer,int fmt);
-/* Delete a cJSON entity and all subentities. */
-extern void   cJSON_Delete(cJSON *c);
-
-/* Returns the number of items in an array (or object). */
-extern int	  cJSON_GetArraySize(cJSON *array);
-/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */
-extern cJSON *cJSON_GetArrayItem(cJSON *array,int item);
-/* Get item "string" from object. Case insensitive. */
-extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
-
-/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
-extern const char *cJSON_GetErrorPtr(void);
-	
-/* These calls create a cJSON item of the appropriate type. */
-extern cJSON *cJSON_CreateNull(void);
-extern cJSON *cJSON_CreateTrue(void);
-extern cJSON *cJSON_CreateFalse(void);
-extern cJSON *cJSON_CreateBool(int b);
-extern cJSON *cJSON_CreateNumber(double num);
-extern cJSON *cJSON_CreateString(const char *string);
-extern cJSON *cJSON_CreateArray(void);
-extern cJSON *cJSON_CreateObject(void);
-
-/* These utilities create an Array of count items. */
-extern cJSON *cJSON_CreateIntArray(const int *numbers,int count);
-extern cJSON *cJSON_CreateFloatArray(const float *numbers,int count);
-extern cJSON *cJSON_CreateDoubleArray(const double *numbers,int count);
-extern cJSON *cJSON_CreateStringArray(const char **strings,int count);
-
-/* Append item to the specified array/object. */
-extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
-extern void	cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
-extern void	cJSON_AddItemToObjectCS(cJSON *object,const char *string,cJSON *item);	/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object */
-/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
-extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
-extern void	cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item);
-
-/* Remove/Detatch items from Arrays/Objects. */
-extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which);
-extern void   cJSON_DeleteItemFromArray(cJSON *array,int which);
-extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string);
-extern void   cJSON_DeleteItemFromObject(cJSON *object,const char *string);
-	
-/* Update array items. */
-extern void cJSON_InsertItemInArray(cJSON *array,int which,cJSON *newitem);	/* Shifts pre-existing items to the right. */
-extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem);
-extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
-
-/* Duplicate a cJSON item */
-extern cJSON *cJSON_Duplicate(cJSON *item,int recurse);
-/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
-need to be released. With recurse!=0, it will duplicate any children connected to the item.
-The item->next and ->prev pointers are always zero on return from Duplicate. */
-
-/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
-extern cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated);
-
-extern void cJSON_Minify(char *json);
-
-/* Macros for creating things quickly. */
-#define cJSON_AddNullToObject(object,name)		cJSON_AddItemToObject(object, name, cJSON_CreateNull())
-#define cJSON_AddTrueToObject(object,name)		cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
-#define cJSON_AddFalseToObject(object,name)		cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
-#define cJSON_AddBoolToObject(object,name,b)	cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
-#define cJSON_AddNumberToObject(object,name,n)	cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
-#define cJSON_AddStringToObject(object,name,s)	cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
-
-/* When assigning an integer value, it needs to be propagated to valuedouble too. */
-#define cJSON_SetIntValue(object,val)			((object)?(object)->valueint=(object)->valuedouble=(val):(val))
-#define cJSON_SetNumberValue(object,val)		((object)?(object)->valueint=(object)->valuedouble=(val):(val))
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif

+ 0 - 173
Modules/play_ip/dictionary.h

@@ -1,173 +0,0 @@
-
-/*-------------------------------------------------------------------------*/
-/**
-   @file    dictionary.h
-   @author  N. Devillard
-   @brief   Implements a dictionary for string variables.
-
-   This module implements a simple dictionary object, i.e. a list
-   of string/string associations. This object is useful to store e.g.
-   informations retrieved from a configuration file (ini files).
-*/
-/*--------------------------------------------------------------------------*/
-
-#ifndef _DICTIONARY_H_
-#define _DICTIONARY_H_
-
-/*---------------------------------------------------------------------------
-                                Includes
- ---------------------------------------------------------------------------*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*---------------------------------------------------------------------------
-                                New types
- ---------------------------------------------------------------------------*/
-
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Dictionary object
-
-  This object contains a list of string/string associations. Each
-  association is identified by a unique string key. Looking up values
-  in the dictionary is speeded up by the use of a (hopefully collision-free)
-  hash function.
- */
-/*-------------------------------------------------------------------------*/
-typedef struct _dictionary_ {
-    int             n ;     /** Number of entries in dictionary */
-    ssize_t         size ;  /** Storage size */
-    char        **  val ;   /** List of string values */
-    char        **  key ;   /** List of string keys */
-    unsigned     *  hash ;  /** List of hash values for keys */
-} dictionary ;
-
-
-/*---------------------------------------------------------------------------
-                            Function prototypes
- ---------------------------------------------------------------------------*/
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Compute the hash key for a string.
-  @param    key     Character string to use for key.
-  @return   1 unsigned int on at least 32 bits.
-
-  This hash function has been taken from an Article in Dr Dobbs Journal.
-  This is normally a collision-free function, distributing keys evenly.
-  The key is stored anyway in the struct so that collision can be avoided
-  by comparing the key itself in last resort.
- */
-/*--------------------------------------------------------------------------*/
-unsigned dictionary_hash(const char * key);
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Create a new dictionary object.
-  @param    size    Optional initial size of the dictionary.
-  @return   1 newly allocated dictionary objet.
-
-  This function allocates a new dictionary object of given size and returns
-  it. If you do not know in advance (roughly) the number of entries in the
-  dictionary, give size=0.
- */
-/*--------------------------------------------------------------------------*/
-dictionary * dictionary_new(size_t size);
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Delete a dictionary object
-  @param    d   dictionary object to deallocate.
-  @return   void
-
-  Deallocate a dictionary object and all memory associated to it.
- */
-/*--------------------------------------------------------------------------*/
-void dictionary_del(dictionary * vd);
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Get a value from a dictionary.
-  @param    d       dictionary object to search.
-  @param    key     Key to look for in the dictionary.
-  @param    def     Default value to return if key not found.
-  @return   1 pointer to internally allocated character string.
-
-  This function locates a key in a dictionary and returns a pointer to its
-  value, or the passed 'def' pointer if no such key can be found in
-  dictionary. The returned character pointer points to data internal to the
-  dictionary object, you should not try to free it or modify it.
- */
-/*--------------------------------------------------------------------------*/
-const char * dictionary_get(const dictionary * d, const char * key, const char * def);
-
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Set a value in a dictionary.
-  @param    d       dictionary object to modify.
-  @param    key     Key to modify or add.
-  @param    val     Value to add.
-  @return   int     0 if Ok, anything else otherwise
-
-  If the given key is found in the dictionary, the associated value is
-  replaced by the provided one. If the key cannot be found in the
-  dictionary, it is added to it.
-
-  It is Ok to provide a NULL value for val, but NULL values for the dictionary
-  or the key are considered as errors: the function will return immediately
-  in such a case.
-
-  Notice that if you dictionary_set a variable to NULL, a call to
-  dictionary_get will return a NULL value: the variable will be found, and
-  its value (NULL) is returned. In other words, setting the variable
-  content to NULL is equivalent to deleting the variable from the
-  dictionary. It is not possible (in this implementation) to have a key in
-  the dictionary without value.
-
-  This function returns non-zero in case of failure.
- */
-/*--------------------------------------------------------------------------*/
-int dictionary_set(dictionary * vd, const char * key, const char * val);
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Delete a key in a dictionary
-  @param    d       dictionary object to modify.
-  @param    key     Key to remove.
-  @return   void
-
-  This function deletes a key in a dictionary. Nothing is done if the
-  key cannot be found.
- */
-/*--------------------------------------------------------------------------*/
-void dictionary_unset(dictionary * d, const char * key);
-
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Dump a dictionary to an opened file pointer.
-  @param    d   Dictionary to dump
-  @param    f   Opened file pointer.
-  @return   void
-
-  Dumps a dictionary onto an opened file pointer. Key pairs are printed out
-  as @c [Key]=[Value], one per line. It is Ok to provide stdout or stderr as
-  output file pointers.
- */
-/*--------------------------------------------------------------------------*/
-void dictionary_dump(const dictionary * d, FILE * out);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif

+ 0 - 358
Modules/play_ip/iniparser.h

@@ -1,358 +0,0 @@
-
-/*-------------------------------------------------------------------------*/
-/**
-   @file    iniparser.h
-   @author  N. Devillard
-   @brief   Parser for ini files.
-*/
-/*--------------------------------------------------------------------------*/
-
-#ifndef _INIPARSER_H_
-#define _INIPARSER_H_
-
-/*---------------------------------------------------------------------------
-                                Includes
- ---------------------------------------------------------------------------*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-/*
- * The following #include is necessary on many Unixes but not Linux.
- * It is not needed for Windows platforms.
- * Uncomment it if needed.
- */
-/* #include <unistd.h> */
-
-#include "dictionary.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Configure a function to receive the error messages.
-  @param    errback  Function to call.
-
-  By default, the error will be printed on stderr. If a null pointer is passed
-  as errback the error callback will be switched back to default.
- */
-/*--------------------------------------------------------------------------*/
-
-void iniparser_set_error_callback(int (*errback)(const char *, ...));
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Get number of sections in a dictionary
-  @param    d   Dictionary to examine
-  @return   int Number of sections found in dictionary
-
-  This function returns the number of sections found in a dictionary.
-  The test to recognize sections is done on the string stored in the
-  dictionary: a section name is given as "section" whereas a key is
-  stored as "section:key", thus the test looks for entries that do not
-  contain a colon.
-
-  This clearly fails in the case a section name contains a colon, but
-  this should simply be avoided.
-
-  This function returns -1 in case of error.
- */
-/*--------------------------------------------------------------------------*/
-
-int iniparser_getnsec(const dictionary * d);
-
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Get name for section n in a dictionary.
-  @param    d   Dictionary to examine
-  @param    n   Section number (from 0 to nsec-1).
-  @return   Pointer to char string
-
-  This function locates the n-th section in a dictionary and returns
-  its name as a pointer to a string statically allocated inside the
-  dictionary. Do not free or modify the returned string!
-
-  This function returns NULL in case of error.
- */
-/*--------------------------------------------------------------------------*/
-
-const char * iniparser_getsecname(const dictionary * d, int n);
-
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Save a dictionary to a loadable ini file
-  @param    d   Dictionary to dump
-  @param    f   Opened file pointer to dump to
-  @return   void
-
-  This function dumps a given dictionary into a loadable ini file.
-  It is Ok to specify @c stderr or @c stdout as output files.
- */
-/*--------------------------------------------------------------------------*/
-
-void iniparser_dump_ini(const dictionary * d, FILE * f);
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Save a dictionary section to a loadable ini file
-  @param    d   Dictionary to dump
-  @param    s   Section name of dictionary to dump
-  @param    f   Opened file pointer to dump to
-  @return   void
-
-  This function dumps a given section of a given dictionary into a loadable ini
-  file.  It is Ok to specify @c stderr or @c stdout as output files.
- */
-/*--------------------------------------------------------------------------*/
-
-void iniparser_dumpsection_ini(const dictionary * d, const char * s, FILE * f);
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Dump a dictionary to an opened file pointer.
-  @param    d   Dictionary to dump.
-  @param    f   Opened file pointer to dump to.
-  @return   void
-
-  This function prints out the contents of a dictionary, one element by
-  line, onto the provided file pointer. It is OK to specify @c stderr
-  or @c stdout as output files. This function is meant for debugging
-  purposes mostly.
- */
-/*--------------------------------------------------------------------------*/
-void iniparser_dump(const dictionary * d, FILE * f);
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Get the number of keys in a section of a dictionary.
-  @param    d   Dictionary to examine
-  @param    s   Section name of dictionary to examine
-  @return   Number of keys in section
- */
-/*--------------------------------------------------------------------------*/
-int iniparser_getsecnkeys(const dictionary * d, const char * s);
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Get the number of keys in a section of a dictionary.
-  @param    d    Dictionary to examine
-  @param    s    Section name of dictionary to examine
-  @param    keys Already allocated array to store the keys in
-  @return   The pointer passed as `keys` argument or NULL in case of error
-
-  This function queries a dictionary and finds all keys in a given section.
-  The keys argument should be an array of pointers which size has been
-  determined by calling `iniparser_getsecnkeys` function prior to this one.
-
-  Each pointer in the returned char pointer-to-pointer is pointing to
-  a string allocated in the dictionary; do not free or modify them.
- */
-/*--------------------------------------------------------------------------*/
-const char ** iniparser_getseckeys(const dictionary * d, const char * s, const char ** keys);
-
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Get the string associated to a key
-  @param    d       Dictionary to search
-  @param    key     Key string to look for
-  @param    def     Default value to return if key not found.
-  @return   pointer to statically allocated character string
-
-  This function queries a dictionary for a key. A key as read from an
-  ini file is given as "section:key". If the key cannot be found,
-  the pointer passed as 'def' is returned.
-  The returned char pointer is pointing to a string allocated in
-  the dictionary, do not free or modify it.
- */
-/*--------------------------------------------------------------------------*/
-const char * iniparser_getstring(const dictionary * d, const char * key, const char * def);
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Get the string associated to a key, convert to an int
-  @param    d Dictionary to search
-  @param    key Key string to look for
-  @param    notfound Value to return in case of error
-  @return   integer
-
-  This function queries a dictionary for a key. A key as read from an
-  ini file is given as "section:key". If the key cannot be found,
-  the notfound value is returned.
-
-  Supported values for integers include the usual C notation
-  so decimal, octal (starting with 0) and hexadecimal (starting with 0x)
-  are supported. Examples:
-
-  - "42"      ->  42
-  - "042"     ->  34 (octal -> decimal)
-  - "0x42"    ->  66 (hexa  -> decimal)
-
-  Warning: the conversion may overflow in various ways. Conversion is
-  totally outsourced to strtol(), see the associated man page for overflow
-  handling.
-
-  Credits: Thanks to A. Becker for suggesting strtol()
- */
-/*--------------------------------------------------------------------------*/
-int iniparser_getint(const dictionary * d, const char * key, int notfound);
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Get the string associated to a key, convert to an long int
-  @param    d Dictionary to search
-  @param    key Key string to look for
-  @param    notfound Value to return in case of error
-  @return   integer
-
-  This function queries a dictionary for a key. A key as read from an
-  ini file is given as "section:key". If the key cannot be found,
-  the notfound value is returned.
-
-  Supported values for integers include the usual C notation
-  so decimal, octal (starting with 0) and hexadecimal (starting with 0x)
-  are supported. Examples:
-
-  - "42"      ->  42
-  - "042"     ->  34 (octal -> decimal)
-  - "0x42"    ->  66 (hexa  -> decimal)
-
-  Warning: the conversion may overflow in various ways. Conversion is
-  totally outsourced to strtol(), see the associated man page for overflow
-  handling.
- */
-/*--------------------------------------------------------------------------*/
-long int iniparser_getlongint(const dictionary * d, const char * key, long int notfound);
-
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Get the string associated to a key, convert to a double
-  @param    d Dictionary to search
-  @param    key Key string to look for
-  @param    notfound Value to return in case of error
-  @return   double
-
-  This function queries a dictionary for a key. A key as read from an
-  ini file is given as "section:key". If the key cannot be found,
-  the notfound value is returned.
- */
-/*--------------------------------------------------------------------------*/
-double iniparser_getdouble(const dictionary * d, const char * key, double notfound);
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Get the string associated to a key, convert to a boolean
-  @param    d Dictionary to search
-  @param    key Key string to look for
-  @param    notfound Value to return in case of error
-  @return   integer
-
-  This function queries a dictionary for a key. A key as read from an
-  ini file is given as "section:key". If the key cannot be found,
-  the notfound value is returned.
-
-  A true boolean is found if one of the following is matched:
-
-  - A string starting with 'y'
-  - A string starting with 'Y'
-  - A string starting with 't'
-  - A string starting with 'T'
-  - A string starting with '1'
-
-  A false boolean is found if one of the following is matched:
-
-  - A string starting with 'n'
-  - A string starting with 'N'
-  - A string starting with 'f'
-  - A string starting with 'F'
-  - A string starting with '0'
-
-  The notfound value returned if no boolean is identified, does not
-  necessarily have to be 0 or 1.
- */
-/*--------------------------------------------------------------------------*/
-int iniparser_getboolean(const dictionary * d, const char * key, int notfound);
-
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Set an entry in a dictionary.
-  @param    ini     Dictionary to modify.
-  @param    entry   Entry to modify (entry name)
-  @param    val     New value to associate to the entry.
-  @return   int     0 if Ok, -1 otherwise.
-
-  If the given entry can be found in the dictionary, it is modified to
-  contain the provided value. If it cannot be found, the entry is created.
-  It is Ok to set val to NULL.
- */
-/*--------------------------------------------------------------------------*/
-int iniparser_set(dictionary * ini, const char * entry, const char * val);
-
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Delete an entry in a dictionary
-  @param    ini     Dictionary to modify
-  @param    entry   Entry to delete (entry name)
-  @return   void
-
-  If the given entry can be found, it is deleted from the dictionary.
- */
-/*--------------------------------------------------------------------------*/
-void iniparser_unset(dictionary * ini, const char * entry);
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Finds out if a given entry exists in a dictionary
-  @param    ini     Dictionary to search
-  @param    entry   Name of the entry to look for
-  @return   integer 1 if entry exists, 0 otherwise
-
-  Finds out if a given entry exists in the dictionary. Since sections
-  are stored as keys with NULL associated values, this is the only way
-  of querying for the presence of sections in a dictionary.
- */
-/*--------------------------------------------------------------------------*/
-int iniparser_find_entry(const dictionary * ini, const char * entry) ;
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Parse an ini file and return an allocated dictionary object
-  @param    ininame Name of the ini file to read.
-  @return   Pointer to newly allocated dictionary
-
-  This is the parser for ini files. This function is called, providing
-  the name of the file to be read. It returns a dictionary object that
-  should not be accessed directly, but through accessor functions
-  instead.
-
-  The returned dictionary must be freed using iniparser_freedict().
- */
-/*--------------------------------------------------------------------------*/
-dictionary * iniparser_load(const char * ininame);
-
-/*-------------------------------------------------------------------------*/
-/**
-  @brief    Free all memory associated to an ini dictionary
-  @param    d Dictionary to free
-  @return   void
-
-  Free all memory associated to an ini dictionary.
-  It is mandatory to call this function before the dictionary object
-  gets out of the current context.
- */
-/*--------------------------------------------------------------------------*/
-void iniparser_freedict(dictionary * d);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif

+ 22 - 26
Modules/play_ip/main.c

@@ -9,7 +9,7 @@
 #include <time.h>
 #include <pthread.h>
 #include "hiredis/hiredis.h"
-#include "iniparser.h"
+#include "iniparser/iniparser.h"
 
 #define Boolean int
 #define TRUE 1
@@ -105,22 +105,22 @@ int GetCmdValue(char *file, char *key, char *value, int lenth)
 }
 
 //控制功放的开启/关闭,TRUE/FALSE
-void amplifier_switch(Boolean enable){
-    if(enable){
-        system("/etc/scripts/pa_mute.sh 0");
-    }
-    else
-    {
-        system("/etc/scripts/pa_mute.sh 1");
-    }
-}
+// void amplifier_switch(Boolean enable){
+//     if(enable){
+//         system("/etc/scripts/pa_mute.sh 0");
+//     }
+//     else
+//     {
+//         system("/etc/scripts/pa_mute.sh 1");
+//     }
+// }
 
 Boolean get_ip(char * pv)
 {
         FILE * fp;
         char cmdbuf[128], value[32];
         char *tmp=NULL;
-        sprintf(cmdbuf,"/sbin/ifconfig eth0 | grep inet | cut -d\":\" -f2 | cut -d\" \" -f1");
+        sprintf(cmdbuf,"/sbin/ifconfig eth1 | grep 'inet ' | awk '{print $2}'");
         fp = popen(cmdbuf, "r");
         if (fp == NULL) {
                 // printf("Fail to open pipe\n");
@@ -173,21 +173,21 @@ int PlayIP()
     GetCmdValue(SPK_CONF, "system:language", language, sizeof(language));
 
     char ipaddr[16],cmd_line[240];
-    system("/usr/bin/amixer -q sset 'Master',0 29");
-    amplifier_switch(TRUE); //开启功放
+    // system("/usr/bin/amixer -q sset 'Master',0 29");
+    // amplifier_switch(TRUE); //开启功放
     if(!get_ip(ipaddr)) {
         if (strcmp(language, "en") == 0){
-            system("mpg123 /home/new-speaker/target/share/sounds/en/get_ip_failed.mp3");
+            system("mpg123 /usr/share/sounds/en/get_ip_failed.mp3");
         }else{
-            system("mpg123 /home/new-speaker/target/share/sounds/cn/get_ip_failed.mp3");
+            system("mpg123 /usr/share/sounds/cn/get_ip_failed.mp3");
         }
         return 0;
     }
 
     if (strcmp(language, "en") == 0){
-        strcpy(cmd_line,"cd /home/new-speaker/target/share/sounds/en/;mpg123 ");
+        strcpy(cmd_line,"cd /usr/share/sounds/en/;mpg123 ");
     }else{
-        strcpy(cmd_line,"cd /home/new-speaker/target/share/sounds/cn/;mpg123 ");
+        strcpy(cmd_line,"cd /usr/share/sounds/cn/;mpg123 ");
     }
 
     int i;
@@ -231,8 +231,8 @@ int PlayIP()
     }
     system(cmd_line);
 
-    amplifier_switch(FALSE); //关闭功放
-    system("/etc/scripts/set_volume.sh resume");
+    // amplifier_switch(FALSE); //关闭功放
+    // system("/etc/scripts/set_volume.sh resume");
     writeLog( FUN, "Play IP Address", ipaddr );
     return 0;
 }
@@ -242,13 +242,11 @@ int main(int argc, char *argv[]){
     dictionary  *   ini ;
     char alwaysPlayIP[8];
 
-    sleep(2);
+    // sleep(2);
     GetCmdValue(VOL_CONF, "volume:always_play_ip", alwaysPlayIP, sizeof(alwaysPlayIP));
     if (strcmp(alwaysPlayIP, "yes") == 0)
     {
-        system("/usr/bin/amixer -q sset 'Master',0 29");
-        system("/usr/bin/amixer -q sset 'Master',0 29");
-        system("/usr/bin/amixer -q sset 'Master',0 29");
+        system("/usr/bin/amixer -q sset 'DAC',0 160");
         PlayIP();
         return TRUE;
     }
@@ -284,9 +282,7 @@ int main(int argc, char *argv[]){
     {
         goto end;
     }
-    system("/usr/bin/amixer -q sset 'Master',0 29");
-    system("/usr/bin/amixer -q sset 'Master',0 29");
-    system("/usr/bin/amixer -q sset 'Master',0 29");
+    system("/usr/bin/amixer -q sset 'DAC',0 160");
     PlayIP();
 
 end:

+ 0 - 20
Modules/playip/Makefile

@@ -1,20 +0,0 @@
-TARGET = play_ip
-Dir2store = ${TARGET_DIR}/usr/bin
-CFLAGS =
-
-${TARGET}:*.o
-	${CC} -o $@ ${CFLAGS} $<
-
-%.o:%.c
-	${CC} -c $<
-
-.PHONY:clean install uninstall
-
-clean:
-	rm -f *.o ${TARGET}
-
-install:
-# 	cp -f ${TARGET} ${Dir2store}
-
-uninstall:
-	rm -f ${Dir2store}/${TARGET}

+ 0 - 92
Modules/playip/main.c

@@ -1,92 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-#define Boolean	int
-#define TRUE	1
-#define FALSE	0
-#define MAX_PIPE_BUFSIZE 	256
-
-Boolean get_ip(char * pv)
-{
-        FILE * fp;
-        char cmdbuf[128], value[32];
-        sprintf(cmdbuf,"/sbin/ifconfig eth0 | grep inet | cut -d\":\" -f2 | cut -d\" \" -f1");
-        fp = popen(cmdbuf, "r");
-        if (fp == NULL) {
-                // printf("Fail to open pipe\n");
-                return FALSE;
-        }
-
-        memset(value,0,sizeof(value));
-
-        if (!feof(fp) && fgets(value,MAX_PIPE_BUFSIZE,fp) != NULL)
-            ;
-            // printf("value:%s\n", value);
-        else {
-            printf("ip wrong\n");
-            return FALSE;
-        }
-
-        pclose(fp);
-
-        if(strlen(value) < 10)
-            return FALSE;
-
-        strcpy(pv,value);
-        return TRUE;
-}
-
-int main(int argc, char const *argv[])
-{
-	char ipaddr[16],cmd_line[240];
-	if(!get_ip(ipaddr)) {
-		system("mpg123 -r 48000 /home/new-speaker/target/share/sounds/get_ip_failed.mp3");
-		return 0;
-	}
-
-	strcpy(cmd_line,"cd /home/new-speaker/target/share/sounds/;mpg123 -r 48000 ");
-
-	int i;
-	for (i=0;i<strlen(ipaddr);i++){
-		switch(ipaddr[i])
-		{
-			case '0':
-				strcat(cmd_line,"digit-0.mp3 ");
-				break;
-			case '1':
-				strcat(cmd_line,"digit-1.mp3 ");
-				break;
-			case '2':
-				strcat(cmd_line,"digit-2.mp3 ");
-				break;
-			case '3':
-				strcat(cmd_line,"digit-3.mp3 ");
-				break;
-			case '4':
-				strcat(cmd_line,"digit-4.mp3 ");
-				break;
-			case '5':
-				strcat(cmd_line,"digit-5.mp3 ");
-				break;
-			case '6':
-				strcat(cmd_line,"digit-6.mp3 ");
-				break;
-			case '7':
-				strcat(cmd_line,"digit-7.mp3 ");
-				break;
-			case '8':
-				strcat(cmd_line,"digit-8.mp3 ");
-				break;
-			case '9':
-				strcat(cmd_line,"digit-9.mp3 ");
-				break;
-			case '.':
-				strcat(cmd_line,"dian.mp3 ");
-				break;
-		}
-	}
-	// printf("cmd-line:%s\n", cmd_line);
-	system(cmd_line);
-
-	return 0;
-}

+ 6 - 6
Modules/service_process/main.c

@@ -437,7 +437,7 @@ Boolean get_ip(char * pv)
         FILE * fp;
         char cmdbuf[128], value[32];
         char *tmp=NULL;
-        sprintf(cmdbuf,"/sbin/ifconfig eth0 | grep \"inet addr\" | cut -d\":\" -f2 | cut -d\" \" -f1");
+        sprintf(cmdbuf,"/sbin/ifconfig eth1 | grep 'inet ' | awk '{print $2}'");
         fp = popen(cmdbuf, "r");
         if (fp == NULL) {
                 // printf("Fail to open pipe\n");
@@ -471,7 +471,7 @@ Boolean get_mac(char * pv)
         FILE * fp;
         char cmdbuf[128], value[32];
         char *tmp=NULL;
-        sprintf(cmdbuf,"ifconfig eth0 | grep HWaddr | tr -d : | awk '{print $5}'");
+        sprintf(cmdbuf,"ifconfig eth1 | grep ether | tr -d : | awk '{print $2}'");
         fp = popen(cmdbuf, "r");
         if (fp == NULL) {
                 return FALSE;
@@ -510,17 +510,17 @@ int PlayIP()
     amplifier_switch(TRUE); //开启功放
     if(!get_ip(ipaddr)) {
         if (strcmp(language, "en") == 0){
-            system("mpg123 -r 48000 /home/new-speaker/target/share/sounds/en/get_ip_failed.mp3");
+            system("mpg123 -r 48000 /usr/share/sounds/en/get_ip_failed.mp3");
         }else{
-            system("mpg123 -r 48000 /home/new-speaker/target/share/sounds/cn/get_ip_failed.mp3");
+            system("mpg123 -r 48000 /usr/share/sounds/cn/get_ip_failed.mp3");
         }
         return 0;
     }
 
     if (strcmp(language, "en") == 0){
-        strcpy(cmd_line,"cd /home/new-speaker/target/share/sounds/en/;mpg123 -r 48000 ");
+        strcpy(cmd_line,"cd /usr/share/sounds/en/;mpg123 -r 48000 ");
     }else{
-        strcpy(cmd_line,"cd /home/new-speaker/target/share/sounds/cn/;mpg123 -r 48000 ");
+        strcpy(cmd_line,"cd /usr/share/sounds/cn/;mpg123 -r 48000 ");
     }
 
     int i;

+ 13 - 10
etc/rc.local

@@ -5,25 +5,28 @@
 #	/bin/bash /usr/local/bin/test_reboot.sh
 #fi
 /etc/scripts/gpio_init.sh
+
+/etc/scripts/product_model.sh
 chmod 777 /dev/ttyS*
 # Create dummy video node for chromium V4L2 VDA/VEA with rkmpp plugin
-echo dec > /dev/video-dec0
-echo enc > /dev/video-enc0
+#echo dec > /dev/video-dec0
+#echo enc > /dev/video-enc0
 chmod 660 /dev/video-*
-chown root:video /dev/video-*
+#chown root:video /dev/video-*
 # The chromium using fixed pathes for libv4l2.so
-ln -rsf /usr/lib/*/libv4l2.so /usr/lib/
-if [ -e /usr/lib/aarch64-linux-gnu/ ]; then
-    ln -Tsf lib /usr/lib64
-fi
+#ln -rsf /usr/lib/*/libv4l2.so /usr/lib/
+#if [ -e /usr/lib/aarch64-linux-gnu/ ]; then
+#    ln -Tsf lib /usr/lib64
+#fi
 # bash /etc/init.d/rkwifibt.sh &
-bash /usr/local/bin/init.sh
+sleep 5
 
-/etc/scripts/product_model.sh
+/etc/scripts/play_ip
 
 /etc/scripts/watch.sh start > /dev/null 2>&1 &
 
-sleep 5
+bash /usr/bin/init.sh
+
 # udhcpc -i usb0 -n
 /etc/scripts/system_led.sh &
 

+ 0 - 0
usr/bin/bareservice


+ 0 - 0
usr/bin/baresip


+ 69 - 26
etc/scripts/config_store.sh

@@ -4,44 +4,87 @@
 #
 
 CONF="/etc/speaker.conf"
-NET_CONF="/tmp/interfaces"
+NET_CONF="/etc/netplan/01-netcfg.yaml"
 
 [ ! -f "/etc/speaker.conf" ] && exit 1
+
+declare -A mask_table=(
+        ["255.255.255.255"]="32"
+        ["255.255.255.254"]="31"
+        ["255.255.255.252"]="30"
+        ["255.255.255.248"]="29"
+        ["255.255.255.240"]="28"
+        ["255.255.255.224"]="27"
+        ["255.255.255.192"]="26"
+        ["255.255.255.128"]="25"
+        ["255.255.255.0"]="24"
+        ["255.255.254.0"]="23"
+        ["255.255.252.0"]="22"
+        ["255.255.248.0"]="21"
+        ["255.255.240.0"]="20"
+        ["255.255.224.0"]="19"
+        ["255.255.192.0"]="18"
+        ["255.255.128.0"]="17"
+        ["255.255.0.0"]="16"
+        ["255.254.0.0"]="15"
+        ["255.252.0.0"]="14"
+        ["255.248.0.0"]="13"
+        ["255.240.0.0"]="12"
+        ["255.224.0.0"]="11"
+        ["255.192.0.0"]="10"
+        ["255.128.0.0"]="9"
+        ["255.0.0.0"]="8"
+        ["254.0.0.0"]="7"
+        ["252.0.0.0"]="6"
+        ["248.0.0.0"]="5"
+        ["240.0.0.0"]="4"
+        ["224.0.0.0"]="3"
+        ["192.0.0.0"]="2"
+        ["128.0.0.0"]="1"
+        ["0.0.0.0"]="0"
+    )
+
 net_type=`sysconf ${CONF} get system ip_assign`
 
 if [ "${net_type}" = "dhcp" ]; then
     cat << END > ${NET_CONF}
-# interfaces(5) file used by ifup(8) and ifdown(8)
-# Include files from /etc/network/interfaces.d:
-auto lo
-iface lo inet loopback
-
-auto eth0
-iface eth0 inet dhcp
-    udhcpc_opts -R -n -O tftp
+network:
+    version: 2
+    ethernets:
+        eth1:
+            dhcp4: yes
+            addresses: []
+            optional: yes
+            dhcp-identifier: mac
+            dhcp4-overrides:
+                route-metric: 200
 END
-echo -n > /tmp/resolv.conf
 
 elif [ "${net_type}" = "static" ]; then
     ip=`sysconf ${CONF} get system ipaddr`
     mask=`sysconf ${CONF} get system netmask`
     gateway=`sysconf ${CONF} get system gateway`
-    cat << END > ${NET_CONF}
-# interfaces(5) file used by ifup(8) and ifdown(8)
-# Include files from /etc/network/interfaces.d:
-auto lo
-iface lo inet loopback
+    dns=`sysconf ${CONF} get system dns1`
+    dns2=`sysconf ${CONF} get system dns2`
+    if [[ -n ${mask_table[$mask]} ]]; then
+        masklen=${mask_table[$mask]}
+    else
+        masklen=24
+    fi
+    if [ -n "${dns2}" ];then
+        dns="${dns},${dns2}"
+    fi
 
-auto eth0
-iface eth0 inet static
-address ${ip}
-netmask ${mask}
-gateway ${gateway}
+    cat << END > ${NET_CONF}
+network:
+    version: 2
+    ethernets:
+        eth1:
+            dhcp4: no
+            addresses: [${ip}/${masklen}]
+            gateway4: ${gateway}
+            nameservers:
+                addresses: [${dns}]
+            optional: false
 END
-dns1=`sysconf ${CONF} get system dns1`
-dns2=`sysconf ${CONF} get system dns2`
-echo -n > /tmp/resolv.conf
-[ ! -z "${dns1}" ] && echo "nameserver ${dns1}" >> /tmp/resolv.conf
-[ ! -z "${dns2}" ] && echo "nameserver ${dns2}" >> /tmp/resolv.conf
-
 fi

+ 3 - 7
etc/scripts/keep_tcpdump.sh

@@ -2,15 +2,11 @@
 
 start()
 {
-        MODEL="`/etc/scripts/getmodel.sh`"
-        if [ "foo${MODEL}" = "fooX10" ];then
-                interface="br0"
-        else
-                interface="eth0"
-        fi
+        interface="eth1"
+
         while [ 1 ]
         do
-                /usr/sbin/tcpdump -i ${interface} -w /tmp/tcpdump.pcap > /dev/null 2>&1 &
+                /usr/bin/tcpdump -i ${interface} -w /tmp/tcpdump.pcap > /dev/null 2>&1 &
                 touch /tmp/.tcpdump
                 sleep 600
                 /bin/rm -rf /tmp/.tcpdump

BIN
etc/scripts/play_ip


+ 4 - 4
etc/scripts/play_rebooting.sh

@@ -16,15 +16,15 @@ get_lan
 
 if [ "u_${LAN}" = "u_cn" ];then
     if [ "$REBOOT" == "1" ];then
-        mpg123 -r 48000 /home/new-speaker/target/share/sounds/cn/reboot_zh.mp3
+        mpg123 -r 48000 /usr/share/sounds/cn/reboot_zh.mp3
     else
-        mpg123 -r 48000 /home/new-speaker/target/share/sounds/cn/zh.mp3
+        mpg123 -r 48000 /usr/share/sounds/cn/zh.mp3
     fi
 else
     if [ "$REBOOT" == "1" ];then
-        mpg123 -r 48000 /home/new-speaker/target/share/sounds/en/reboot_en.mp3
+        mpg123 -r 48000 /usr/share/sounds/en/reboot_en.mp3
     else
-        mpg123 -r 48000 /home/new-speaker/target/share/sounds/en/en.mp3
+        mpg123 -r 48000 /usr/share/sounds/en/en.mp3
     fi
 fi
 

+ 3 - 3
etc/scripts/shell_action.sh

@@ -49,11 +49,11 @@ case ${action} in
 
 		model="`${SYSCONFCMD} ${SYSCONF} get system model`"
 		hardVersion="`${SYSCONFCMD} ${SYSCONF} get system hard_version`"
-		ip="`/sbin/ifconfig ${dev} | grep 'inet addr' | awk '{print $2}' | cut -d ':' -f2 | tr -d ' '`"
+		ip="`/sbin/ifconfig ${dev} | grep 'inet ' | awk '{print $2}'`"
 		ipMode="`${SYSCONFCMD} ${SYSCONF} get system ip_assign`"
-		mac="`/sbin/ifconfig ${dev} | grep 'HWaddr' | awk '{print $5}' | tr -d ' '`"
+		mac="`/sbin/ifconfig ${dev} | grep ether | awk '{printf $2}' | tr a-z A-Z`"
 		softwareVersion="`${SYSCONFCMD} ${SYSCONF} get system firmware`"
-		submask="`/sbin/ifconfig ${dev} | grep 'inet addr' | awk '{print $4}' | cut -d ':' -f2 | tr -d ' '`"
+		submask="`/sbin/ifconfig ${dev} | grep netmask | awk '{print $4}'`"
         onvif_enable="`${SYSCONFCMD} ${SYSCONF} get onvif enable`"
         account_port1="`${SYSCONFCMD} ${SYSCONF} get account_info_1 port`"
         account_port2="`${SYSCONFCMD} ${SYSCONF} get account_info_2 port`"

+ 2 - 5
etc/scripts/sipphone.sh

@@ -13,14 +13,11 @@ case "$1" in
         /etc/scripts/sipconf
 		[ ! -f "${SPHONE_CONF}" ] && printf "Configration file not exist.\n" && exit 0
 
-        #clear redis database
-        redis-cli FLUSHALL
-
         # start baresip
-        baresip -4 -d
+        /etc/scripts/baresip -4 -f /tmp > /dev/null 2>&1 &
 
         # start baresip service
-        bareservice > /dev/null 2>&1 &
+        /etc/scripts/bareservice > /dev/null 2>&1 &
 
 		;;
 

+ 22 - 0
lib/systemd/system/networking.service

@@ -0,0 +1,22 @@
+[Unit]
+Description=Raise network interfaces
+Documentation=man:interfaces(5)
+DefaultDependencies=no
+Requires=ifupdown-pre.service
+Wants=network.target
+After=local-fs.target network-pre.target apparmor.service systemd-sysctl.service systemd-modules-load.service ifupdown-pre.service
+Before=network.target shutdown.target network-online.target
+Conflicts=shutdown.target
+
+[Install]
+WantedBy=multi-user.target
+WantedBy=network-online.target
+
+[Service]
+Type=oneshot
+EnvironmentFile=-/etc/default/networking
+ExecStartPre=/etc/scripts/config_store.sh
+ExecStart=/sbin/ifup -a --read-environment
+ExecStop=/sbin/ifdown -a --read-environment --exclude=lo
+RemainAfterExit=true
+TimeoutStartSec=5min

+ 3 - 3
oem/etc/speaker.conf

@@ -1,9 +1,9 @@
 [system]
-firmware=s2.1.2.010
+firmware=s0.0.0.001
 hard_version=h1.0.1
 model=X10
 ui_model=X10
-language=cn
+language=en
 broadcast_service=no
 route=local
 ip_assign=dhcp
@@ -281,7 +281,7 @@ password=admin
 relay_mode=Monostable
 relay_delaytime=3
 relay_type=On
-enable_mic=no
+enable_mic=yes
 
 [chromium_url]
 url=https://www.galaxynext.us/

+ 20 - 0
usr/bin/init.sh

@@ -0,0 +1,20 @@
+#!/bin/bash
+
+echo V > /dev/watchdog
+#control AI
+#if [ -f "/usr/local/bin/init_script.sh" ];then
+#        bash /usr/local/bin/init_script.sh
+#fi
+
+{
+	export DISPLAY=:0.0
+	#su jhc -c "xrandr --output HDMI-1 --same-as eDP-1"
+	#su jhc -c "xrandr --output HDMI-1 --mode 1920x1080"
+	sleep 5s
+	su jhc -c "xset -display :0 dpms force on"
+	su jhc -c "xset s 0"
+	su jhc -c "xset -dpms"
+	#su jhc -c "bash /usr/local/bin/start_audio.sh"
+} &
+
+exit 0

+ 0 - 0
usr/bin/sysconf


usr/lib/aarch64-linux-gnu/libcjson.so.1 → usr/lib/aarch64-linux-gnu/libcjson.so.1.7.15


BIN
usr/lib/aarch64-linux-gnu/libhiredis.so


BIN
usr/lib/aarch64-linux-gnu/libre.so


BIN
usr/lib/aarch64-linux-gnu/libre.so.24


BIN
usr/lib/baresip/modules/kaoptions.so


+ 5 - 5
usr/sbin/kiosk-start.sh

@@ -2,17 +2,17 @@
 SYSCONFCMD="/usr/bin/sysconf"
 SPK_CONF="/etc/speaker.conf"
 
+/usr/bin/startxfce4 &
+#matchbox-window-manager -use_titlebar no &
+
+sleep 1
+
 xset s off
 xset s noblank
 xset -dpms
 
-/usr/bin/startxfce4 &
-#matchbox-window-manager -use_titlebar no &
-
 URL="`${SYSCONFCMD} ${SPK_CONF} get chromium_url url`"
 
-sleep 1
-
 
 while [ 1 ]
 do

+ 0 - 0
usr/sbin/redis-cli


+ 0 - 0
usr/sbin/redis-server


BIN
usr/share/sounds/.DS_Store


BIN
usr/share/sounds/beep.mp3


BIN
usr/share/sounds/cn/dian.mp3


BIN
usr/share/sounds/cn/digit-0.mp3


BIN
usr/share/sounds/cn/digit-1.mp3


BIN
usr/share/sounds/cn/digit-2.mp3


BIN
usr/share/sounds/cn/digit-3.mp3


BIN
usr/share/sounds/cn/digit-4.mp3


BIN
usr/share/sounds/cn/digit-5.mp3


BIN
usr/share/sounds/cn/digit-6.mp3


BIN
usr/share/sounds/cn/digit-7.mp3


BIN
usr/share/sounds/cn/digit-8.mp3


BIN
usr/share/sounds/cn/digit-9.mp3


BIN
usr/share/sounds/cn/get_ip_failed.mp3


BIN
usr/share/sounds/cn/zh.mp3


BIN
usr/share/sounds/en/dian.mp3


BIN
usr/share/sounds/en/digit-0.mp3


BIN
usr/share/sounds/en/digit-1.mp3


BIN
usr/share/sounds/en/digit-2.mp3


BIN
usr/share/sounds/en/digit-3.mp3


BIN
usr/share/sounds/en/digit-4.mp3


BIN
usr/share/sounds/en/digit-5.mp3


BIN
usr/share/sounds/en/digit-6.mp3


BIN
usr/share/sounds/en/digit-7.mp3


BIN
usr/share/sounds/en/digit-8.mp3


BIN
usr/share/sounds/en/digit-9.mp3


BIN
usr/share/sounds/en/en.mp3


BIN
usr/share/sounds/en/get_ip_failed.mp3


BIN
usr/share/sounds/in/dian.mp3


BIN
usr/share/sounds/in/digit-0.mp3


BIN
usr/share/sounds/in/digit-1.mp3


BIN
usr/share/sounds/in/digit-2.mp3


BIN
usr/share/sounds/in/digit-3.mp3


BIN
usr/share/sounds/in/digit-4.mp3


BIN
usr/share/sounds/in/digit-5.mp3


BIN
usr/share/sounds/in/digit-6.mp3


BIN
usr/share/sounds/in/digit-7.mp3


BIN
usr/share/sounds/in/digit-8.mp3


BIN
usr/share/sounds/in/digit-9.mp3


BIN
usr/share/sounds/in/get_ip_failed.mp3


BIN
usr/share/sounds/in/in.mp3


+ 0 - 0
www/speaker-cgi