#!/usr/bin/env python3
'Simple benchmark for pifaceio against pifacedigitalio.'
# Author: Mark Blakeney, Nov 2020.

import time
import pifaceio
import pifacedigitalio

COUNT = 1000

def report(test, val1, val2):
    'Output test results comparison'
    ps1 = round(COUNT / val1, 1)
    ps2 = round(COUNT / val2, 1)
    mult = round(ps1 / ps2, 1)

    print()
    print(f'pifacedigitalio did {ps2} {test} per second.')
    print(f'pifaceio did {ps1} {test} per second.')
    print(f'pifaceio {test} is {mult} times faster.')

# Execute pifaceio tests ..
pf = pifaceio.PiFace()

start = time.monotonic()
for c in range(COUNT):
    pf.read()

read1 = time.monotonic() - start

start = time.monotonic()
for c in range(COUNT):
    if c % 2:
        pf.write(0x80)
    else:
        pf.write(0)

write1 = time.monotonic() - start

pf.close()
pifaceio.init()

start = time.monotonic()
for c in range(COUNT):
    pifaceio.digital_read(0)

readc1 = time.monotonic() - start

start = time.monotonic()
for c in range(COUNT):
    if c % 2:
        pifaceio.digital_write(7, 1)
    else:
        pifaceio.digital_write(7, 0)

writec1 = time.monotonic() - start

pifaceio.deinit()

# Execute pifacedigitalio tests ..
pf = pifacedigitalio.PiFaceDigital()

start = time.monotonic()
for c in range(COUNT):
    pf.input_port.value

read2 = time.monotonic() - start

start = time.monotonic()
for c in range(COUNT):
    if c % 2:
        pf.leds[7].turn_on()
    else:
        pf.leds[7].turn_off()

write2 = time.monotonic() - start

pf.deinit_board()
pifacedigitalio.init()

start = time.monotonic()
for c in range(COUNT):
    pifacedigitalio.digital_read(0)

readc2 = time.monotonic() - start

start = time.monotonic()
for c in range(COUNT):
    if c % 2:
        pifacedigitalio.digital_write(7, 1)
    else:
        pifacedigitalio.digital_write(7, 0)

writec2 = time.monotonic() - start

pifacedigitalio.deinit()

report('input reads', read1, read2)
report('output writes', write1, write2)
report('classic API input reads', readc1, readc2)
report('classic API output reads', writec1, writec2)
