def main():
    global cancel_count

    # Remove old shutdown file
    try:
        os.remove("/home/pi/accelerometer_raspi/source/shutdown")
    except (OSError):
        pass

    myLCD.updateLCD(str2="WELCOME", str3="REXNORD EDGE DEVICE")
    sleep(2)

    myLCD.clearLine(2)
    myLCD.clearLine(3)

    while True:
        select_option()
        cutie.getTime()
        if cancel_count >= 3:
            myLCD.clear_all()
            options = ['EXIT', 'SHUTDOWN']
            selected_option = cutie.select(options, selected_index=0)
            if selected_option == 0:
                myLCD.updateLCD(str2='EXITING PROGRAM', str3='GOODBYE')
                sleep(2)
                exit()
            elif selected_option == 1:
                myLCD.updateLCD(str2='EXITING PROGRAM', str3='GOODBYE')
                sleep(2)
                os.system('sudo shutdown now -h')
def delete_file():
    myLCD.clear_all()

    # find all *.csv files and display select
    home = expanduser('~')
    csv_files = find_all_files('*.csv', home)

    if len(csv_files) == 0:
        myLCD.updateLCD(str2='NO FILES FOUND')

    csv_files_lcd = []
    count = 1
    for file in csv_files:
        strs = file.split('_')
        tmp = str(count) + '. ' + strs[1] + ' ' + strs[2]
        #tmp = tmp[:tmp.rfind(':')]
        csv_files_lcd.append(tmp)
        count += 1

    #transfer selected file to usb
    myLCD.clear_all()
    selected_index = cutie.select(csv_files_lcd, selected_index=0)
    if selected_index == -1:
        return
    selected_csv = csv_files[selected_index]

    print('SELECTED CSV: ' + selected_csv)

    myLCD.updateLCD(str2='SELECTED CSV: ',
                    str3=selected_csv.split('Device')[1][2:],
                    str4='DELETING FILE')

    os.remove(selected_csv)
    sleep(1)

    myLCD.updateLCD(str4='FILE DELETED')
    sleep(1)

    return
Example #3
0
def select(
        options,  # type: List[str]
        caption_indices=None,  # type: Optional[List[int]]
        deselected_prefix='\033[1m[ ]\033[0m ',  # type: str
        selected_prefix='\033[1m[\033[32;1mx\033[0;1m]\033[0m ',  # type: str
        caption_prefix='',  # type: str
        selected_index=0):  # type: int
    #type: (...) -> int
    """Select an option from a list.

    Args:
        options (List[str]): The options to select from.
        caption_indices (List[int], optional): Non-selectable indices.
        deselected_prefix (str, optional): Prefix for deselected option ([ ]).
        selected_prefix (str, optional): Prefix for selected option ([x]).
        caption_prefix (str, optional): Prefix for captions ().
        selected_index (int, optional): The index to be selected at first.

    Returns:
        int: The index that has been selected.
    """

    #lcd = Adafruit_CharLCD()
    #lcd.clear()
    lcd_deselected_prefix = '[ ]'
    lcd_selected_prefix = '[x]'
    myLCD.updateLCD()
    print('\n' * (len(options) - 1))
    if caption_indices is None:
        caption_indices = []
    '''
        Get selected index 
        if there are at least two options above the selected index 
            show only two options above and the one selected
        else 
            print items as before
    '''

    while True:
        getTime()
        print('\033[{}A'.format(len(options) + 1))

        for i, option in enumerate(options):

            if i not in caption_indices:
                print('\033[K{}{}'.format(
                    selected_prefix
                    if i == selected_index else deselected_prefix, option))
                # if the selected index is at least
                if (selected_index > 2 and i <= selected_index
                        and i > selected_index - 3):
                    if (selected_index - i == 2):
                        lineNum = 1
                    elif (selected_index - i == 1):
                        lineNum = 2
                    else:
                        lineNum = 3
                    myLCD.printLine(
                        lineNum, '{}{}\n'.format(
                            lcd_selected_prefix if i == selected_index else
                            lcd_deselected_prefix, option))
                elif (i < 3):
                    myLCD.printLine(
                        i + 1, '{}{}\n'.format(
                            lcd_selected_prefix if i == selected_index else
                            lcd_deselected_prefix, option))
            elif i in caption_indices:
                #print('\033[K{}{}'.format(caption_prefix, options[i]))
                myLCD.printLine(i + 1, '{}{}'.format(caption_prefix,
                                                     options[i]))

        #keypress = readchar.readkey()
        #keypress = None

        button_pressed = None

        while button_pressed is None:
            getTime()
            button_pressed = wait_for_button()

        #if keypress == readchar.key.UP or button_up_pressed:
        if button_pressed == 'up':
            new_index = selected_index
            while new_index > 0:
                new_index -= 1
                if new_index not in caption_indices:
                    selected_index = new_index
                    break

        #elif keypress == readchar.key.DOWN or button_down_pressed:
        elif button_pressed == 'down':
            new_index = selected_index
            while new_index < len(options) - 1:
                new_index += 1
                if new_index not in caption_indices:
                    selected_index = new_index
                    break

        elif button_pressed == 'red':
            return -1

        else:
            break
    return selected_index
