/* * led_test.c -- led test application * * Copyright (c) 2017 Rockchip Electronics Co. Ltd. * Author: * Panzhenzhuan Wang * Bin Yang * * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include "led_test.h" #define LOG_TAG "led_test" #include "common.h" #define LED_BRIGHTNESS_FILE "/sys/class/leds/led%d/brightness" #define LED_TRIGGER_FILE "/sys/class/leds/led%d/trigger" #define LED_SHOT_FILE "/sys/class/leds/led%d/shot" #define LED_DELAY_ON_FILE "/sys/class/leds/led%d/delay_on" #define LED_DELAY_OFF_FILE "/sys/class/leds/led%d/delay_off" #define LED_NUM 36 #define COLOR_NUM 3 //¶¨ÒåLED¿ªÆô¡¢¹Ø±Õ #define LED_ON "128" #define LED_OFF "0" #define TRIGGER_NONE 0 #define LOG_TAG "led_test" #include "common.h" #define LED_TEST_TIMEOUT -51 #define LED_PROC_ERR -55 //¶¨ÒåLEDµÆÑÕÉ«½á¹¹Ìå typedef enum { LED_BLUE = 0, LED_GREEN, LED_RED, } LED_colors; void *led_test(void *argv); //LED²âÊÔ³ÌÐò int write_int(char const* path,char const* value); //½«ÖµÐ´Èë¶ÔӦ·¾¶Îļþ void *led_test(void *argv) { char buf[128]; char cmd[128]; int led_num,color_num =1; LED_colors test_color; printf("===================LED test start======================\n\n"); fprintf(stderr,"Start testing LED, order is Red, Green, Blue, White.\n Testing:\n"); while(color_num < 4) { switch(color_num%3) //µÚÒ»ÂÖREDµÆ¡¢µÚ¶þÂÖGREENµÆ¡¢µÚÈýÂÖBLUEµÆ¡¢×îºóÒ»ÂÖRGBºÏ³É°×µÆ { case 1: printf(" The testing color is RED: \n"); break; case 2: printf(" The testing color is GREEN: \n"); break; case 0: printf(" The testing color is BLUE: \n"); break; default : fprintf(stderr,"select color error"); } for(led_num=1;led_num<=LED_NUM;led_num++) { switch(led_num % 3) { case LED_RED : if(color_num % 3 == 1) { sprintf(buf,LED_BRIGHTNESS_FILE,led_num); if(-1==write_int(buf,LED_ON)) goto fail; } else { sprintf(buf,LED_BRIGHTNESS_FILE,led_num); if(-1==write_int(buf,LED_OFF)) goto fail; } break; case LED_GREEN : if(color_num % 3 == 2) { sprintf(buf,LED_BRIGHTNESS_FILE,led_num); if(-1==write_int(buf,LED_ON)) goto fail; } else { sprintf(buf,LED_BRIGHTNESS_FILE,led_num); if(-1==write_int(buf,LED_OFF)) goto fail; } break; case LED_BLUE : if(color_num % 3 == 0) { sprintf(buf,LED_BRIGHTNESS_FILE,led_num); if(-1==write_int(buf,LED_ON)) goto fail; } else { sprintf(buf,LED_BRIGHTNESS_FILE,led_num); if(-1==write_int(buf,LED_OFF)) goto fail; } break; default : fprintf(stderr,"select color error"); } } printf("LED shining 1 seconds:\n"); sleep(1); //¼ä¸ô1Ãë color_num++; } //RGBÈýÖÖÑÕÉ«ºÏÔÚÒ»ÆðÐÎ³É°×µÆ for(led_num=1;led_num<=LED_NUM;led_num++) { sprintf(buf,LED_BRIGHTNESS_FILE,led_num); if(-1==write_int(buf,LED_ON)) goto fail; } sleep(1); //ÔÝÍ£1Ãë for(led_num=1;led_num<=LED_NUM;led_num++) { sprintf(buf,LED_BRIGHTNESS_FILE,led_num); if(-1==write_int(buf,LED_OFF)) goto fail; } fprintf(stderr, "===========LED Test finished=============\n"); return (void*)0; fail: return (void*)-1; } //* ÐźŴ¦Àíº¯Êý£¬ÔÚ½áÊø½ø³Ìǰ£¬¹Ø±ÕËùÓÐµÆ static int leds_all_off(int sign_no) { char buf[128]; int led_num; printf("====================function : %s start =================\n",__func__); for(led_num=1; led_num<=LED_NUM; led_num++) { sprintf(buf,LED_BRIGHTNESS_FILE,led_num); if(-1==write_int(buf,LED_OFF)) goto fail; } printf("====================function : %s finished =================\n",__func__); exit(0); fail: exit(-1); } /*Ö÷º¯ÊýÈë¿Ú*/ int main(int argc, char *argv[]) { int test_flag = 0,err_code = 0; char buf[COMMAND_VALUESIZE] = "led_test"; char result[COMMAND_VALUESIZE] = RESULT_PASS; int delay_t = 0; struct timeval t1, t2; log_info("led test start...\n"); //* ×¢²áÐźŴ¦Àíº¯Êý signal(SIGTERM,(__sighandler_t)leds_all_off); gettimeofday(&t1, NULL); while(1) { test_flag = (int)led_test(argv[0]); if(test_flag < 0) { err_code = LED_PROC_ERR; break; } gettimeofday(&t2, NULL); delay_t = (t2.tv_sec - t1.tv_sec) * 1000000 + (t2.tv_usec - t1.tv_usec); if (delay_t > MANUAL_TEST_TIMEOUT) { log_warn("led test end, timeout 60s\n"); err_code = LED_TEST_TIMEOUT; break; } } if (err_code) strcpy(result, RESULT_FAIL); send_msg_to_server(buf, result, err_code); return 0; }