remove django app

This commit is contained in:
Tyrel Souza 2023-10-16 21:45:53 -04:00
parent 0d5507b0f9
commit 43d968bd4c
No known key found for this signature in database
GPG Key ID: F3614B02ACBE438E
27 changed files with 0 additions and 875 deletions

View File

@ -1,16 +0,0 @@
"""
ASGI config for benchtopdevices project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'benchtopdevices.settings')
application = get_asgi_application()

View File

@ -1,134 +0,0 @@
"""
Django settings for benchtopdevices project.
Generated by 'django-admin startproject' using Django 4.2.3.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.2/ref/settings/
"""
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-=$1$b*-dgj6+@&-=yl*xsw@if=t%em(u_-i_^p4+-k0^nsg=--'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'debug_toolbar',
'sheets',
'rest_framework',
]
MIDDLEWARE = [
'debug_toolbar.middleware.DebugToolbarMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'benchtopdevices.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'benchtopdevices.wsgi.application'
# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'America/New_York'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/
STATIC_URL = 'static/'
# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
INTERNAL_IPS = [
# ...
"127.0.0.1",
# ...
]

View File

@ -1,24 +0,0 @@
"""
URL configuration for benchtopdevices project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('', include('sheets.urls')),
path('admin/', admin.site.urls),
path("__debug__/", include("debug_toolbar.urls")),
]

View File

