78 lines
2.5 KiB
Python
78 lines
2.5 KiB
Python
"""Test database functions for storing configuration data."""
|
|
|
|
import sqlite3
|
|
|
|
SQLITE_DB = "cal_data.db"
|
|
SQLITE_CONN = sqlite3.connect(SQLITE_DB)
|
|
|
|
|
|
def setup_calibration_table(drop_first=False):
|
|
"""Setup the calibration table."""
|
|
cursor = SQLITE_CONN.cursor()
|
|
if drop_first:
|
|
cursor.execute("DROP TABLE IF EXISTS cal_data")
|
|
|
|
create_query = ("CREATE TABLE IF NOT EXISTS cal_data ("
|
|
"id integer PRIMARY KEY, "
|
|
"height float, "
|
|
"volume float)")
|
|
cursor.execute(create_query)
|
|
|
|
|
|
def insert_calibration_data(height, volume):
|
|
"""Insert an entry into the calibration table."""
|
|
cursor = SQLITE_CONN.cursor()
|
|
insert_query = "INSERT INTO cal_data (height, volume) VALUES (?, ?)"
|
|
cursor.execute(insert_query, [height, volume])
|
|
return cursor.lastrowid
|
|
|
|
|
|
def delete_calibration_data(id):
|
|
"""Delete an entry from the calibration table."""
|
|
cursor = SQLITE_CONN.cursor()
|
|
delete_query = "DELETE FROM cal_data WHERE id = ?"
|
|
cursor.execute(delete_query, [id])
|
|
return cursor.rowcount
|
|
|
|
|
|
def get_calibration_data(single_entry=False):
|
|
"""Retrieve either a single entry or all calibration data."""
|
|
single_entry = int(single_entry)
|
|
cursor = SQLITE_CONN.cursor()
|
|
get_single_query = "SELECT * FROM cal_data WHERE id = ?"
|
|
get_all_query = "SELECT * FROM cal_data ORDER BY height ASC"
|
|
|
|
if(single_entry > 0):
|
|
cursor.execute(get_single_query, [single_entry])
|
|
return cursor.fetchone()
|
|
|
|
else:
|
|
return [list(row) for row in cursor.execute(get_all_query)]
|
|
|
|
|
|
def get_volume_for_height(height):
|
|
"""Interpret a volume for a given height."""
|
|
calibration_data = get_calibration_data()
|
|
cal_min_height = calibration_data[0][1]
|
|
cal_max_height = calibration_data[-1][1]
|
|
|
|
lower_cal = [0.0, 0.0]
|
|
upper_cal = [0.0, 0.0]
|
|
|
|
if (height <= cal_max_height and height >= cal_min_height):
|
|
for i in range(0, len(calibration_data) - 1):
|
|
if (height >= calibration_data[i][1] and height <= calibration_data[i+1][1]):
|
|
lower_cal = calibration_data[i][1:3]
|
|
upper_cal = calibration_data[i+1][1:3]
|
|
elif height > cal_max_height:
|
|
lower_cal = calibration_data[-2][1:3]
|
|
upper_cal = calibration_data[-1][1:3]
|
|
elif height < cal_min_height:
|
|
lower_cal = calibration_data[0][1:3]
|
|
upper_cal = calibration_data[1][1:3]
|
|
|
|
line_m = (upper_cal[1] - lower_cal[1]) / (upper_cal[0] - lower_cal[0])
|
|
line_b = upper_cal[1] - line_m * upper_cal[0]
|
|
|
|
return line_m * height + line_b
|