12.24~12.28
周一。昨晚发现被窝里看手机,背光还是太亮,试着加一个level,当环境光线低于40,背光设为10。根据配置里的比例改kernel。其依据是配置里的config_autoBrightnessLevels发的身份,并将最亮背光的最低环境光要求设为40w,这是估算,今天线忘带,明天实际测下,看阳光下能到多少背光,再调整。
配置有点怪异,第三级背光突然增加,外界环境光增速是2.5 4 2.5 3,对应背光增速是2.5 4 1.5 1.33 1.25
//6 levels, depending on the config_autoBrightnessLcdBacklightValues in config.xml
//and get 400000 as the minimum requirement of the max level
if(lux >= 5334 && lux < 13333)
lux = 8000;//1
else if(lux >= 13333 && lux < 53333)
lux = 16000;//2
else if(lux >= 53333 && lux < 133333)
lux = 30000;//3
else if(lux >= 133333 && lux < 399999)
lux = 100000;//12
//<5334 -> 0; >=399999 -> lux/8000*100-20
周二
以下代码,若在//--------------------之后加上任何一个声明,如,char a;打印出的buffer立马出错!!
原来是buffer需要初始化,把第19行改为char *buffer = malloc(1001);就好了。
因为这个指针未初始化时,给它赋值,将把值赋给不确定的内存段
#include <stdio.h>
#include <fcntl.h>
#include <locale.h>
#include <string.h>
#define FILE "shediao"
int main(){
setlocale(LC_ALL, "GBK");
#ifdef FILE
printf("defined, FILE = %s\n", FILE);
#endif
printf("over\n");
//--------------------------------------------------------------
int f1;
int f2;
char *buffer;
f1 = open(FILE, O_RDONLY);
if (f1<0)
printf("open_error\n");
read(f1, buffer, 1000);
f2 = creat("shediao_fixed", 777);
if(f2<0)
printf("creat_error\n");
write(f2, buffer, 1000);
printf("%s, length:%ld\n", buffer, strlen(buffer));
close(f2);
close(f1);
return 0;
}
GBK编码中一个汉字占3字节,而换行符等依然是1字节
#include <stdio.h>
#include <fcntl.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>
#define FILE "shediao"
#define MYSIZE 1000
int main(){
setlocale(LC_ALL, "GBK");
#ifdef FILE
printf("defined, FILE = %s\n", FILE);
#endif
printf("over\n");
//--------------------------------------------------------------
int f1, f2, count = MYSIZE, presentence;
char *pr1, *pr2;
char *buffer = malloc(MYSIZE+1);
f1 = open(FILE, O_RDONLY);
if (f1<0){
printf("open_error\n");
return -1;
}
f2 = creat("shediao_fixed", 777);
if(f2<0){
printf("creat_error\n");
return -1;
}
while(count == MYSIZE){
char *temp = malloc(MYSIZE+1);
count = read(f1, buffer, MYSIZE);
if(count<0){
printf("read error\n");
return -1;
}
pr1 = buffer;
pr2 = pr1;
while(pr1 < buffer + MYSIZE){
if(*pr1 == '\n'){
if(pr1 - pr2 >= 26*3){
strncat(temp, pr2, pr1-pr2);
//printf("\n26:%s,%ld,%ld,1-2=%d \n", temp, pr1,pr2,pr1-pr2);
}else if(pr1 - pr2 >= 24*3 && presentence <= 26){
strncat(temp, pr2, pr1-pr2);
//printf("\n24:%s,%ld,%ld,1-2=%d \n", temp, pr1,pr2,pr1-pr2);
}else{
strncat(temp, pr2, pr1-pr2+1);
//printf("\nelse:%s,%ld,%ld,1-2=%d \n", temp, pr1,pr2,pr1-pr2);
}
presentence = pr2 - pr1;
pr2 = pr1+1;
}
pr1++;
}
strncat(temp, pr2, pr1-pr2);
//printf("all:1-2 =%d temp:%s,pr1:%ld, pr2:%ld, \n", pr1 - pr2, temp, pr1, pr2);
if(write(f2, temp, count) < 0){
printf("write error\n");
return -1;
}
//printf("length = %ld, %s\n",strlen(temp), temp);
}
close(f2);
close(f1);
return 0;
}
调试一下午,发现原因是write(f2, temp, count);count大于temp中含字符的大小,
改为write(f2, temp, strlen(temp))。
但这仍不是全部的错误!!
41行,内层while的循环条件应该是pr1 < buffer + count,而不是MYMAX;
因为count是read后的结果,将小于等于MYMAX,它的安全性更高。使用MYMAX的结果就是在最后一次外层循环中,读取的字节数将不足1000byte,此时若仍让pr1走1000次,将会在第58行strncat(temp, pr2, pr1-pr2);刷进未知的东西,然后导致最后文件读取不了,全是乱码。
挖哈哈,哥的射雕英雄传格式终于正确,成就感油然而生,深藏功与名。
最终版本:
#include <stdio.h>
#include <fcntl.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>
#define FILE "shediao"
#define MYSIZE 1000
int main(){
setlocale(LC_ALL, "GBK");
#ifdef FILE
printf("defined, FILE = %s\n", FILE);
#endif
printf("over\n");
//--------------------------------------------------------------
int f1, f2, count = MYSIZE, presentence;
char *pr1, *pr2;
char *buffer = malloc(MYSIZE+1);
f1 = open(FILE, O_RDONLY);
if (f1<0){
printf("open_error\n");
return -1;
}
f2 = creat("shediao_fixed", 777);
if(f2<0){
printf("creat_error\n");
return -1;
}
while(count == MYSIZE){
char *temp = malloc(MYSIZE+1);
count = read(f1, buffer, MYSIZE);
if(count<0){
printf("read error\n");
return -1;
}
pr1 = buffer;
pr2 = pr1;
while(pr1 < buffer + count){
if(*pr1 == '\n'){
if(pr1 - pr2 >= 26*3){
strncat(temp, pr2, pr1-pr2);
//printf("\n26:%s,%ld,%ld,1-2=%d \n", temp, pr1,pr2,pr1-pr2);
}else if(pr1 - pr2 >= 24*3 && presentence <= 26){
strncat(temp, pr2, pr1-pr2);
//printf("\n24:%s,%ld,%ld,1-2=%d \n", temp, pr1,pr2,pr1-pr2);
}else{
strncat(temp, pr2, pr1-pr2+1);
//printf("\nelse:%s,%ld,%ld,1-2=%d \n", temp, pr1,pr2,pr1-pr2);
}
presentence = pr2 - pr1;
pr2 = pr1+1;
}
pr1++;
}
strncat(temp, pr2, pr1-pr2);
//printf("all:1-2 =%d temp:%s,pr1:%ld, pr2:%ld, \n", pr1 - pr2, temp, pr1, pr2);
if(write(f2, temp, strlen(temp)) < 0){
printf("write error\n");
return -1;
}
//printf("length = %ld, %s\n",strlen(temp), temp);
}
close(f2);
close(f1);
return 0;
}
更新了版本,新加入变量remain_buffer,即每次read后最后一行,这行的字节数将加入下一次read第一行是否要删‘\n’的判断条件。
#include <stdio.h>
#include <fcntl.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>
#define FILE "shediao"
#define DEST_FILE "shediao_fixed"
#define MYSIZE 1000
int main(){
setlocale(LC_ALL, "GBK");
#ifdef FILE
printf("defined, FILE = %s\n", FILE);
#endif
printf("over\n");
//--------------------------------------------------------------
int f1, f2, count = MYSIZE, presentence;
char *pr1, *pr2;
char *buffer = malloc(MYSIZE+1);
signed int remain_buffer = 0;
f1 = open(FILE, O_RDONLY);
if (f1<0){
printf("open_error\n");
return -1;
}
f2 = creat(DEST_FILE, 777);
if(f2<0){
printf("creat_error\n");
return -1;
}
while(count == MYSIZE){
char *temp = malloc(MYSIZE+1);
count = read(f1, buffer, MYSIZE);
if(count<0){
printf("read error\n");
return -1;
}
pr1 = buffer;
pr2 = pr1;
while(pr1 < buffer + count){
if(*pr1 == '\n'){
if(pr1 - pr2 >= 26*3 || (strlen(temp)==0 && pr1 - pr2 + remain_buffer >= 26*3) ){
strncat(temp, pr2, pr1-pr2);
//printf("\n26:%s,%ld,%ld,1-2=%d \n", temp, pr1,pr2,pr1-pr2);
}else if( (pr1 - pr2 >= 24*3 && presentence <= 26) || (strlen(temp)==0 && pr1 - pr2 + remain_buffer >= 24*3 && presentence <= 26 ) ){
strncat(temp, pr2, pr1-pr2);
//printf("\n24:%s,%ld,%ld,1-2=%d \n", temp, pr1,pr2,pr1-pr2);
}else{
strncat(temp, pr2, pr1-pr2+1);
//printf("\nelse:%s,%ld,%ld,1-2=%d \n", temp, pr1,pr2,pr1-pr2);
}
presentence = pr2 - pr1;
pr2 = pr1+1;
}
pr1++;
}
remain_buffer = pr1-pr2;
strncat(temp, pr2, remain_buffer);
//printf("all:1-2 =%d temp:%s,pr1:%ld, pr2:%ld, \n", pr1 - pr2, temp, pr1, pr2);
if(write(f2, temp, strlen(temp)) < 0){
printf("write error\n");
return -1;
}
//printf("length = %ld, %s\n",strlen(temp), temp);
}
close(f2);
close(f1);
return 0;
}
用抛异常的方法追踪调用者,提供者:Android驱动研究群,北京-Airk(qq:176951632)
Log.d(LOG_TAG, "dyyr - print caller of updateProximitySensorMode");
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}//dyyr 出现的log头是System.err
Psensor
ailt,aiht,piht,pilt
a:als a??? light sensor
p:ps proximity sensor
i:??
h,l:high, low
t:threshold
编package/app的时候会出两个目标:
Install: out/target/product/T20WG/system/app/Phone.apk
Install: out/target/product/T20WG/data/app/PhoneAppTests.apk
只用第一个就好,测试的那个没什么用