void main(void) { unsigned char cnt=0, i, j; unsigned char receivedByte; bit validKeyPressed = 0; union { unsigned char byteVal[2]; unsigned int intVal; } keyValue; RDA5802Init(); // RDA5802ForceMono( 0 ); // RDA5802BoostBass( 1 ); RDA5802SetVolume( currentVol ); //初始化红外口 IR=1; RELAY_SPEAKER=1;//继电器关 RELAY_POWER=1; while(1) { validKeyPressed = 0; //如果检测到合法按键,则此变量将被置1 // 等待下降沿 while(IR); //记录9ms低电平的长度 cnt=0; while((!IR)&& cnt<IR_COUNT_TIME_OUT ) { delay50us(); cnt++; } if(cnt<170||cnt>180) continue; //9ms低电平不符合,判为干扰 //记录4.5ms高电平的长度 cnt=0; while(IR && cnt<IR_COUNT_TIME_OUT ) { delay50us(); cnt++; } if(cnt<80||cnt>95) continue; //4.5ms高电平不符合,判为干扰 //收取4个字节 for( i=0; i<4; i++ ) { receivedByte=0; for( j=0; j<8; j++ ) { //记录0.56ms低电平 cnt=0; while(!IR && cnt<IR_COUNT_TIME_OUT ) { delay50us(); cnt++; } if(cnt<8||cnt>15) continue; //0.56ms低电平不符合,判为干扰 //记录高电平长度,决定是0还是1 cnt=0; while(IR && cnt<IR_COUNT_TIME_OUT ) { delay50us(); cnt++; } if( cnt>7 && cnt<16 )//0.56ms高电平,判为0 { if( j!=0 ) receivedByte <<= 1; //首位不用左移 } else if(cnt>28 && cnt<40)//1.68ms高电平,判为0 { //该位为1 if( j!=0 ) receivedByte <<= 1; //首位不用左移 receivedByte |= 1; } else break; //低电平不符合0.56ms或1.68ms,判为干扰 } if( cnt >= IR_COUNT_TIME_OUT) break; //干扰 //第一字节为0x00,第二字节为0xff //第三、四字节为键值 if( i==0 && receivedByte!=0 ) break; else if( i==1 && receivedByte!=0xff ) break; else if( i==2 ) { keyValue.byteVal[0] = receivedByte; } else if( i==3 ) { keyValue.byteVal[1] = receivedByte; validKeyPressed = 1; //检测到了合法按键 } } if(validKeyPressed) { //检测到合法的按键了 switch( keyValue.intVal ) { // case 0xa25d: //CH- // case 0x629d: //CH // case 0xe21d: //CH+ // if(powerUp) // { // RDA5802PowerUp(0); // powerUp=0; // } // break; // case 0x22dd: //|<< // RDA5802PowerUp(0); // break; // // case 0x02fd: //>>| // RDA5802PowerUp(1); // break; case 0xe01f: //VOL- if( powerUp && (currentVol>1) ) { currentVol--; RDA5802SetVolume(currentVol); } break; case 0xa857: //VOL+ if( powerUp && (currentVol<15) ) { currentVol++; RDA5802SetVolume(currentVol); } break; case 0x906f: //EQ (Power Off) if(powerUp) { RELAY_SPEAKER=1; delay250ms(); delay250ms(); RELAY_POWER=1; //延时关电源,避免爆炸声 RDA5802PowerUp(0); //关模块 powerUp=0; } break; case 0x30cf: //1 currentStationIndex=0; playStation(); break; case 0x18e7: //2 currentStationIndex=1; playStation(); break; case 0x7a85: //3 currentStationIndex=2; playStation(); break; case 0x10ef: //4 currentStationIndex=3; playStation(); break; case 0x38c7: //5 currentStationIndex=4; playStation(); break; case 0x5aa5: //6 currentStationIndex=5; playStation(); break; case 0x42bd: //7 currentStationIndex=6; playStation(); break; default: break; } } } }
// --------------------------------------------------------------------------- int main(int argc, char* argv[]) { signal(SIGINT, (sig_t)cleanup); // load settings file char* settings_file = NULL; int settings = 0; if(argc == 2) { settings_file = argv[1]; settings = Settings_Load(argv[1]); } if(!settings) { settings_file = "default.conf"; if(!Settings_Load("default.conf")) { printf("%s\r\n", _lng(ERROR_LOADING_SETTINGS)); return 0; } } // load settings FW_VERSION = Settings_Get("gui", "version"); SONG_FILE = Settings_Get("files", "song"); CURRENT_STATION_FILE = Settings_Get("files", "current_station"); STATIONS_FILE = Settings_Get("files", "stations"); USB_PATH = Settings_Get("files", "usb"); // check for running instance char* single_instance_cmd = Settings_Get("programs", "check_running"); ignore_result(system(single_instance_cmd)); FILE *running = fopen("fw.running", "r"); if(running == NULL) { printf("Cannot check if firmware is running, aborting.\r\n"); exit(0); } if(fgetc(running) >= '2') { fclose(running); printf("Firmware is already running!\r\nExiting...\r\n"); exit(0); } else { fclose(running); } if(strcmp(Settings_Get("hardware", "io"), "sim") == 0) IO_SetSimulate(1); if(strcmp(Settings_Get("hardware", "lcd"), "sim") == 0) GLCDD_SetSimulate(1); else if(strcmp(Settings_Get("hardware", "lcd"), "bmp") == 0) GLCDD_SetSimulate(2); GLCDD_Init(); IO_Init(); Language_Init(Settings_Get("gui", "language")); Screen_Init(silkscreen_8); Screen screen = SCREEN_MAIN; // create fonts fnt_dejavu_9 = createFont(dejavu_9); fnt_dejavu_9b = createFont(dejavu_9_b); fnt_silkscreen_8 = createFont(silkscreen_8); // register screens Screen_Add(SCREEN_MAIN, init_Main, draw_Main, exit_Main); Screen_Add(SCREEN_NOW_PLAYING, init_NowPlaying, draw_NowPlaying, exit_NowPlaying); Screen_Add(SCREEN_STATIONS, init_Stations, draw_Stations, exit_Stations); Screen_Add(SCREEN_INFO, NULL, draw_Info, NULL); Screen_Add(SCREEN_USB, init_USB, draw_USB, NULL); Screen_Add(SCREEN_SHUTDOWN, init_Shutdown, draw_Shutdown, NULL); Screen_Add(SCREEN_SETTINGS, init_Settings, draw_Settings, exit_Settings); Screen_Add(SCREEN_WIFI_SCAN, init_WifiScan, draw_WifiScan, exit_WifiScan); Screen_Add(SCREEN_WIFI_AUTH, init_WifiAuth, draw_WifiAuth, NULL); Screen_Add(SCREEN_WIFI_CONNECT, init_WifiConnect, draw_WifiConnect, NULL); Screen_Add(SCREEN_LANGUAGE, init_Language, draw_Language, exit_Language); Screen_Add(SCREEN_VOLUME, init_Volume, draw_Volume, NULL); Screen_Add(SCREEN_SHOUTCAST, init_Shoutcast, draw_Shoutcast, exit_Shoutcast); Screen_Add(SCREEN_SHOUTCAST_LIST, init_ShoutcastList, draw_ShoutcastList, exit_ShoutcastList); Screen_Add(SCREEN_SHOUTCAST_GENRE, init_ShoutcastGenre, draw_ShoutcastGenre, exit_ShoutcastGenre); Screen_Add(SCREEN_SHOUTCAST_SEARCH, init_ShoutcastSearch, draw_ShoutcastSearch, NULL); Screen_Add(SCREEN_MANAGE_STATION, init_ManageStation, draw_ManageStation, exit_ManageStation); Screen_Add(SCREEN_SNOOZE, init_Snooze, draw_Snooze, exit_Snooze); Screen_Add(SCREEN_TIMEOUT, init_Timeout, draw_Timeout, NULL); Screen_SetRefreshTimeout(SCREEN_INFO, 2); Screen_SetRefreshTimeout(SCREEN_MAIN, 10); Screen_SetRefreshTimeout(SCREEN_NOW_PLAYING, 1); Screen_SetRefreshTimeout(SCREEN_STATIONS, 10); Screen_SetRefreshTimeout(SCREEN_USB, 1); Screen_SetRefreshTimeout(SCREEN_SHUTDOWN, 10); Screen_SetRefreshTimeout(SCREEN_WIFI_SCAN, 1); Screen_SetRefreshTimeout(SCREEN_WIFI_AUTH, 10); Screen_SetRefreshTimeout(SCREEN_WIFI_CONNECT, 1); Screen_SetRefreshTimeout(SCREEN_LANGUAGE, 10); Screen_SetRefreshTimeout(SCREEN_VOLUME, 10); Screen_SetRefreshTimeout(SCREEN_SHOUTCAST, 10); Screen_SetRefreshTimeout(SCREEN_SHOUTCAST_LIST, 10); Screen_SetRefreshTimeout(SCREEN_SHOUTCAST_GENRE, 10); Screen_SetRefreshTimeout(SCREEN_SHOUTCAST_SEARCH, 10); Screen_SetRefreshTimeout(SCREEN_MANAGE_STATION, 10); Screen_SetRefreshTimeout(SCREEN_SNOOZE, 10); Screen_SetRefreshTimeout(SCREEN_TIMEOUT, 10); Screen_ShowLoadingScreen(SCREEN_USB, 1); Screen_ShowLoadingScreen(SCREEN_VOLUME, 1); Screen_ShowLoadingScreen(SCREEN_SHOUTCAST_LIST, 1); Screen_ShowLoadingScreen(SCREEN_SHOUTCAST_GENRE, 1); // reset song info resetMetaInfo(); // start ui Screen_Goto(SCREEN_MAIN); // background light GLCDD_BacklightTimeout(atoi(Settings_Get("hardware", "timeout"))); int keep_light_when_playing = 0; if(strcmp(Settings_Get("gui", "keep_light_when_playing"), "true") == 0) keep_light_when_playing = 1; GLCDD_BacklightReset(); uint64_t last_io = 0; while(1) { #ifndef SIMULATE if(getTimeMillisecond() - last_io >= 25) { IO_Get(); last_io = getTimeMillisecond(); } #else IO_Get(); #endif if(IO_HasChanged()) { Screen_ForceRedraw(); GLCDD_BacklightReset(); } screen = Screen_GetActive(); // --------------------------------------------------------------------------- if(screen == SCREEN_MAIN) { int selection = Menu_IsChosen(menu_main); if(selection == 0) { // goto now playing screen Screen_Goto(SCREEN_NOW_PLAYING); } else if(selection == 1) { // goto stations screen Screen_Goto(SCREEN_STATIONS); } else if(selection == 2) { // goto shoutcast browser Screen_Goto(SCREEN_SHOUTCAST); } else if(selection == 3) { // goto usb screen Screen_Goto(SCREEN_USB); } else if(selection == 4) { // goto info screen Screen_Goto(SCREEN_SETTINGS); } } // --------------------------------------------------------------------------- else if(screen == SCREEN_INFO) { if(IO_GetButton(0)) { Screen_Goto(SCREEN_SETTINGS); } } // --------------------------------------------------------------------------- else if(screen == SCREEN_STATIONS) { int selection = Menu_IsChosen(menu_stations); if(selection != -1) { // start station playStation(Menu_GetItemTag(menu_stations, selection)); } // add station as favorite if(IO_GetButtonLong(3)) asFavorite(1); if(IO_GetButtonLong(4)) asFavorite(2); if(IO_GetButtonLong(5)) asFavorite(3); if(IO_GetButtonLong(6)) asFavorite(4); } // --------------------------------------------------------------------------- else if(screen == SCREEN_NOW_PLAYING) { // if at now playing screen, backlight is always on if(keep_light_when_playing) GLCDD_BacklightReset(); } // --------------------------------------------------------------------------- else if(screen == SCREEN_SETTINGS) { int selection = Menu_IsChosen(menu_settings); if(selection == 0) { // goto info screen Screen_Goto(SCREEN_INFO); } else if(selection == 1) { // goto wifi scanning screen Screen_Goto(SCREEN_WIFI_SCAN); } else if(selection == 2) { // goto language selection Screen_Goto(SCREEN_LANGUAGE); } else if(selection == 3) { // goto volume adjustment Screen_Goto(SCREEN_VOLUME); } else if(selection == 4) { // goto backlight timeout Screen_Goto(SCREEN_TIMEOUT); } else if(selection == 5) { // goto station manager Screen_Goto(SCREEN_MANAGE_STATION); } else if(selection == 6) { // restart firmware // stop all music stopMusic(); // kill all streams ignore_result(system(Settings_Get("programs", "killall"))); // restart self execv(argv[0], argv); } else if(selection == 7) { // shutdown Screen_Goto(SCREEN_SHUTDOWN); } } // --------------------------------------------------------------------------- else if(screen == SCREEN_WIFI_SCAN) { int selection = Menu_IsChosen(menu_wifi_scan); if(selection != -1) { // save ssid Settings_Add("wifi", "ssid", Menu_GetItemText(menu_wifi_scan, selection)); // go to authentification Screen_Goto(SCREEN_WIFI_AUTH); } } // --------------------------------------------------------------------------- else if(screen == SCREEN_WIFI_AUTH) { if(Keyboard_IsConfirmed()) { // connect to wifi network Settings_Add("wifi", "pwd", Keyboard_GetText()); printf("Connecting to '%s' with key '%s'\r\n", Settings_Get("wifi", "ssid"), Settings_Get("wifi", "pwd")); Screen_Goto(SCREEN_WIFI_CONNECT); } } // --------------------------------------------------------------------------- else if(screen == SCREEN_LANGUAGE) { // change language int selection = Menu_IsChosen(menu_language); if(selection != -1) { char disp[64]; int i; strcpy(disp, Menu_GetItemText(menu_language, selection)); for(i = strlen(disp) - 1; i >= 0; i--) { if(disp[i] == ')') disp[i] = 0; if(disp[i] == '(') { i++; break; } } Settings_Add("gui", "language", &disp[i]); Language_Cleanup(); Language_Init(&disp[i]); Settings_Save(settings_file); Screen_Goto(SCREEN_SETTINGS); } } // --------------------------------------------------------------------------- else if(screen == SCREEN_VOLUME) { if(IO_GetButton(0)) { // go back to settings Screen_Goto(SCREEN_SETTINGS); } } // --------------------------------------------------------------------------- else if(screen == SCREEN_SHOUTCAST) { int selection = Menu_IsChosen(menu_shoutcast); if(selection == 0) { // go to shoutcast top stations setShoutcastListUrl(Settings_Get("shoutcast", "list_url")); printf("'%s'\r\n", Settings_Get("shoutcast", "list_url")); setStationsParentGenre("X"); setCurrentGenre(" "); Screen_Goto(SCREEN_SHOUTCAST_LIST); } else if(selection == 1) { // random station setShoutcastListUrl(Settings_Get("shoutcast", "random_url")); setStationsParentGenre("X"); setCurrentGenre(" "); Screen_Goto(SCREEN_SHOUTCAST_LIST); } else if(selection == 2) { // go to genre list setShoutcastGenreParent("0"); Screen_Goto(SCREEN_SHOUTCAST_GENRE); } else if(selection == 3) { // go to station search Screen_Goto(SCREEN_SHOUTCAST_SEARCH); } } // --------------------------------------------------------------------------- else if(screen == SCREEN_SHOUTCAST_GENRE) { int selection = Menu_IsChosen(menu_genres); if(selection != -1) { if(selection == 0) { // back if(strcmp(getShoutcastGenreParent(), "0") == 0) { // main genres Screen_Goto(SCREEN_SHOUTCAST); } else { // sub genre -> go back to main genres setShoutcastGenreParent("0"); Screen_Goto(SCREEN_SHOUTCAST_GENRE); } } else { // list stations or sub genre ShoutcastGenre* info = getChosenGenre((int)Menu_GetItemTag(menu_genres, selection)); // show sub genres if(info->has_children) { setStationsParentGenre(info->id); setShoutcastGenreParent(info->id); Screen_Goto(SCREEN_SHOUTCAST_GENRE); } else { // show stations char buffer[128]; sprintf(buffer, Settings_Get("shoutcast", "stations_by_genre_url"), info->name); setShoutcastListUrl(buffer); setCurrentGenre(info->name); Screen_Goto(SCREEN_SHOUTCAST_LIST); } } } } // --------------------------------------------------------------------------- else if(screen == SCREEN_SHOUTCAST_LIST) { if(Menu_GetAutoIO(menu_station_list)) { int selection = Menu_IsChosen(menu_station_list); if(selection != -1) { if(selection == 0) { // back if(strcmp(getStationsParentGenre(), "X") == 0) { // go to shoutcast menu Screen_Goto(SCREEN_SHOUTCAST); } else { // go to genre list setShoutcastGenreParent(getStationsParentGenre()); Screen_Goto(SCREEN_SHOUTCAST_GENRE); } } else { // show play/as_favorite/cancel menu Menu_SetAutoIO(menu_station_list, 0); Screen_ForceRedraw(); } } } else { int selection = Menu_IsChosen(menu_play_fav); if(selection != -1) { Menu_SetAutoIO(menu_station_list, 1); Screen_ForceRedraw(); if(selection == 0) { // play ShoutcastStation* info = getChosenStation((int)Menu_GetItemTag(menu_station_list, Menu_GetSelectedItem(menu_station_list))); StationInfo* station = parseShoutcastList(info); station->genre = getCurrentGenre(); playStation(station); free(station->url); free(station); } else if(selection == 1) { // add to station list ShoutcastStation* sc_stat = getChosenStation((int)Menu_GetItemTag(menu_station_list, Menu_GetSelectedItem(menu_station_list))); StationInfo* stat = parseShoutcastList(sc_stat); StationInfo* info = (StationInfo*)malloc(sizeof(StationInfo)); info->tag = '\0'; info->name = stat->name; info->url = stat->url; info->genre = getCurrentGenre(); ArrayList* stations = readStations(); AList_Add(stations, info); writeStations(stations); AList_Delete(stations, AList_Length(stations) - 1); freeStations(stations); AList_Destroy(stations); free(stat->url); free(stat); free(info); } else if(selection == 2) { // cancel // do nothing } } } } // --------------------------------------------------------------------------- else if(screen == SCREEN_SHOUTCAST_SEARCH) { if(Keyboard_IsConfirmed()) { char buffer[256]; sprintf(buffer, Settings_Get("shoutcast", "search_url"), Keyboard_GetText()); setShoutcastListUrl(buffer); setStationsParentGenre("X"); setCurrentGenre(" "); Screen_Goto(SCREEN_SHOUTCAST_LIST); } } // --------------------------------------------------------------------------- else if(screen == SCREEN_MANAGE_STATION) { if(Menu_GetAutoIO(menu_m_station)) { // handle station list menu int selection = Menu_IsChosen(menu_m_station); if(selection != -1) { // show menu Menu_SetAutoIO(menu_m_station, 0); Menu_ScrollTo(menu_m_menu, 0); Screen_ForceRedraw(); } } else { if(Menu_GetAutoIO(menu_m_menu)) { // handle station menu int selection = Menu_IsChosen(menu_m_menu); if(selection == 0) { // do nothing (cancel) } else if(selection == 1) { // move -> handled below } else if(selection == 2) { deleteStation(Menu_GetSelectedItem(menu_m_station)); Screen_Goto(SCREEN_MANAGE_STATION); } // close menu if(selection != -1) { if(selection == 1) { // move -> disable all menus Menu_SetAutoIO(menu_m_menu, 0); Menu_SetTitleTag(menu_m_station, Menu_GetSelectedItem(menu_m_station), '*'); Screen_ForceRedraw(); } else { Menu_SetAutoIO(menu_m_station, 1); Screen_ForceRedraw(); } } } else { // moving stations if(IO_GetButton(0)) { // we are done Menu_SetTitleTag(menu_m_station, Menu_GetSelectedItem(menu_m_station), 0); ArrayList* new_stations = AList_Create(); int i; for(i = 0; i < Menu_GetItems(menu_m_station); i++) { StationInfo* info = Menu_GetItemTag(menu_m_station, i); AList_Add(new_stations, info); } writeStations(new_stations); AList_Destroy(new_stations); Menu_SetAutoIO(menu_m_menu, 1); Menu_SetAutoIO(menu_m_station, 1); Screen_ForceRedraw(); } else { int8_t rotary = IO_GetRotaryValue(); if(rotary != 0) { int index = Menu_GetSelectedItem(menu_m_station); int new_index = index + ((rotary > 0) ? 1 : -1); Menu_SwapItems(menu_m_station, index, new_index); Menu_Scroll(menu_m_station, (rotary > 0) ? 1 : -1); } } } } } // --------------------------------------------------------------------------- else if(screen == SCREEN_TIMEOUT) { if(IO_GetButton(0)) { // go back to settings char buffer[8]; sprintf(buffer, "%d", Timeout_Get()); Settings_Add("hardware", "timeout", buffer); Settings_Save(settings_file); GLCDD_BacklightTimeout(Timeout_Get()); Screen_Goto(SCREEN_SETTINGS); } } // --------------------------------------------------------------------------- // home button if(IO_GetButton(1)) Screen_Goto(SCREEN_MAIN); // play/stop button if(IO_GetButton(2)) { if(screen != SCREEN_USB) { // stop music stopMusic(); } else { // play folder int i; FILE* f = fopen("/tmp/playlist1.m3u", "w"); for(i = 0; i < Menu_GetItems(menu_usb); i++) { // a file, add it to the list if((int)Menu_GetItemTag(menu_usb, i) == 0) { fprintf(f, "%s/%s\r\n", usb_root, Menu_GetItemText(menu_usb, i)); } } fclose(f); char cmd[128]; sprintf(cmd, "%s /tmp/playlist1.m3u > /tmp/playlist.m3u", Settings_Get("programs", "shuffle")); ignore_result(system(cmd)); playUSB("/tmp/playlist.m3u"); } } // end of snooze time if(checkSnoozeStop()) { // stop the music stopMusic(); // go to main screen Screen_Goto(SCREEN_MAIN); } // (1) button if(IO_GetButton(3)) playFavorite(1); // (2) button if(IO_GetButton(4)) playFavorite(2); // (3) button if(IO_GetButton(5)) playFavorite(3); // (4) button if(IO_GetButton(6)) playFavorite(4); Screen_Draw(); GLCDD_BacklightUpdate(); usleep(100); //sleep(1); } // really no need to cleanup, as firmware runs as long as device is powered // plus, the operating system frees all resources anyway }