Skip to content
Snippets Groups Projects
Select Git revision
  • c4489a05433b2878d0598d77bec5d9f6a821ffaa
  • wip-bootstrap default
  • dualcore
  • ch3/leds
  • ch3/time
  • master
6 results

unix_mphal.c

Blame
  • user avatar
    Alex March authored and Damien George committed
    Follow the same format as other ports using the macro to include
    the HAL header.
    c0035d16
    History
    unix_mphal.c 3.55 KiB
    /*
     * This file is part of the Micro Python project, http://micropython.org/
     *
     * The MIT License (MIT)
     *
     * Copyright (c) 2015 Damien P. George
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy
     * of this software and associated documentation files (the "Software"), to deal
     * in the Software without restriction, including without limitation the rights
     * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     * copies of the Software, and to permit persons to whom the Software is
     * furnished to do so, subject to the following conditions:
     *
     * The above copyright notice and this permission notice shall be included in
     * all copies or substantial portions of the Software.
     *
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     * THE SOFTWARE.
     */
    
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "py/mpstate.h"
    #include MICROPY_HAL_H
    
    #ifndef _WIN32
    #include <signal.h>
    
    STATIC void sighandler(int signum) {
        if (signum == SIGINT) {
            if (MP_STATE_VM(mp_pending_exception) == MP_STATE_VM(keyboard_interrupt_obj)) {
                // this is the second time we are called, so die straight away
                exit(1);
            }
            mp_obj_exception_clear_traceback(MP_STATE_VM(keyboard_interrupt_obj));
            MP_STATE_VM(mp_pending_exception) = MP_STATE_VM(keyboard_interrupt_obj);
        }
    }
    #endif
    
    void mp_hal_set_interrupt_char(char c) {
        // configure terminal settings to (not) let ctrl-C through
        if (c == CHAR_CTRL_C) {
            #ifndef _WIN32
            // enable signal handler
            struct sigaction sa;
            sa.sa_handler = sighandler;
            sigemptyset(&sa.sa_mask);
            sigaction(SIGINT, &sa, NULL);
            #endif
        } else {
            #ifndef _WIN32
            // disable signal handler
            struct sigaction sa;
            sa.sa_handler = SIG_DFL;
            sigemptyset(&sa.sa_mask);
            sigaction(SIGINT, &sa, NULL);
            #endif
        }
    }
    
    #if MICROPY_USE_READLINE == 1
    
    #include <termios.h>
    
    static struct termios orig_termios;
    
    void mp_hal_stdio_mode_raw(void) {
        // save and set terminal settings
        tcgetattr(0, &orig_termios);
        static struct termios termios;
        termios = orig_termios;
        termios.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
        termios.c_cflag = (termios.c_cflag & ~(CSIZE | PARENB)) | CS8;
        termios.c_lflag = 0;
        termios.c_cc[VMIN] = 1;
        termios.c_cc[VTIME] = 0;
        tcsetattr(0, TCSAFLUSH, &termios);
    }
    
    void mp_hal_stdio_mode_orig(void) {
        // restore terminal settings
        tcsetattr(0, TCSAFLUSH, &orig_termios);
    }
    
    #endif
    
    int mp_hal_stdin_rx_chr(void) {
        unsigned char c;
        int ret = read(0, &c, 1);
        if (ret == 0) {
            c = 4; // EOF, ctrl-D
        } else if (c == '\n') {
            c = '\r';
        }
        return c;
    }
    
    void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
        int ret = write(1, str, len);
        (void)ret; // to suppress compiler warning
    }
    
    // cooked is same as uncooked because they terminal does some postprocessing
    void mp_hal_stdout_tx_strn_cooked(const char *str, mp_uint_t len) {
        mp_hal_stdout_tx_strn(str, len);
    }
    
    void mp_hal_stdout_tx_str(const char *str) {
        mp_hal_stdout_tx_strn(str, strlen(str));
    }