| /* |
| * This file is part of the sigrok-cli project. |
| * |
| * Copyright (C) 2011 Bert Vermeulen <bert@biot.com> |
| * |
| * This program is free software: you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation, either version 3 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| |
| #include "sigrok-cli.h" |
| #include <stdio.h> |
| #ifdef _WIN32 |
| #include <windows.h> |
| #else |
| #include <termios.h> |
| #endif |
| #include <unistd.h> |
| #include <string.h> |
| #include <glib.h> |
| |
| #ifdef _WIN32 |
| static HANDLE stdin_handle; |
| static DWORD stdin_mode; |
| #else |
| static struct termios term_orig; |
| #endif |
| |
| static int received_anykey(int fd, int revents, void *cb_data) |
| { |
| struct sr_session *session; |
| (void)fd; |
| (void)revents; |
| |
| session = cb_data; |
| sr_session_source_remove(session, STDIN_FILENO); |
| sr_session_stop(session); |
| |
| return TRUE; |
| } |
| |
| /* Turn off buffering on stdin. */ |
| void add_anykey(struct sr_session *session) |
| { |
| #ifdef _WIN32 |
| stdin_handle = GetStdHandle(STD_INPUT_HANDLE); |
| |
| if (!GetConsoleMode(stdin_handle, &stdin_mode)) { |
| /* TODO: Error handling. */ |
| } |
| |
| SetConsoleMode(stdin_handle, 0); |
| #else |
| struct termios term; |
| |
| tcgetattr(STDIN_FILENO, &term); |
| memcpy(&term_orig, &term, sizeof(struct termios)); |
| term.c_lflag &= ~(ECHO | ICANON | ISIG); |
| tcsetattr(STDIN_FILENO, TCSADRAIN, &term); |
| #endif |
| |
| sr_session_source_add(session, STDIN_FILENO, G_IO_IN, -1, |
| received_anykey, session); |
| |
| g_message("Press any key to stop acquisition."); |
| } |
| |
| /* Restore stdin attributes. */ |
| void clear_anykey(void) |
| { |
| #ifdef _WIN32 |
| SetConsoleMode(stdin_handle, stdin_mode); |
| #else |
| tcflush(STDIN_FILENO, TCIFLUSH); |
| tcsetattr(STDIN_FILENO, TCSANOW, &term_orig); |
| #endif |
| } |