def set_time():

    myLCD.clear_all()

    myLCD.updateLCD(str2='SET TIME')
    year = cutie.get_number_arrows('YEAR', 1, 2050, 2018)
    if year == -1:
        return

    myLCD.updateLCD(str2='SET TIME')
    month = cutie.get_number_arrows('MONTH', 1, 13, 1)
    if year == -1:
        return

    invalidDay = True
    day = 0
    while invalidDay:
        myLCD.updateLCD(str2='SET TIME')
        day = cutie.get_number_arrows('DAY', 1, 32, 1)

        if day == -1:
            return

        if day == 31 and (month in [2, 4, 6, 9, 11]):
            invalidDay = True
            myLCD.updateLCD(str2='INVALID DAY')

        elif day == 30 and (month in [2]):
            myLCD.updateLCD(str2='INVALID DAY')
            invalidDay = True
        else:
            invalidDay = False

    myLCD.updateLCD(str2='SET TIME')
    hour = cutie.get_number_arrows('HOUR', 1, 13, 1)
    if hour == -1:
        return

    myLCD.updateLCD(str2='SET TIME')
    minute = cutie.get_number_arrows('MINUTE', 1, 60, 1)
    if hour == -1:
        return

    time_tuple = (
        year,
        month,
        day,
        hour,
        minute,
    )

    _set_time_helper(time_tuple)

    myLCD.clear_all()
def transfer_usb():

    myLCD.clear_all()

    #find usb and confirm hash
    usb = get_usb_devices()

    while len(usb) == 0:
        myLCD.printLine(1, 'NO USB CONNECTED')
        print('NO USB CONNECTED')
        sleep(1)
        options = ['RETRY USB CONNECTION']
        selected_option = cutie.select(options, selected_index=0)
        if selected_option == -1:
            return  # back to main menu
        usb = get_usb_devices()

    # mount usb device if necessary
    usb_mount_pt = get_mount_points()
    if len(usb_mount_pt) == 0:
        # mount should iterate through all file system types in /proc/filesystems but fails itermittently
        bash_mount_cmd = 'sudo mount /dev/{}1 /media/usb/'.format(
            usb.keys()[0])
        print(bash_mount_cmd)
        subprocess.check_output(bash_mount_cmd.split())

    sleep(1)
    hashfile = find_file('hash.key', '/media/usb/')

    if hashfile is None:
        print('INVALID USB')
        myLCD.printLine(1, 'INVALID USB')
        sleep(1)
        return  # back to main menu

    # find all *.csv files and display select
    home = expanduser('~')
    csv_files = find_all_files('*.csv', home)

    csv_files_lcd = []
    count = 1
    for file in csv_files:
        strs = file.split('_')
        tmp = str(count) + '. ' + strs[1] + ' ' + strs[2]
        #tmp = tmp[:tmp.rfind(':')]
        csv_files_lcd.append(tmp)
        count += 1

    #transfer selected file to usb
    myLCD.clear_all()
    selected_index = cutie.select(csv_files_lcd, selected_index=0)
    if selected_index == -1:
        return
    selected_csv = csv_files[selected_index]

    print('SELECTED CSV: ' + selected_csv)

    myLCD.updateLCD(str2='SELECTED CSV: ' + selected_csv,
                    str3='COPYING FILE',
                    str4='DO NOT UNPLUG USB')
    #shutil.copy(selected_csv, '/media/usb'+selected_csv)

    # hacky workaround using bash executed in python
    cmd = 'sudo chmod 777 /media/usb/'
    subprocess.check_output(cmd.split())

    selected_csv_file = selected_csv.split('/')[-1]
    selected_csv_file = selected_csv_file.replace(' ', '')
    indexColon = selected_csv_file.find(':')
    selected_csv_file = selected_csv_file[:
                                          indexColon] + 'h' + selected_csv_file[
                                              indexColon + 1]
    indexColon = selected_csv_file.find(':')
    selected_csv_file = selected_csv_file[:
                                          indexColon] + 'm' + selected_csv_file[
                                              indexColon + 1]
    indexSecAbrv = selected_csv_file.find('.csv')
    selected_csv_file = selected_csv_file[:
                                          indexSecAbrv] + 's' + selected_csv_file[
                                              indexSecAbrv:]

    cmd = 'sudo touch /media/usb/{}'.format(selected_csv_file)
    #subprocess.check_output(cmd.split())

    cmd = 'sudo cp {} /media/usb/{}'.format(selected_csv, selected_csv_file)
    cmd = cmd.split()
    cmd = cmd[:2] + [cmd[2] + ' ' + cmd[3]] + cmd[4:]
    subprocess.check_output(cmd)

    sleep(1)

    #done
    myLCD.updateLCD(str2='TRANSFER COMPLETE')
    print('DONE')
    sleep(1)
    return
