Added auto-continue code

* Enabled by default
* Based on static thresholds per pass.
  * Pass 1: 85%
  * Pass 2: 98%
* If using child devices, all must be above the threshold to continue
This commit is contained in:
2Shirt 2018-07-18 18:26:03 -06:00
parent 9d91a28d7a
commit 88c28a3f25
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C

View file

@ -12,6 +12,8 @@ from functions.data import *
from operator import itemgetter
# STATIC VARIABLES
AUTO_NEXT_PASS_1_THRESHOLD = 85
AUTO_NEXT_PASS_2_THRESHOLD = 98
DDRESCUE_SETTINGS = {
'--binary-prefixes': {'Enabled': True, 'Hidden': True},
'--data-preview': {'Enabled': True, 'Hidden': True},
@ -122,7 +124,9 @@ def mark_pass_complete(source):
# This function was called for this device, mark complete
child[current_pass]['Done'] = True
# TODO remove test code
child[current_pass]['Status'] = str(12.5 * current_pass_num * 2.75)
from random import randint
status = randint((current_pass_num-1)*10+85, 110) + randint(0, 99) / 100
child[current_pass]['Status'] = status
if not child[current_pass]['Done']:
pass_complete_for_all_devs = False
@ -132,7 +136,18 @@ def mark_pass_complete(source):
source[current_pass]['Done'] = True
# TODO Remove test code
source[current_pass]['Status'] = str(11.078 * current_pass_num * 3)
if source['Children']:
status = 100
for child in source['Children']:
try:
status = min(status, child[current_pass]['Status'])
except TypeError:
# Force 0% to ensure we won't auto-continue to next pass
status = 0
else:
from random import randint
status = randint((current_pass_num-1)*10+75, 100) + randint(0, 99) / 100
source[current_pass]['Status'] = status
def mark_pass_incomplete(source):
"""Mark current pass incomplete."""
@ -251,7 +266,10 @@ def menu_main(source):
# Build menu
main_options = [
{'Base Name': 'Retry (mark non-rescued sectors "non-tried")', 'Enabled': False},
{'Base Name': 'Auto continue (if recovery % over threshold)',
'Enabled': True},
{'Base Name': 'Retry (mark non-rescued sectors "non-tried")',
'Enabled': False},
{'Base Name': 'Reverse direction', 'Enabled': False},
]
actions =[
@ -264,12 +282,13 @@ def menu_main(source):
# Show menu
while True:
current_pass = source['Current Pass']
display_pass = '1 "Initial Read"'
if source['Current Pass'] == 'Pass 2':
if current_pass == 'Pass 2':
display_pass = '2 "Trimming bad areas"'
elif source['Current Pass'] == 'Pass 3':
elif current_pass == 'Pass 3':
display_pass = '3 "Scraping bad areas"'
elif source['Current Pass'] == 'Done':
elif current_pass == 'Done':
display_pass = 'Done'
# Update entries
for opt in main_options:
@ -302,13 +321,43 @@ def menu_main(source):
if 'Retry' in opt['Base Name'] and opt['Enabled']:
settings.extend(['--retrim', '--try-again'])
mark_all_passes_pending(source)
current_pass = 'Pass 1'
if 'Reverse' in opt['Base Name'] and opt['Enabled']:
settings.append('--reverse')
# Disable for next pass
opt['Enabled'] = False
if 'Auto' not in opt['Base Name']:
opt['Enabled'] = False
# Run pass
run_ddrescue(source, settings)
# Run ddrecue
auto_run = True
while auto_run:
run_ddrescue(source, settings)
auto_run = False
if current_pass == 'Done':
# "Pass Done" i.e. all passes done
break
if not main_options[0]['Enabled']:
# Auto next pass
break
if source[current_pass]['Done']:
try:
recovered = float(source[current_pass]['Status'])
except ValueError:
# Nope
recovered = 'Nope'
pass
else:
if current_pass == 'Pass 1' and recovered > 85:
auto_run = True
elif current_pass == 'Pass 2' and recovered > 98:
auto_run = True
# Update current pass for next iteration
print_info('State:')
print_standard(' Pass #: {}\n Auto: {}\n Recovered: {}'.format(
current_pass, auto_run, recovered))
pause()
current_pass = source['Current Pass']
elif selection == 'C':
menu_settings(source)
elif selection == 'Q':