char *ask_password(const char *question) { if (is_slave_mode()) printf(REPORT_PREFIX_ASK_PASSWORD "%s\n", question); else printf("%s ", question); fflush(stdout); if (!is_slave_mode() && is_noninteractive_mode()) { putchar('\n'); fflush(stdout); return xstrdup(""); } bool changed = set_echo(false); char *result = xmalloc_fgets(stdin); strtrimch(result, '\n'); if (changed) set_echo(true); return result; }
static void handle_sigTSTP(int signo) { sigset_t all_signals; int error, saved_errno = errno; DEBUG_RANDOM_SLEEP; sigfillset(&all_signals); DPRINTF2(DEBUG_SIGNALS, "got %s, sending it to pgid %d", signal_name(signo), command_pid); zero_select_timeout(); /* Hand the SIGTSTP down to command and its process group */ if (command_pid && (error = kill(-command_pid, SIGTSTP))) { myerror(FATAL|USE_ERRNO, "Failed to deliver SIGTSTP"); } if (within_line_edit) save_rl_state(); mysignal(SIGTSTP, SIG_DFL); /* reset disposition to default (i.e. suspend) */ sigprocmask(SIG_UNBLOCK, &all_signals, NULL); /* respond to sleep- and wake-up signals */ kill(getpid(), SIGTSTP); /* suspend */ /* keyboard gathers dust, kingdoms crumble,.... */ /* .... */ /* Beautiful princess types "fg", (or her father tries to kill us...) and we wake up HERE: */ sigprocmask(SIG_BLOCK, &all_signals, NULL); mysignal(SIGTSTP, &handle_sigTSTP); DPRINTF0(DEBUG_SIGNALS, "woken up"); /* On most systems, command's process group will have been woken up by the handler of the signal that woke us up. This doesn't seem to happen for SIGCONT on QNX, so here goes: */ #ifdef __QNX__ if (command_pid && (error = kill(-command_pid, SIGCONT))) { myerror(FATAL|USE_ERRNO, "Failed to deliver SIGCONT"); } #endif if (within_line_edit) { restore_rl_state(); } else { set_echo(FALSE); cr(); if (skip_rlwrap()) return; move_cursor_to_start_of_prompt(ERASE); cook_prompt_if_necessary(); my_putstr(saved_rl_state.cooked_prompt); } adapt_tty_winsize(STDIN_FILENO, master_pty_fd); /* just in case */ errno = saved_errno; sigprocmask(SIG_UNBLOCK, &all_signals, NULL); }
int main(void) { /* Start led connected to P1.29 and P1.18 */ LPC_GPIO1->FIODIR |= 0x20040000; LPC_GPIO1->FIOSET |= (1 << 29); LPC_GPIO1->FIOCLR |= (1 << 18); SystemInit(); // lpc1768_startup.c SystemCoreClockUpdate(); GPIOInit(); TimerInit(); ValueInit(); ADCInit(); comm_init(); // welcomeMsg(); set_echo(); easyWEB_init(); printchar("at+ndhcp=1\r"); printchar("at+wa=greenet\r"); printchar("at+nstcp=20\r"); printchar(" \b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); while(1) { easyWEB_s_loop(); //handle_command(); //UART command if(UpdateChannel >= 3) { UpdateChannel = -1; ADCRead(0); if (mode ==1) //decide which ADC channel to read when the converter is working in different direction { Vout = ADCValues(0); Vin = ADCValues(1); } else { Vout = ADCValues(1); Vin = ADCValues(0); } Iref = ADCValues(2); Il = abs (ADCValues(3) - Iref); //get the correct inductor current MeanValues(); BangBang(); LPC_GPIO1->FIOPIN ^= (1 << 29); LPC_GPIO1->FIOPIN ^= (1 << 18); } } return 0; }
void mirror_slaves_echo_mode() { /* important e.g. when slave command asks for password */ struct termios *pterm_slave = NULL; int should_echo_anyway = always_echo || (always_readline && !dont_wrap_command_waits()); if ( !(pterm_slave = my_tcgetattr(slave_pty_fd, "slave pty")) || command_is_dead || always_echo ) /* race condition here: SIGCHLD may not yet have been caught */ return; assert (pterm_slave != NULL); if (tcsetattr(STDIN_FILENO, TCSANOW, pterm_slave) < 0 && errno != ENOTTY) /* @@@ */ myerror ("cannot prepare terminal (tcsetattr error on stdin)"); term_eof = pterm_slave -> c_cc[VEOF]; /* if the --always-readline option is set with argument "assword:", determine whether prompt ends with "assword:\s" */ if (should_echo_anyway && password_prompt_search_string) { char *p, *q; assert(strlen(saved_rl_state.raw_prompt) < BUFFSIZE); p = saved_rl_state.raw_prompt + strlen(saved_rl_state.raw_prompt) - 1; q = password_prompt_search_string + strlen(password_prompt_search_string) - 1; while (*p == ' ') /* skip trailing spaces in prompt */ p--; while (p >= saved_rl_state.raw_prompt && q >= password_prompt_search_string) if (*p-- != *q--) break; if (q < password_prompt_search_string) /* found "assword:" */ should_echo_anyway = FALSE; } if (!command_is_dead && (should_echo_anyway || pterm_slave->c_lflag & ECHO)) { redisplay = TRUE; } else { redisplay = FALSE; } if (pterm_slave) free(pterm_slave); set_echo(redisplay); /* This is a bit weird: we want echo off all the time, because readline takes care of echoing, but as readline uses the current ECHO mode to determine whether you want echo or not, we must set it even if we know that readline will switch it off immediately */ }
char *git_terminal_prompt(const char *prompt, int echo) { static struct strbuf buf = STRBUF_INIT; int r; FILE *input_fh, *output_fh; #ifdef GIT_WINDOWS_NATIVE /* try shell_prompt first, fall back to CONIN/OUT if bash is missing */ char *result = shell_prompt(prompt, echo); if (result) return result; if (echo && set_echo(1)) return NULL; #endif input_fh = fopen(INPUT_PATH, "r" FORCE_TEXT); if (!input_fh) return NULL; output_fh = fopen(OUTPUT_PATH, "w" FORCE_TEXT); if (!output_fh) { fclose(input_fh); return NULL; } if (!echo && disable_echo()) { fclose(input_fh); fclose(output_fh); return NULL; } fputs(prompt, output_fh); fflush(output_fh); r = strbuf_getline_lf(&buf, input_fh); if (!echo) { putc('\n', output_fh); fflush(output_fh); } restore_term(); fclose(input_fh); fclose(output_fh); if (r == EOF) return NULL; return buf.buf; }
/* * call-seq: * io.echo = flag * * Enables/disables echo back. * On some platforms, all combinations of this flags and raw/cooked * mode may not be valid. * * You must require 'io/console' to use this method. */ static VALUE console_set_echo(VALUE io, VALUE f) { conmode t; rb_io_t *fptr; int fd; GetOpenFile(io, fptr); fd = GetReadFD(fptr); if (!getattr(fd, &t)) rb_sys_fail(0); if (RTEST(f)) set_echo(&t, NULL); else set_noecho(&t, NULL); if (!setattr(fd, &t)) rb_sys_fail(0); return io; }
static void line_handler(char *line) { char *rewritten_line, *filtered_line; if (line == NULL) { /* EOF on input, forward it */ DPRINTF1(DEBUG_READLINE, "EOF detected, writing character %d", term_eof); /* colour_the_prompt = FALSE; don't mess with the cruft that may come out of dying command @@@ but command may not die!*/ write_EOF_to_master_pty(); } else { if (*line && /* forget empty lines */ redisplay && /* forget passwords */ !forget_line && /* forget lines entered by CTRL-O */ !match_regexp(line, forget_regexp, TRUE)) { /* forget lines (case-inseitively) matching -g option regexp */ my_add_history(line); } forget_line = FALSE; /* until CTRL-O is used again */ /* Time for a design decision: when we send the accepted line to the client command, it will most probably be echoed back. We have two choices: we leave the entered line on screen and suppress just enough of the clients output (I believe this is what rlfe does), or we remove the entered input (but not the prompt!) and let it be replaced by the echo. This is what we do; as a bonus, if the program doesn't echo, e.g. at a password prompt, the **** which has been put there by our homegrown_redisplay function will be removed (@@@is this what we want?) I think this method is more natural for multi-line input as well, (we will actually see our multi-line input as multiple lines) but not everyone will agree with that. O.K, we know for sure that cursor is at start of line. When clients output arrives, it will be printed at just the right place - but first we 'll erase the user input (as it may be about to be changed by the filter) */ rl_delete_text(0, rl_end); /* clear line (after prompt) */ rl_point = 0; my_redisplay(); /* and redisplay (this time without user input, cf the comments for the line_handler() function below) */ rewritten_line = (multiline_separator ? search_and_replace(multiline_separator, "\n", line, 0, NULL, NULL) : mysavestring(line)); if (redisplay) filtered_line = pass_through_filter(TAG_INPUT, rewritten_line); else { /* password, none of filters business */ pass_through_filter(TAG_INPUT, "***"); /* filter some input anyway, to keep filter in sync (result is discarded). */ filtered_line = mysavestring(rewritten_line); } free(rewritten_line); /* do we have to adapt clients winzsize now? */ if (deferred_adapt_commands_window_size) { adapt_tty_winsize(STDIN_FILENO, master_pty_fd); kill(-command_pid, SIGWINCH); deferred_adapt_commands_window_size = FALSE; } /*OK, now feed line to underlying command and wait for the echo to come back */ put_in_output_queue(filtered_line); DPRINTF2(DEBUG_READLINE, "putting %d bytes %s in output queue", (int) strlen(rewritten_line), mangle_string_for_debug_log(rewritten_line, 40)); write_EOL_to_master_pty(return_key ? &return_key : "\n"); accepted_lines++; free_foreign(line); /* free_foreign because line was malloc'ed by readline, not by rlwrap */ free(filtered_line); /* we're done with them */ return_key = 0; within_line_edit = FALSE; if(!RL_ISSTATE(RL_STATE_MACROINPUT)) /* when called during playback of a multi-line macro, line_handler() will be called more than once whithout re-entering main_loop(). If we'd remove it here, the second call would crash */ rl_callback_handler_remove(); set_echo(FALSE); free(saved_rl_state.input_buffer); free(saved_rl_state.raw_prompt); free(saved_rl_state.cooked_prompt); saved_rl_state.input_buffer = mysavestring(""); saved_rl_state.raw_prompt = mysavestring(""); saved_rl_state.cooked_prompt = NULL; saved_rl_state.point = 0; saved_rl_state.already_saved = TRUE; redisplay = TRUE; if (one_shot_rlwrap) write_EOF_to_master_pty(); } }
static int disable_echo(void) { return set_echo(0); }
/* * main loop: listen on stdin (for user input) and master pty (for command output), * and try to write output_queue to master_pty (if it is not empty) * This function never returns. */ void main_loop() { int nfds; fd_set readfds; fd_set writefds; int nread; char buf[BUFFSIZE], *timeoutstr, *old_raw_prompt, *new_output_minus_prompt; int promptlen = 0; int leave_prompt_alone; sigset_t no_signals_blocked; struct timespec select_timeout, *select_timeoutptr; struct timespec immediately = { 0, 0 }; /* zero timeout when child is dead */ struct timespec wait_a_little = {0, 0xBadf00d }; /* tv_usec field will be filled in when initialising */ struct timespec *forever = NULL; wait_a_little.tv_nsec = 1000 * 1000 * wait_before_prompt; sigemptyset(&no_signals_blocked); init_readline(""); last_minute_checks(); pass_through_filter(TAG_OUTPUT,""); /* If something is wrong with filter, get the error NOW */ set_echo(FALSE); /* This will also put the terminal in CBREAK mode */ test_main(); /* ------------------------------ main loop -------------------------------*/ while (TRUE) { /* listen on both stdin and pty_fd */ FD_ZERO(&readfds); FD_SET(STDIN_FILENO, &readfds); FD_SET(master_pty_fd, &readfds); /* try to write output_queue to master_pty (but only if it is nonempty) */ FD_ZERO(&writefds); if (output_queue_is_nonempty()) FD_SET(master_pty_fd, &writefds); DPRINTF1(DEBUG_AD_HOC, "prompt_is_still_uncooked = %d", prompt_is_still_uncooked); if (command_is_dead || ignore_queued_input) { select_timeout = immediately; select_timeoutptr = &select_timeout; timeoutstr = "immediately"; } else if (prompt_is_still_uncooked) { select_timeout = wait_a_little; select_timeoutptr = &select_timeout; timeoutstr = "wait_a_little"; } else { select_timeoutptr = forever; /* NULL */ timeoutstr = "forever"; } DPRINTF1(DEBUG_TERMIO, "calling select() with timeout %s", timeoutstr); nfds = my_pselect(1 + master_pty_fd, &readfds, &writefds, NULL, select_timeoutptr, &no_signals_blocked); DPRINTF3(DEBUG_TERMIO, "select() returned %d (stdin|pty in|pty out = %03d), within_line_edit=%d", nfds, 100*(FD_ISSET(STDIN_FILENO, &readfds)?1:0) + 10*(FD_ISSET(master_pty_fd, &readfds)?1:0) + (FD_ISSET(master_pty_fd, &writefds)?1:0), within_line_edit); assert(!filter_pid || filter_is_dead || kill(filter_pid,0) == 0); assert(command_is_dead || kill(command_pid,0) == 0); /* check flags that may have been set by signal handlers */ if (filter_is_dead) filters_last_words(); /* will call myerror with last words */ if (received_WINCH) { /* received_WINCH flag means we've had a WINCH while within_line_edit was FALSE */ DPRINTF0(DEBUG_READLINE, "Starting line edit as a result of WINCH "); within_line_edit = TRUE; restore_rl_state(); received_WINCH = FALSE; continue; } if (nfds < 0) { /* exception */ if (errno == EINTR) { /* interrupted by signal */ continue; } else myerror("select received exception"); } else if (nfds == 0) { /* timeout, which can only happen when .. */ if (ignore_queued_input) { /* ... we have read all the input keystrokes that should be ignored (i.e. those that accumulated on stdin while we were calling an external editor) */ ignore_queued_input = FALSE; continue; } else if (command_is_dead) { /* ... or else, if child is dead, ... */ DPRINTF2(DEBUG_SIGNALS, "select returned 0, command_is_dead=%d, commands_exit_status=%d", command_is_dead, commands_exit_status); cleanup_rlwrap_and_exit(EXIT_SUCCESS); } else if (prompt_is_still_uncooked) { /* cooking time? */ if (we_just_got_a_signal_or_EOF) { we_just_got_a_signal_or_EOF = FALSE; /* 1. If we got a signal/EOF before cooking time, we don't need special action to preserve the cooked prompt. 2. Reset we_just_got_a_signal_or_EOF after a signal or EOF that didn't kill command */ continue; } if (!skip_rlwrap()) { /* ... or else, it is time to cook the prompt */ if (pre_given && accepted_lines == 0) { saved_rl_state.input_buffer = mysavestring(pre_given); /* stuff pre-given text into edit buffer */ saved_rl_state.point = strlen(pre_given); DPRINTF0(DEBUG_READLINE, "Starting line edit (because of -P option)"); within_line_edit = TRUE; restore_rl_state(); continue; } if (accepted_lines == 1 && one_shot_rlwrap) cleanup_rlwrap_and_exit(EXIT_SUCCESS); move_cursor_to_start_of_prompt(ERASE); /* cooked prompt may be shorter than raw prompt, hence the ERASE */ /* move and erase before cooking, as we need to move/erase according to the raw prompt */ cook_prompt_if_necessary(); DPRINTF2(DEBUG_READLINE,"After cooking, raw_prompt=%s, cooked=%s", mangle_string_for_debug_log(saved_rl_state.raw_prompt, MANGLE_LENGTH), mangle_string_for_debug_log(saved_rl_state.cooked_prompt, MANGLE_LENGTH)); my_putstr(saved_rl_state.cooked_prompt); rlwrap_already_prompted = TRUE; } prompt_is_still_uncooked = FALSE; } else { myerror("unexpected select() timeout"); } } else if (nfds > 0) { /* Hah! something to read or write */ /* -------------------------- read pty --------------------------------- */ if (FD_ISSET(master_pty_fd, &readfds)) { /* there is something to read on master pty: */ if ((nread = read(master_pty_fd, buf, BUFFSIZE - 1)) <= 0) { /* read it */ if (command_is_dead || nread == 0) { /* child is dead or has closed its stdout */ if (promptlen > 0) /* commands dying words were not terminated by \n ... */ my_putchar('\n'); /* provide the missing \n */ cleanup_rlwrap_and_exit(EXIT_SUCCESS); } else if (errno == EINTR) /* interrupted by signal ...*/ continue; /* ... don't worry */ else myerror("read error on master pty"); } completely_mirror_slaves_output_settings(); /* some programs (e.g. joe) need this. Gasp!! */ if (skip_rlwrap()) { /* Race condition here! The client may just have finished an emacs session and returned to cooked mode, while its ncurses-riddled output is stil waiting for us to be processed. */ write_patiently(STDOUT_FILENO, buf, nread, "to stdout"); DPRINTF2(DEBUG_TERMIO, "read from pty and wrote to stdout %d bytes in direct mode <%s>", nread, mangle_string_for_debug_log((buf[nread]='\0', buf), MANGLE_LENGTH)); yield(); continue; } DPRINTF2(DEBUG_TERMIO, "read %d bytes from pty into buffer: %s", nread, mangle_string_for_debug_log((buf[nread]='\0', buf), MANGLE_LENGTH)); remove_padding_and_terminate(buf, nread); write_logfile(buf); if (within_line_edit) /* client output arrives while we're editing keyboard input: */ save_rl_state(); /* temporarily disable readline and restore the screen state before readline was called */ assert(saved_rl_state.raw_prompt != NULL); /* We *always* compute the printable part and the new raw prompt, and *always* print the printable part There are four possibilities: 1. impatient before cooking. The raw prompt has been printed, write the new output after it 2. patient before cooking No raw prompt has been printed yet, don't print anything 3. impatient after cooking 3a no current prompt print the new output 3b some current prompt erase it, replace by current raw prompt and print new output 4. patient after cooking don't print anything */ /* sometimes we want to leave the prompt standing, e.g. after accepting a line, or when a signal arrived */ leave_prompt_alone = *saved_rl_state.raw_prompt == '\0' /* saved_rl_state.raw_prompt = "" in two distinct cases: when there is actually no prompt, or just after accepting a line, when the cursor is at the end of the prompt. In both cases, we dont't want to move the cursor */ || prompt_is_still_uncooked /* in this case no prompt has been displayed yet */ || command_is_dead || (we_just_got_a_signal_or_EOF && strrchr(buf, '\n')); /* a signal followed by output with a newline in it: treat it as response to user input, so leave the prompt alone */ DPRINTF3(DEBUG_READLINE, "leave_prompt_alone: %s (raw prompt: %s, prompt_is_still_uncooked: %d)", (leave_prompt_alone? "yes" : "no"), mangle_string_for_debug_log(saved_rl_state.raw_prompt, MANGLE_LENGTH), prompt_is_still_uncooked); if (!leave_prompt_alone) /* && (!impatient_prompt || !saved_rl_state.cooked_prompt)) */ move_cursor_to_start_of_prompt(ERASE); else if (we_just_got_a_signal_or_EOF) { free (saved_rl_state.raw_prompt); saved_rl_state.raw_prompt = mysavestring(""); /* prevent reprinting the prompt */ } if (impatient_prompt && !leave_prompt_alone) old_raw_prompt = mysavestring(saved_rl_state.raw_prompt); new_output_minus_prompt = process_new_output(buf, &saved_rl_state); /* chop off the part after the last newline and put this in saved_rl_state.raw_prompt (or append buf if no newline found)*/ if (impatient_prompt) { /* in impatient mode, ALL command output is passed through the OUTPUT filter, including the prompt The prompt, however, is filtered separately at cooking time and then displayed */ char *filtered = pass_through_filter(TAG_OUTPUT, buf); if(!leave_prompt_alone) { my_putstr(old_raw_prompt); free(old_raw_prompt); } my_putstr(filtered); free (filtered); rlwrap_already_prompted = TRUE; } else { my_putstr(new_output_minus_prompt); rlwrap_already_prompted = FALSE; } free(new_output_minus_prompt); prompt_is_still_uncooked = TRUE; if (within_line_edit) restore_rl_state(); yield(); /* wait for what client has to say .... */ continue; /* ... and don't attempt to process keyboard input as long as it is talking , in order to avoid re-printing the current prompt (i.e. unfinished output line) */ } /* ----------------------------- key pressed: read stdin -------------------------*/ if (FD_ISSET(STDIN_FILENO, &readfds)) { /* key pressed */ unsigned char byte_read; /* the readline function names and documentation talk about "characters" and "keys", but we're reading bytes (i.e. unsigned chars) here, and those may very well be part of a multi-byte character. Example: hebrew "aleph" in utf-8 is 0xd790; pressing this key will make us read 2 bytes 0x90 and then 0xd7, (or maybe the other way round depending on endianness??) The readline library hides all this complexity and allows one to just "pass the bytes around" */ nread = read(STDIN_FILENO, &byte_read, 1); /* read next byte of input */ assert(sizeof(unsigned char) == 1); /* gets optimised away */ if (nread <= 0) DPRINTF1(DEBUG_TERMIO, "read from stdin returned %d", nread); if (nread < 0) if (errno == EINTR) continue; else myerror("Unexpected error"); else if (nread == 0) /* EOF on stdin */ cleanup_rlwrap_and_exit(EXIT_SUCCESS); else if (ignore_queued_input) continue; /* do nothing with it*/ assert(nread == 1); DPRINTF2(DEBUG_TERMIO, "read from stdin: byte 0x%02x (%s)", byte_read, mangle_char_for_debug_log(byte_read, TRUE)); if (skip_rlwrap()) { /* direct mode, just pass it on */ /* remote possibility of a race condition here: when the first half of a multi-byte char is read in direct mode and the second half in readline mode. Oh well... */ DPRINTF0(DEBUG_TERMIO, "passing it on (in transparent mode)"); completely_mirror_slaves_terminal_settings(); /* this is of course 1 keypress too late: we should mirror the terminal settings *before* the user presses a key. (maybe using rl_event_hook??) @@@FIXME @@@ HOW?*/ write_patiently(master_pty_fd, &byte_read, 1, "to master pty"); } else { /* hand it over to readline */ if (!within_line_edit) { /* start a new line edit */ DPRINTF0(DEBUG_READLINE, "Starting line edit"); within_line_edit = TRUE; restore_rl_state(); } if (term_eof && byte_read == term_eof && strlen(rl_line_buffer) == 0) { /* hand a term_eof (usually CTRL-D) directly to command */ char *sent_EOF = mysavestring("?"); *sent_EOF = term_eof; put_in_output_queue(sent_EOF); we_just_got_a_signal_or_EOF = TRUE; free(sent_EOF); } else { rl_stuff_char(byte_read); /* stuff it back in readline's input queue */ DPRINTF0(DEBUG_TERMIO, "passing it to readline"); DPRINTF2(DEBUG_READLINE, "rl_callback_read_char() (_rl_eof_char=%d, term_eof=%d)", _rl_eof_char, term_eof); rl_callback_read_char(); } } } /* -------------------------- write pty --------------------------------- */ if (FD_ISSET(master_pty_fd, &writefds)) { flush_output_queue(); yield(); /* give slave command time to respond. If we don't do this, nothing bad will happen, but the "dialogue" on screen will be out of order */ } } /* if (ndfs > 0) */ } /* while (1) */ } /* void main_loop() */
void ap_handle_hotkey(u8 key) { u8 res; switch (key) { #if ECHO_ENABLE case MSG_REV_SW: echo_sw(); break; case MSG_REV_STRONG_UP: case MSG_REV_STRONG_DOWN: if(echo_strong(key)) { disp_port(MENU_REV_STRONG); } break; case MSG_REV_DEEP_UP: case MSG_REV_DEEP_DOWN: if(echo_deep(key)) { disp_port(MENU_REV_DEEP); } break; #endif case MSG_ALM_SETUP: //clr_alarm_func(); break; case MSG_SNOOZE_SETUP: set_snooze_func(); break; case MSG_MUTE_UNMUTE: sys_mute_flag =~sys_mute_flag; if(sys_mute_flag){ amp_mute(1); PT2313_Config(0,VOL_ADJ); } else{ PT2313_Config(sys_main_vol,VOL_ADJ); amp_mute(0); } break; case MSG_SLEEP_SETUP: if(work_mode != RTC_MODE){ timer_pwr_setting(); } break; case MSG_SYS_POWERON: if(work_mode==RTC_MODE){ work_mode= MUSIC_MODE; } else{ work_mode= RTC_MODE; } timer_pwr_idx=0; put_msg_lifo(MSG_CHANGE_WORK_MODE); break; case MSG_USB_DISK_OUT: case MSG_SDMMC_OUT: set_brightness_all_on(); if( (!device_check() ) && (encode_status >= RECODE_INIT )) //在录音时,活动设备拔出 { rec_device_out = 1; api_stop_encode(); if(AUX_MODE == work_mode) { main_menu = MENU_AUX; disp_port(MENU_AUX); } #if FM_MODULE else if(FM_RADIO_MODE == work_mode) { main_menu = MENU_FM_MAIN; disp_port(MENU_FM_MAIN); } #endif else { put_msg_lifo(MSG_MUSIC_NEW_DEVICE_IN); //break; } } /* if((!device_check()) && (REC_MIC_MODE == work_mode)) { put_msg_lifo(MSG_MUSIC_NEW_DEVICE_IN); break; } */ if(MUSIC_MODE != work_mode) break; put_msg_lifo(MSG_DEVICE_REMOVED); disk_remove_deal_for_music(); break; #if USB_DEVICE_ENABLE case MSG_USB_PC_IN: #if ECHO_ENABLE if(BUSY == echo_ptr->status) { close_echo(); } #endif break_encode(); set_brightness_all_on(); device_check(); work_mode = USB_DEVICE_MODE; put_msg_lifo(MSG_CHANGE_WORK_MODE); break; case MSG_USB_PC_OUT: set_brightness_all_on(); break; #endif case MSG_AUX_IN : break_encode(); set_brightness_all_on(); #if USB_DEVICE_ENABLE if ((AUX_MODE != work_mode) && (work_mode != USB_DEVICE_MODE)) #else if (AUX_MODE != work_mode) #endif { work_mode = AUX_MODE; put_msg_lifo(MSG_CHANGE_WORK_MODE); } break; case MSG_AUX_OUT : set_brightness_all_on(); if(work_mode != AUX_MODE)break; if((RECODE_WORKING == encode_status)||(RECODE_PAUSE == encode_status)) { break; } break_encode(); given_device = DEVICE_UDISK; given_file_method = PLAY_BREAK_POINT; put_msg_lifo(MSG_MUSIC_NEW_DEVICE_IN); break; case MSG_SDMMC_IN : set_brightness_all_on(); device_check(); if((RECODE_WORKING == encode_status)||(RECODE_PAUSE == encode_status)) { break; } break_encode(); #if USB_DEVICE_ENABLE if (work_mode == USB_DEVICE_MODE) break; #endif given_device = read_info(MEM_ACTIVE_DEV); if(given_device == DEVICE_SDMMC0_REC) given_device = DEVICE_SDMMC0_REC; else given_device = DEVICE_SDMMC0; given_file_method = PLAY_BREAK_POINT; put_msg_lifo(MSG_MUSIC_NEW_DEVICE_IN); break; case MSG_USB_DISK_IN : set_brightness_all_on(); device_check(); if((RECODE_WORKING == encode_status)||(RECODE_PAUSE == encode_status)) { break; } break_encode(); given_device = read_info(MEM_ACTIVE_DEV); if(given_device == DEVICE_UDISK_REC) given_device = DEVICE_UDISK_REC; else given_device = DEVICE_UDISK; given_file_method = PLAY_BREAK_POINT; put_msg_lifo(MSG_MUSIC_NEW_DEVICE_IN); break; case MSG_NEXT_WORKMODE: break_encode(); if(work_mode == MUSIC_MODE){ device_check(); if(((device_active &(~VIRTUAL_DEVICE))== DEVICE_UDISK)&&(device_online&DEVICE_SDMMC0)>0){ given_device = DEVICE_SDMMC0; given_file_method = PLAY_BREAK_POINT; put_msg_lifo(MSG_MUSIC_NEW_DEVICE_IN); break; } } work_mode++; if(work_mode > MAX_WORK_MODE){ work_mode = MUSIC_MODE; if(get_device_online_status()&DEVICE_UDISK){ given_device = DEVICE_UDISK; given_file_method = PLAY_BREAK_POINT; put_msg_lifo(MSG_MUSIC_NEW_DEVICE_IN); } else if(get_device_online_status()&DEVICE_SDMMC0){ given_device = DEVICE_SDMMC0; given_file_method = PLAY_BREAK_POINT; put_msg_lifo(MSG_MUSIC_NEW_DEVICE_IN); } else{ work_mode++; } } put_msg_lifo(MSG_CHANGE_WORK_MODE); break; case MSG_VOL_UP: if (vol_change_en==0) break; sys_main_vol++; sys_main_vol++; case MSG_VOL_DOWN: if (vol_change_en==0) break; if(sys_main_vol>0) sys_main_vol--; if(sys_main_vol>MAX_MAIN_VOL){ sys_main_vol =MAX_MAIN_VOL; } sys_mute_flag =0; PT2313_Config(sys_main_vol,VOL_ADJ); if(sys_main_vol==0){ amp_mute(1); } else{ amp_mute(0); } dac_mute_control(0,1); //调节音量时,自动UNMUTE write_info(MEM_VOL, sys_main_vol); disp_port(MENU_MAIN_VOL); break; case MSG_MUSIC_NEXT_EQ: if(work_mode == RTC_MODE) break; eq_mode++; if (eq_mode > CLASSIC) { eq_mode = NORMAL; } PT2313_Config(eq_mode,EQ_ADJ); set_eq(NORMAL); disp_port(MENU_SET_EQ); break; case MSG_100: if (!input_number_en) break; if (input_number > 999) input_number = 0; key_100_flag = 0xFF; #ifdef USE_10_PLUS_FUNC input_number = input_number+10; #else input_number = input_number+100; #endif disp_port(MENU_INPUT_NUMBER); break; case MSG_0: case MSG_1: case MSG_2: case MSG_3: case MSG_4: case MSG_5: case MSG_6: case MSG_7: case MSG_8: case MSG_9: if (!input_number_en) break; if(key_100_flag ==0xFF){ input_number += key; key_100_flag = 0xFE; } else if(key_100_flag ==0xFE){ input_number += (input_number%10)*10-(input_number%10)+key; key_100_flag = 0x00; } else { if((input_number)>6553){ input_number = 0x0000; } input_number = input_number * 10 + key; key_100_flag = 0x00; } #if 1 if (input_number > 9999) { input_number = 0; input_number = input_number *10 + key; } #endif disp_port(MENU_INPUT_NUMBER); break; ////////////////录音 case MSG_REC_KEY_AT_USB: if(RTC_MODE == work_mode){ break; } if(RECODE_PLAY >= encode_status) { rec_device_sel=DEVICE_UDISK; api_stop_encode(); put_msg_lifo(MSG_REC_FIND); } else { put_msg_lifo(MSG_REC_STOP); } break; case MSG_REC_KEY_AT_SD: if(RTC_MODE == work_mode){ break; } if(RECODE_PLAY >= encode_status) { rec_device_sel=DEVICE_SDMMC0; api_stop_encode(); put_msg_lifo(MSG_REC_FIND); } else { put_msg_lifo(MSG_REC_STOP); } break; #if 0 case MSG_REC_KEY: //录音开始和结束 if(RECODE_PLAY >= encode_status) { put_msg_lifo(MSG_REC_FIND); } else { put_msg_lifo(MSG_REC_STOP); } break; #endif case MSG_REC_PP: //录音暂停和继续录音 if(RECODE_WORKING == encode_status) { put_msg_lifo(MSG_REC_PAUSE); } else if(RECODE_PAUSE == encode_status) { put_msg_lifo(MSG_REC_CONTINUE); } break; case MSG_ENCODE_END: //设备写err 或 设备满 // deg_str("MSG_ENCODE_END \n"); if(rec_device_out) //录音时活动设备拔出,在设备拔出那里处理,在此不做处理 { rec_device_out =0; break; } api_stop_encode(); //停止录音 put_msg_lifo(MSG_REC_PLAY); break; case MSG_ENCODE_FAT_FULL: //建文件时 // deg_str("MSG_ENCODE_FAT_FULL \n"); api_stop_encode(); //停止录音 if(REC_MIC_MODE == work_mode) //录音时写设备出现问题、设备满 { put_msg_lifo(MSG_MUSIC_NEW_DEVICE_IN); break; } // break_encode(); if(AUX_MODE == work_mode) { main_menu = MENU_AUX; } #if FM_MODULE else if(FM_RADIO_MODE == work_mode) { main_menu = MENU_FM_MAIN; } #endif disp_port(main_menu); break; ////////////////录音涉及的各种状态 case MSG_REC_FIND: // if(RECODE_PLAY >= encode_status) // { // break; // } #if USB_DEVICE_ENABLE if(USB_DEVICE_MODE == work_mode) { break; } #endif encode_status = RECODE_INIT; if(REC_MIC_MODE != work_mode) { work_mode = REC_MIC_MODE; put_msg_lifo(MSG_CHANGE_WORK_MODE); given_device = rec_device_sel;//read_info(MEM_ACTIVE_DEV); break; } #if 0 else //if((MUSIC_MODE != work_mode)) { if (given_device == NO_DEVICE) { given_device = read_info(MEM_ACTIVE_DEV); } } if( (( given_device & (~VIRTUAL_DEVICE )) != DEVICE_SDMMC0) && ((given_device & (~VIRTUAL_DEVICE)) != DEVICE_UDISK) ) { given_device = DEVICE_SDMMC0; } #endif given_device = rec_device_sel;//read_info(MEM_ACTIVE_DEV); sys_clk_div(2);//SYSTEM_CLK_DIV2(); put_msg_lifo(MSG_MUSIC_SELECT_NEW_DEVICE); break; case MSG_REC_START: //开始录音 rec_device_out = 0; #if 0 rec_sys_set(0); //0:24M 1:48M sys_clk_div(2);//SYSTEM_CLK_DIV2(); //24 M #else rec_sys_set(1); sys_clk_div(1);//SYSTEM_CLK_DIV1(); //48 M #endif //init_rec_name(); device_active |= VIRTUAL_DEVICE; encode_device = device_active; //设置录音存储设备 write_file_info(0); set_rec_channel(encode_channel); //设置录音通道 set_rec_vol(encode_vol); //设置录音音量 if(REC_MIC_MODE == work_mode) { kala_dac_off(); // dac_mute_control(1,1); #if KALAOK_FUNCTION dsp_set_adc_con(0); P3HD &=~(1<<6); #endif } if(REC_MIC == encode_channel) { set_rec_track(TRACK_LEFT); } else { set_rec_track(TRACK_ALL); } /**/ CLKGAT |= MP3CLK;// | SPIURCLK; // CLKCON0 |= DACCLK; // P3HD &=~(1<<6); if(DEVICE_SDMMC0 == (device_active & (~VIRTUAL_DEVICE))) { CLKGAT |= USBCLK; } else if(DEVICE_UDISK == (device_active & (~VIRTUAL_DEVICE))) { CLKGAT |= SDCLK; } #if ECHO_ENABLE if(BUSY == echo_ptr->status) { close_echo(); } #endif ///0x //my_memset(0x4000,0,0x787f-0x4000); //my_memset(0x8000,0,0x9c3f-0x8000); //混响强度 0x400c 取值范围 0-255 //混响深度 0x4015 0x4014 取值范围 0-2048 #if ECHO_ENABLE if(1 != start_encode_echo(IS_MP3)) //开始录音 #else if(1 != start_encode(IS_MP3)) //开始录音 #endif { put_msg_lifo(MSG_ENCODE_FAT_FULL); break; } #if ECHO_ENABLE ///<减弱冲击声,打开混响深度和强度 delay_10ms(20); if( REC_MIC == ( encode_channel & 0xf ) ) ///<MIC 下有混响 { set_echo(app_echo.strong, app_echo.deep); } // app_echo.strong = REC_ECHO_STRONG; echo_vol_set(REC_MIC_VOL); #endif /* if(REC_MIC_MODE == work_mode) { while(!((cmd_ctl_rec(REC_NO_OPT,0)) & FRIST_ADC_PACKET)) //采数据前的处理 { } delay_10ms(50);//抛弃半秒的数据 } cmd_ctl_rec(ENABLE_REC_DATA,ENABLE_REC_BIT); */ encode_status = RECODE_WORKING; #if 0//FM_MODULE if(FM_RADIO_MODE != work_mode) #endif { main_menu = MENU_RECWORKING;// } disp_port(main_menu); //disp_port(MENU_REC); break; case MSG_REC_STOP: //停止录音 api_stop_encode(); //停止录音 put_msg_lifo(MSG_REC_PLAY); break; case MSG_REC_PAUSE: //暂停录音 encode_status = RECODE_PAUSE; #if 0//FM_MODULE if(FM_RADIO_MODE == work_mode) disp_port(MENU_FM_MAIN); else #endif { main_menu = MENU_REC_PAUSE; disp_port(MENU_REC_PAUSE); } pause_encode(); break; case MSG_REC_CONTINUE: //暂停录音之后继续录音 encode_status = RECODE_WORKING; #if FM_MODULE if(FM_RADIO_MODE == work_mode) disp_port(MENU_FM_MAIN); else #endif { main_menu = MENU_RECWORKING;// disp_port(MENU_RECWORKING); } continue_encode(); break; case MSG_REC_PLAY: //播放最后的录音文件 encode_status = RECODE_PLAY; given_device = encode_device & (~VIRTUAL_DEVICE); if( (given_device != DEVICE_SDMMC0) && (given_device != DEVICE_UDISK)) { given_device = DEVICE_SDMMC0; } given_device |= VIRTUAL_DEVICE; if((MUSIC_MODE != work_mode)) { put_msg_lifo(MSG_MUSIC_NEW_DEVICE_IN); } else { put_msg_lifo(MSG_MUSIC_SELECT_NEW_DEVICE); } break; case MSG_MUSIC_SELECT_NEW_DEVICE: //重新选择设备 res = find_device(given_device); if ((res == DEV_INIT_ERR) || (res == NO_DEFINE_DEV)) //指定的设备不在线,或初始化失败 { given_device = DEVICE_AUTO_NEXT; //自动选择下一个设备 put_msg_lifo(MSG_MUSIC_SELECT_NEW_DEVICE); break; } else if ((res == NO_EFFECTIVE_DEV) || (res == NO_DEV_ONLINE)) //无可播放的设备 { if(RECODE_STOP != encode_status) { encode_status = RECODE_STOP; if(REC_MIC_MODE == work_mode) { put_msg_lifo(MSG_NEXT_WORKMODE); } break; } else { put_msg_lifo(MSG_NEXT_WORKMODE); } break; } else { if(RECODE_PLAY < encode_status) { put_msg_lifo(MSG_REC_START); } else { if(RECODE_PLAY == encode_status) //去播刚录好的文件 { encode_status = RECODE_STOP; #if VIRTUAL_ENABLE given_file_number = encode_filenum; #else given_file_number = encode_filenum + encode_fristfile - 1; #endif put_msg_lifo(MSG_MUSIC_PLAY_NEW_FILE); } else { put_msg_lifo(MSG_MUSIC_SELECT_NEW_FILE); //找到可用设备 } } } break; } }
UltrasonicSensor::UltrasonicSensor(int echo_pin,int trigger_pin) { set_echo(echo_pin); set_trigger(trigger_pin); }