Example #6
0
def record_data():
    # lcd = Adafruit_CharLCD()
    # lcd.clear()

    hours = 0
    minutes = 0

    myLCD.clear_all()
    myLCD.printLine(1, 'ENTER DURATION:')
    hours = cutie.get_number_arrows('HOURS', 1, 13, 0)
    if hours == -1:
        return
    minutes = cutie.get_number_arrows('MIN', 1, 60, 0)
    if minutes == -1:
        return

    if minutes + hours == 0:
        #lcd.clear()
        #lcd.message('NO TIME ENTERED')
        myLCD.updateLCD(str2='NO TIME ENTERED')
        print('NO TIME ENTERED')
        sleep(1)
        return

    endTime = time() + (3600 * float(hours)) + (60 * float(minutes))

    # check if sensor is attached via /dev/ttyUSB0
    sensor_connected = os.path.exists('/dev/ttyUSB0')
    while not sensor_connected:
        #lcd.clear()
        #lcd.message('NO SENSOR FOUND')
        myLCD.updateLCD(str2='NO SENSOR FOUND')
        print('NO SENSOR FOUND')
        sleep(1)
        options = ['RETRY SENSOR PAIRING']
        selected_option = cutie.select(options, selected_index=0)
        if selected_option == -1:
            return  # back to main menu
        sensor_connected = os.path.exists('/dev/ttyUSB0')

    myLCD.updateLCD(str2='ENTER TO START')
    button_pressed = None
    while True:
        myLCD.getTime()
        button_pressed = cutie.wait_for_button()
        print(button_pressed)
        if button_pressed == 'red' or button_pressed == 'green':
            break

    if button_pressed == 'red':
        myLCD.updateLCD(str2='CANCELING...')
        sleep(1)
        return

    # calculate the finish time after the user confirms the start
    curTime = time()
    finish = datetime.datetime.fromtimestamp(endTime)

    myLCD.updateLCD(str2='RECORDING...',
                    str3='FINISH: {:02d}:{:02d}'.format(
                        finish.hour, finish.minute))
    print('FINISH: {:02d}:{:02d}\nRECORDING...'.format(finish.hour,
                                                       finish.minute))

    # excute following script: java -jar ~/BannerQM42TestApplication.jar -config 1000RPM-5Hz_1Device.JSON -logfile test.csv -port /dev/ttyUSB0
    os.chdir('/home/pi')
    cmd = 'java -jar BannerQM42TestApplication.jar -config 1000RPM-5Hz_1Device.JSON -logfile {}.csv -port /dev/ttyUSB0'
    cmd = cmd.format(datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S'))
    #subprocess.check_output(cmd.split())

    # see StackO: https://stackoverflow.com/questions/4789837/how-to-terminate-a-python-subprocess-launched-with-shell-true
    pro = subprocess.Popen(cmd.split(),
                           stdout=subprocess.PIPE,
                           preexec_fn=os.setsid)

    while True:
        myLCD.getTime()
        button_pressed = cutie.wait_for_button()
        if (time() >= endTime) or button_pressed == 'red':
            break
        elif button_pressed == 'red':
            myLCD.updateLCD(str2='CANCELING...')
            os.killpg(os.getpgid(pro.pid), signal.SIGTERM)
            os.chdir('/home/pi/accelerometer_raspi/source')
            sleep(1)
            return

    os.killpg(os.getpgid(pro.pid), signal.SIGTERM)

    os.chdir('/home/pi/accelerometer_raspi/source')

    #lcd.message('\nDONE')
    myLCD.updateLCD(str2='DONE')
    sleep(1)
    print('DONE')