@ -1,16 +0,0 @@
"""
WSGI config for benchtopdevices project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'benchtopdevices.settings')
application = get_wsgi_application()

View File

@ -1,22 +0,0 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'benchtopdevices.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()

View File

@ -1,4 +0,0 @@
django
psycopg2-binary
django-debug-toolbar
django-rest-framework

View File

@ -1,10 +0,0 @@
from django.contrib import admin
from .models import (
Sheet
)
class SheetAdmin(admin.ModelAdmin):
pass
admin.site.register(Sheet, SheetAdmin)

View File

@ -1,6 +0,0 @@
from django.apps import AppConfig
class SheetsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'sheets'

View File

@ -1,67 +0,0 @@
from django import forms
from django.forms.widgets import ClearableFileInput
from django.db import models
from django.utils.translation import gettext_lazy as _
from .models import Sheet
class SheetForm(forms.ModelForm):
class Meta:
model = Sheet
fields = [
"customer_name",
"onsite_cal",
"control_doc",
"technician",
"instrument_model",
"instrument_calibration_date",
"instrument_calibration_due_date",
"serial_number",
"channel",
"transducer_model",
"transducer_span",
"calibration_serial",
"calibration_model",
"calibration_date",
"calibration_due_date",
"calibration_cert_id",
"accuracy",
"barometric_pressure",
"temperature",
"humidity",
"report_type",
"transducer_type",
"as_found",
"as_left",
"both",
]
widgets = {
"accuracy": forms.NumberInput(attrs={'step': 0.01}),
"barometric_pressure": forms.NumberInput(attrs={'step': 0.01, 'max': 1100, 'min': 800}),
"temperature": forms.NumberInput(attrs={'step': 0.01, 'max': 1000.0, 'min': -459.67}),
"humidity": forms.NumberInput(attrs={'step': 0.01, 'max': 100.0, 'min': 0.0}),
"calibration_date": forms.SelectDateWidget(years=range(2020, 2030)),
"calibration_due_date": forms.SelectDateWidget(years=range(2020, 2030)),
"instrument_calibration_date": forms.SelectDateWidget(years=range(2020, 2030)),
"instrument_calibration_due_date": forms.SelectDateWidget(years=range(2020, 2030)),
}
def __init__(self, *args, **kwargs):
super(SheetForm, self).__init__(*args, **kwargs)
for name, field in self.fields.items():
# add v-model to each model field
if isinstance(field, forms.fields.FileField):
field.widget.attrs.update(
{
'v-on:change': f"change_{name}",
'v-if': f"show_{name}"
})
else:
field.widget.attrs.update({'v-model': name})

View File

@ -1,38 +0,0 @@
# Generated by Django 4.2.5 on 2023-09-18 17:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.CreateModel(
name='Sheet',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('customer_name', models.CharField(max_length=256)),
('customer_address', models.CharField(max_length=256)),
('serial_number', models.CharField(max_length=256)),
('accuracy', models.FloatField()),
('barometric_pressure', models.FloatField()),
('temperature', models.FloatField()),
('humidity', models.FloatField()),
('report_type', models.CharField(choices=[('TV', 'Transducer Verify'), ('HC', 'Hardware Calibration')], max_length=256)),
('as_found', models.FileField(blank=True, upload_to='')),
('as_left', models.FileField(blank=True, upload_to='')),
('both', models.FileField(blank=True, upload_to='')),
('calibration_cert_id', models.CharField(default=0, max_length=100)),
('calibration_date', models.DateField(default=0)),
('calibration_due_date', models.DateField(default=0)),
('calibration_model', models.CharField(default=0, max_length=100)),
('calibration_serial', models.CharField(default=0, max_length=100)),
('channel', models.CharField(default=0, max_length=256)),
('instrument_model', models.CharField(default=0, max_length=256)),
('transducer_model', models.CharField(default=0, max_length=256)),
('transducer_span', models.CharField(default=0, max_length=256)),
],
),
]

View File

@ -1,58 +0,0 @@
# Generated by Django 4.2.5 on 2023-09-18 17:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sheets', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='sheet',
name='calibration_cert_id',
field=models.CharField(max_length=100),
),
migrations.AlterField(
model_name='sheet',
name='calibration_date',
field=models.DateField(),
),
migrations.AlterField(
model_name='sheet',
name='calibration_due_date',
field=models.DateField(),
),
migrations.AlterField(
model_name='sheet',
name='calibration_model',
field=models.CharField(max_length=100),
),
migrations.AlterField(
model_name='sheet',
name='calibration_serial',
field=models.CharField(max_length=100),
),
migrations.AlterField(
model_name='sheet',
name='channel',
field=models.CharField(max_length=256),
),
migrations.AlterField(
model_name='sheet',
name='instrument_model',
field=models.CharField(max_length=256),
),
migrations.AlterField(
model_name='sheet',
name='transducer_model',
field=models.CharField(max_length=256),
),
migrations.AlterField(
model_name='sheet',
name='transducer_span',
field=models.CharField(max_length=256),
),
]

View File

@ -1,34 +0,0 @@
# Generated by Django 4.2.5 on 2023-09-18 17:13
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sheets', '0002_alter_sheet_calibration_cert_id_and_more'),
]
operations = [
migrations.RemoveField(
model_name='sheet',
name='customer_address',
),
migrations.AddField(
model_name='sheet',
name='control_doc',
field=models.CharField(default=0, max_length=256),
preserve_default=False,
),
migrations.AddField(
model_name='sheet',
name='onsite_cal',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='sheet',
name='technician',
field=models.CharField(default=0, max_length=256),
preserve_default=False,
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 4.2.5 on 2023-10-05 03:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sheets', '0003_remove_sheet_customer_address_sheet_control_doc_and_more'),
]
operations = [
migrations.AddField(
model_name='sheet',
name='kind',
field=models.CharField(blank=True, choices=[('p', 'Pressure Transducer'), ('f', 'Flow Transducer')], max_length=256),
),
]

View File

@ -1,22 +0,0 @@
# Generated by Django 4.2.5 on 2023-10-05 03:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sheets', '0004_sheet_kind'),
]
operations = [
migrations.RemoveField(
model_name='sheet',
name='kind',
),
migrations.AddField(
model_name='sheet',
name='transducer_type',
field=models.CharField(blank=True, choices=[('Pressure', 'Pressure Transducer'), ('Flow', 'Flow Transducer')], max_length=256),
),
]

View File

@ -1,26 +0,0 @@
# Generated by Django 4.2.5 on 2023-10-05 03:42
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('sheets', '0005_remove_sheet_kind_sheet_transducer_type'),
]
operations = [
migrations.AddField(
model_name='sheet',
name='instrument_calibration_date',
field=models.DateField(default=django.utils.timezone.now),
preserve_default=False,
),
migrations.AddField(
model_name='sheet',
name='instrument_calibration_due_date',
field=models.DateField(default=django.utils.timezone.now),
preserve_default=False,
),
]

View File

@ -1,54 +0,0 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
class Sheet(models.Model):
instrument_model = models.CharField(max_length=256)
instrument_calibration_date = models.DateField()
instrument_calibration_due_date = models.DateField()
serial_number = models.CharField(max_length=256)
channel = models.CharField(max_length=256)
transducer_model = models.CharField(max_length=256)
transducer_span = models.CharField(max_length=256)
customer_name = models.CharField(max_length=256)
onsite_cal = models.BooleanField(default=False)
control_doc = models.CharField(max_length=256)
technician = models.CharField(max_length=256)
accuracy = models.FloatField()
barometric_pressure = models.FloatField()
temperature = models.FloatField()
humidity = models.FloatField()
calibration_serial = models.CharField(max_length=100)
calibration_model = models.CharField(max_length=100)
calibration_date = models.DateField()
calibration_due_date = models.DateField()
calibration_cert_id = models.CharField(max_length=100)
CHOICES = [
('TV', _('Transducer Verify')),
('HC', _('Hardware Calibration'))
]
report_type = models.CharField(
max_length=256,
choices=CHOICES,
)
TRANSDUCER_TYPES = [
('Pressure', _('Pressure Transducer')),
('Flow', _('Flow Transducer'))
]
transducer_type = models.CharField(
max_length=256,
choices=TRANSDUCER_TYPES,
blank=True
)
as_found = models.FileField(blank=True)
as_left = models.FileField(blank=True)
both = models.FileField(blank=True)

View File

@ -1,2 +0,0 @@
from .hardware import parse_hardware_calibration
from .transducer import parse_transducer

View File

@ -1,68 +0,0 @@
import re
def parse_instrument_info(text):
instrument_info = {}
# Regex pattern for key-value pairs in the instrument info section
for line in text.split("\n")[2:]:
if line:
key, value = re.sub(r"\s\s+", "`", line.strip()).split("`")
instrument_info[key.strip()] = value.strip()
return instrument_info
def parse_ports(text):
text = f"{text}\n\n" # ensure extra newline to match on
pattern = r"(Test Port \d)"
matches = re.split(pattern, text)[1:]
m = dict(list(zip(matches[0::2], matches[1::2])))
calibration_data = {}
for port, calibration in m.items():
calibration_data[port] = parse_calibration_data(calibration)
return calibration_data
KEEP = {
"Mass Flow Trans": ("Instrument Flow", "Master Reading"),
"Pressure Transducer": ("Instrument Pressure", "Master Value"),
}
def parse_calibration_data(text):
# Regex pattern for each block in the calibration data section per Port
pattern = r"(Mass Flow Trans|Pressure Transducer)\n(.+?)\n\n"
matches = re.findall(pattern, text, re.DOTALL)
calibration_data = {}
for block_title, block_content in matches:
lines = block_content.strip().split("\n")
lines.pop(0) # Go away =======
device_name = lines.pop(0).strip().split(None, 1)[-1].strip()
device_data = {"name": device_name}
for line in lines:
key, value = re.sub(r"\s\s+", "`", line.strip()).split("`")
# Only keep the fields we want
for start in KEEP[block_title]:
key = key.strip()
if key.startswith(start):
device_data[key] = value.strip()
calibration_data[block_title] = device_data
return calibration_data
def parse_hardware_calibration(content, accuracy):
# Split the content into instrument info and calibration data sections
info_section, calibration_section = content.split(
"|| Hardware Calibration Report ||"
)
instrument_info = parse_instrument_info(info_section)
calibration_data = parse_ports(calibration_section)
return {"instrument": instrument_info, "calibration": calibration_data}
if __name__ == "__main__":
file_path = "./hardware_calibration.txt" # Replace with the actual file path
with open(file_path, "r") as file:
content = file.read()
data = parse_file(file_path)

View File

@ -1,129 +0,0 @@
import re
import json
def in_range(index, value, master_values):
return (
master_values[index]["Low Limit"] <= value <= master_values[index]["High Limit"]
)
def delta(index, value, master_values):
return abs(master_values[index]["Low Limit"] - value)
def parse_transducer(content, accuracy):
accuracy = accuracy/100.0 # Comes in as Percent
transducer_data = []
# Split the content into sections based on the blank line
sections = content.strip().split("\n\n")
for section in sections:
# Split each section into lines
lines = section.strip().split("\n")
lines = [
line.strip()
for line in lines
if not line.startswith("==") and line != "|| Transducer Verify Report ||"
]
lines.pop(0)
# Extract the Transducer number and Transducer type
transducer_line = lines.pop(0).strip()
_, transducer_name, part_number = transducer_line.split(None, 2)
# Get part number and values
value = None
unit = None
transducer_type = None
if part_number != "Custom":
value = part_number.split()[-1]
part_number = part_number.split()[1]
if match := re.match(r"([0-9]+)([A-Z]+)", value, re.I):
value, unit = match.groups()
value = int(value)
if unit == "SCCM":
transducer_type = "Flow"
if unit == "PSIA":
transducer_type = "Pressure"
# Create a dictionary to store the data for each transducer
transducer_info = {
"Accuracy": accuracy,
"Part Number": part_number,
"Value": value,
"Unit": unit,
"Limit ABS": int(value * accuracy * 1000),
"Transducer Name": transducer_name,
"Transducer Type": transducer_type,
"Gauge Reading": [],
"Master Value": [],
"Verify Date": "",
"Verify Time": "",
}
# Extract other information for the transducer
for line in lines:
key, value = re.sub(r"\s\s+", ",", line.strip()).split(",")
if "Verify Date" in key:
transducer_info["Verify Date"] = value
continue
elif "Verify Time" in key:
transducer_info["Verify Time"] = value
continue
# Toss anything else where it belongs
key = re.match(r"(.*)\W(\d)", key)[1]
if key in transducer_info or f"Instrument {transducer_type}" in key:
value = int(float(value.split()[0])*1000)
# special case Master to get the limits
if "Master" in key:
hi = value + transducer_info["Limit ABS"]
lo = value - transducer_info["Limit ABS"]
transducer_info[key].append(
{
"Low Limit": int(lo),
"Master Value": value,
"High Limit": int(hi),
}
)
# Turn both Instrument Pressure and Instrument Flow to Gauge Reading
elif f"Instrument {transducer_type}" in key:
transducer_info["Gauge Reading"].append(value)
else:
transducer_info[key].append(value)
# Once we have the readings, and master values, we can do the math
transducer_info["Gauge Reading"] = [
{
"Value": v,
"In Range": in_range(idx, v, transducer_info["Master Value"]),
"Delta": delta(idx, v, transducer_info["Master Value"])
}
for idx, v in enumerate(transducer_info["Gauge Reading"])
]
transducer_data.append(transducer_info)
return transducer_data
if __name__ == "__main__":
from pprint import pprint
file_path = "./transducer_verify.txt"
with open(file_path, "r") as file:
output = {
"Instrument": "CTS0JODFDASH",
"Customer Name": "Anthony Souza",
"Customer Address": "PO Box 357, West Chesterfield, NH 03466",
"Control Number": "123123",
"Serial Number": "123313",
"Accuracy": 0.5,
"Barometric Pressure": 1013.25,
"Temperature": 50.3,
"Humidity": 27,
"Transducers": parse_transducer(file.read(), 0.5)
}
print(json.dumps(output).replace('"', '""'))
pprint(output)

View File

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

View File

@ -1,6 +0,0 @@
from django.urls import path
from . import views
urlpatterns = [
path('', views.upload_file, name = 'upload'),
]

View File

@ -1,33 +0,0 @@
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render
from django.core.exceptions import ValidationError
from .forms import SheetForm, SheetForm
from .parsers import parse_transducer, parse_hardware_calibration
def upload_file(request):
if request.method == "POST":
f = SheetForm(request.POST, request.FILES)
if f.is_valid():
data = f.clean()
as_found = request.FILES.get('as_found')
as_left = request.FILES.get('as_left')
both = request.FILES.get('both')
if both:
if data['report_type'] == "TV":
tv = parse_transducer(both.read().decode(), data['accuracy'])
f.transducer_type = tv["Transducer Type"]
else:
hc = parse_hardware_calibration(both.read().decode(), data['accuracy'])
elif as_found and as_left:
# TODO: DO THIS
pass
else:
raise ValidationError("Please provide proper files")
f.save()
breakpoint()
return HttpResponseRedirect("/")
else:
form = SheetForm()
return HttpResponse("hi")

View File

@ -1,85 +0,0 @@
|| Transducer Verify Report ||
TRANSDUCER1
===============================================================
Transducer 1 CTS D34-442 115PSIA
Setpoint Pressure 1 0.000 psig
Setpoint Pressure 2 20.000 psig
Setpoint Pressure 3 40.000 psig
Setpoint Pressure 4 60.000 psig
Setpoint Pressure 5 80.000 psig
Setpoint Pressure 6 100.000 psig
Instrument Pressure 1 0.000 psig
Instrument Pressure 2 20.002 psig
Instrument Pressure 3 39.997 psig
Instrument Pressure 4 60.010 psig
Instrument Pressure 5 80.001 psig
Instrument Pressure 6 100.002 psig
Master Value 1 0.000 psig
Master Value 2 20.000 psig
Master Value 3 40.000 psig
Master Value 4 60.000 psig
Master Value 5 80.000 psig
Master Value 6 100.000 psig
Verify Date 07/20/22
Verify Time 11:20:26
TRANSDUCER2
===============================================================
Transducer 2 CTS A12-221 250SCCM
Setpoint Pressure 1 20.000 psig
Setpoint Pressure 2 20.000 psig
Setpoint Pressure 3 20.000 psig
Setpoint Pressure 4 20.000 psig
Setpoint Pressure 5 20.000 psig
Setpoint Pressure 6 20.000 psig
Setpoint Pressure 7 20.000 psig
Setpoint Pressure 8 20.000 psig
Setpoint Pressure 9 20.000 psig
Setpoint Pressure 10 20.000 psig
Setpoint Pressure 11 20.000 psig
Instrument Pressure 1 20.154 psig
Instrument Pressure 2 20.153 psig
Instrument Pressure 3 20.152 psig
Instrument Pressure 4 20.150 psig
Instrument Pressure 5 20.148 psig
Instrument Pressure 6 20.145 psig
Instrument Pressure 7 20.144 psig
Instrument Pressure 8 20.141 psig
Instrument Pressure 9 20.139 psig
Instrument Pressure 10 20.138 psig
Instrument Pressure 11 20.136 psig
Instrument Flow 1 -0.082 sccm
Instrument Flow 2 24.802 sccm
Instrument Flow 3 49.664 sccm
Instrument Flow 4 74.836 sccm
Instrument Flow 5 99.416 sccm
Instrument Flow 6 125.289 sccm
Instrument Flow 7 150.205 sccm
Instrument Flow 8 175.290 sccm
Instrument Flow 9 200.165 sccm
Instrument Flow 10 224.748 sccm
Instrument Flow 11 249.825 sccm
Master Reading 1 0.000 sccm
Master Reading 2 25.000 sccm
Master Reading 3 50.000 sccm
Master Reading 4 75.000 sccm
Master Reading 5 100.000 sccm
Master Reading 6 125.000 sccm
Master Reading 7 150.000 sccm
Master Reading 8 175.000 sccm
Master Reading 9 200.000 sccm
Master Reading 10 225.000 sccm
Master Reading 11 250.000 sccm
Master Value 1 0.000 sccm
Master Value 2 25.000 sccm
Master Value 3 50.000 sccm
Master Value 4 75.000 sccm
Master Value 5 100.000 sccm
Master Value 6 125.000 sccm
Master Value 7 150.000 sccm
Master Value 8 175.000 sccm
Master Value 9 200.000 sccm
Master Value 10 225.000 sccm
Master Value 11 250.000 sccm
Verify Date 07/15/21
Verify Time 14:55:10