Compare commits

...

11 Commits

Author SHA1 Message Date
peterlu14 f7a5a867a4 [update] fix memory counter 2022-05-06 13:50:09 +08:00
peterlu14 1accaa9b9f [update] delete logger 2022-05-06 11:25:30 +08:00
peterlu14 b810e35fb2 Merge branch 'feature/get-running-project-flow' into rel/v1.6.1/cp_mode 2022-05-06 10:39:51 +08:00
peterlu14 82c9d2b0e3 [update] add clean logger script 2022-05-06 10:39:47 +08:00
peterlu14 e5a3f33b9f [update] add cp mode 2022-05-06 10:36:17 +08:00
peterlu14 1dd4ae2ce4 [update] add stop project api & fix uuid problem & get all projects & as_json problem 2022-05-04 18:07:05 +08:00
peterlu14 515cc9f7a2 [update] fix stop close writer losing data problem 2022-04-29 17:18:48 +08:00
peterlu14 9b92249fdb Merge branch 'feature/project' into rel/v1.6.0/highz 2022-04-27 14:01:07 +08:00
peterlu14 adcc13b4de [update] idle device not sending instruction 2022-04-27 13:26:05 +08:00
Roy 5228290eac [update] fix 1.5re.json about highz 2022-04-27 13:16:29 +08:00
LuoYiTing 034b7976cd Update README.md 2022-04-25 03:55:34 +00:00
12 changed files with 321 additions and 116 deletions
+174 -38
View File
@@ -4,7 +4,7 @@ New goal on pi4 without kotlin and django, and with only one dataserver.
# Installation
### Get Raspbrain into SD card
###### Download Raspbian Buster Lite
###### Download Raspbian Bullseye Lite
>https://www.raspberrypi.org/downloads/raspberry-pi-os/
@@ -14,7 +14,7 @@ New goal on pi4 without kotlin and django, and with only one dataserver.
lsblk
# copy data to sd card
sudo dd bs=4M if=yyyy-mm-dd-raspbian-buster.img of=/dev/sdX conv=fsync status=progress
sudo dd bs=4M if=yyyy-mm-dd-raspios-bullseye-armhf-lite.img of=/dev/sdX conv=fsync status=progress
# enable ssh on first boot
add ssh.txt in boot folder
@@ -77,18 +77,22 @@ add ssh.txt in boot folder
###### Install dependencies
sudo apt-get install vim git wiringpi build-essential libi2c-dev i2c-tools python-dev libffi-dev python3-pip postgresql
sudo apt-get install vim git wiringpi build-essential libi2c-dev i2c-tools python-dev libffi-dev python3-pip postgresql npm
###### wiringpi conflict
need to install wiringpi: https://github.com/WiringPi/WiringPi
install instructions: https://github.com/WiringPi/WiringPi/blob/master/INSTALL
### Setup project
###### Clone project
###### Clone data server project
```
cd ~
git clone https://gitlab.com/bioproscientific/bioprorelife.git
git clone https://gitlab.com/wisetop/controller/wisetopdataserver.git
```
###### Install python dependencies
```
cd ~/bioprorelife
cd ~/wisetopdataserver
pip3 install -r requirements.txt
```
##### Packages version
@@ -112,14 +116,14 @@ psycopg2 2.8.5
###### Build C extension
```
cd ~/bioprorelife/python/biopro/ext/
cd ~/wisetopdataserver/python/biopro/ext/
rm -rf *.so build
python3 setup.py build_ext --inplace
```
###### Check setup-uart file
```
cd ~/bioprorelife
cd ~/wisetopdataserver/
sudo vim ./run-setup-uart.sh
```
##### Modify the code as following
@@ -149,44 +153,72 @@ sudo raspi-config
reboot
```
###### Set pi password
```
$cd ~
$passwd
Current password:raspberry
New password:5k6zj454778225
Retype new password:5k6zj454778225
```
###### Auto run program when device start
```
sudo vim /etc/rc.local
```
add the code following as:
###### add the code following as:
```
sudo -H -u pi nohup /home/pi/bioprorelife/run-data-server.sh > /home/pi/.data_server.out &
sudo -H -u pi nohup /home/pi/wisetopdataserver/run-data-server.sh > /home/pi/.data_server.out &
#sudo -H -u pi nohup /home/pi/wisetopdataserver/run-data-server.sh > /home/pi/.wisetop_data_$now.out &
```
##### /etc/rc.local
```
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
now=$(date +'%F_%T')
sudo nohup systemctl restart apache2
sudo nohup systemctl restart mosquitto
nohup node /home/pi/wisetopapiserver/dist/app.js > /home/pi/.api_server.out &
sleep 5
sudo -H -u pi nohup /home/pi/wisetopdataserver/run-data-server.sh > /home/pi/.data_server.out &
#sudo -H -u pi nohup /home/pi/wisetopdataserver/run-data-server.sh > /home/pi/.wisetop_data_$now.out &
exit 0
```
### MQTT broker install
1. Install mosquitto
```
sudo apt-get install mosquitto mosquitto-clients
```
###### 1.Install mosquitto
$sudo apt-get install mosquitto mosquitto-clients
###### 2.Enable Remote Access
$sudo vim /etc/mosquitto/conf.d/default.conf
2. Enable Remote Access
```
sudo vim /etc/mosquitto/conf.d/default.conf
```
add the code following as:
```
listener 1883
protocol mqtt
listener 8083
protocol websockets
allow_anonymous true
```
restart mqtt broker
```
sudo systemctl restart mosquitto
```
###### 3.restart mqtt broker
$sudo systemctl restart mosquitto
3. Robust MQTT
###### 4.Robust MQTT
create mosquitto_restart.sh
```
cd ~
sudo vim mosquitto_restart.sh
```
$cd ~
$sudo vim mosquitto_restart.sh
add the code following as:
```
if [ "`ps -aux | grep /usr/sbin/mosquitto | wc -l`" == "1" ]
@@ -200,25 +232,129 @@ fi
echo "$SERVICE is currently running" >> /home/ubuntu/cron.log
exit 0
```
add mosquitto_restart.sh to root routing
```
sudo chmod +x mosquitto_restart.sh
sudo -i
crontab -e
```
###### 5.add mosquitto_restart.sh to root routing
$sudo chmod +x mosquitto_restart.sh
$sudo -i
$crontab -e
add the code following as:
```
*/5 * * * * /home/pi/mosquitto_restart.sh
```
3. Auto run MQTT broker when when pi-start
```
sudo vim /etc/rc.local
```
###### 6.Auto run MQTT broker when when pi-start
$sudo vim /etc/rc.local
add the code following as:
```
sudo nohup systemctl restart mosquitto
```
### Setup routed wireless access point
### Setting up a Routed Wireless Access Point
###### 1.Install AP and Management Software
$sudo apt install hostapd
$sudo systemctl unmask hostapd
$sudo systemctl enable hostapd
$sudo apt install dnsmasq
$sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent iptables-persistent
###### 2.Set up the Network Router
$sudo nano /etc/dhcpcd.conf
```
interface wlan0
static ip_address=192.168.2.1/24
nohook wpa_supplicant
```
$sudo nano /etc/sysctl.d/routed-ap.conf
```
# Enable IPv4 routing
net.ipv4.ip_forward=1
```
$sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$sudo netfilter-persistent save
$sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
$sudo nano /etc/dnsmasq.conf
```
interface=wlan0 # Listening interface
dhcp-range=192.168.2.2,192.168.2.255,255.255.255.0,24h
# Pool of IP addresses served via DHCP
domain=wlan # Local wireless DNS domain
address=/gw.wlan/192.168.2.1
# Alias for this router
```
###### 3.Ensure Wireless Operation
$sudo rfkill unblock wlan
###### 4.Configure the AP Software
$sudo nano /etc/hostapd/hostapd.conf
```
country_code=TW
interface=wlan0
ssid=WTP_NONE
hw_mode=g
channel=7
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=00000000
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
# 802.11n support
ieee80211n=1
# make raspberry pi dongle fast
wme_enabled=1
# ht_capab: HT capabilities, enable 40MHz
ht_capab=[HT40+][SHORT-GI-40]
```
###### 5.Running the new Wireless AP
$sudo systemctl reboot
### Set web site
$sudo vim ./sites-available/000-default.conf
```
<VirtualHost *:8080> #80------>8080
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
<VirtualHost *:80>
ServerAdmin bioprovue@localhost
DocumentRoot /var/www/bioprovuebuild
</VirtualHost>
```
##### raspberry website document:
> https://www.raspberrypi.org/documentation/configuration/wireless/access-point-routed.md
+6 -3
View File
@@ -1578,10 +1578,13 @@ class ControlAPI(metaclass=Router):
raise NotImplementedError()
def run_project(self, project) -> bool:
print('create_project', project)
self._project_manager.create(project)
return False
raise NotImplementedError()
def get_running_project(self) -> bool:
raise NotImplementedError()
def stop_project(self, project) -> bool:
raise NotImplementedError()
# noinspection PyAbstractClass
class ControlClient(SocketClient, ControlAPI, metaclass=SocketClientMacro(ControlAPI)):
+3
View File
@@ -887,6 +887,9 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
current = struct.unpack('<i', data[8:12])[0] # unit: nA
voltage = struct.unpack('<i', data[12:16])[0] # unit: uV
impedance = struct.unpack('<i', data[16:20])[0] # unit: mOm
if self._mode == 16:
voltage = impedance - voltage
cycle_number = struct.unpack('<H', data[20:22])[0]
finish_mode_falg = data[22]
battery = struct.unpack('<i', data[23:27])[0]
+2 -1
View File
@@ -1130,7 +1130,8 @@ class CompletedDevice(Device):
self._master.log_warn('on_change instruction not found : ' + on_change)
else:
self.call_instruction(on_change)
if self._status == 1:
self.call_instruction(on_change)
# device instruction call
+27 -12
View File
@@ -29,16 +29,18 @@ class Project(threading.Thread):
self._end_time = None
self._id = None
self._uuid = uuid4()
self._uuid = str(uuid4())
self._name = None
self._desc = None
self._device = None
self._complete_device = []
self._status = None
self._status = 0
self._instruction_set = Instruction()
self._stop_flag = False
self._task_manager = None
self.setup_project(project)
self.setup_device(self._device)
@@ -49,6 +51,8 @@ class Project(threading.Thread):
if key == 'task':
self._task_manager = TaskManager(project['task'])
elif key == 'uuid':
pass
else:
setattr(self, key, value)
@@ -107,17 +111,17 @@ class Project(threading.Thread):
@property
def task_list(self):
return self.task_manager.task_list
return self._task_manager.export_task_list
@property
def mqtt_thread(self):
return self._mqtt_thread
def run(self):
self._status = 1
self._start_time = time()
self.mqtt_thread.broadcast_command('project:' + self._name + ' start_at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
self.mqtt_thread.broadcast_command('project:' + self._name + ' start at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
while not self._stop_flag :
# check running task first
delay_time = 0
@@ -165,7 +169,6 @@ class Project(threading.Thread):
# check project done then close project
if self.check_project_done() == True:
self.mqtt_thread.broadcast_command('project:project ' + str(self._name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
print('project stop at', datetime.now())
self.close()
@@ -176,9 +179,19 @@ class Project(threading.Thread):
# TODO
pass
def close(self):
def stop(self):
self._task_manager.running_task.stop()
self.mqtt_thread.broadcast_command('project:task ' + str(self._task_manager.running_task.name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
self._status = 2
self._end_time = time()
self._stop_flag = True
self.mqtt_thread.broadcast_command('project:project ' + str(self._name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
def close(self):
self._status = 2
self._end_time = time()
self._stop_flag = True
self.mqtt_thread.broadcast_command('project:project ' + str(self._name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
def check_project_done(self):
for task in self._task_manager.task_list:
@@ -191,19 +204,21 @@ class Project(threading.Thread):
# if no running task
if self._task_manager.running_task == None:
return False
device_list = self._task_manager.running_task.device
for device in device_list:
for device in self._task_manager.running_task.device:
if self._complete_device[device].status == 1:
return False
return True
def as_json(self):
return {
data = {
'id': self._id,
'name': self._name,
'uuid': self._uuid,
'desc': self._desc,
'status': self._status,
'device': self._device,
'task_list': self.task_list,
'task': self.task_list,
'running_task': self._task_manager.running_task.as_json()
}
return data
+11 -5
View File
@@ -23,11 +23,17 @@ class ProjectManager():
self._project_list[index].stop()
del self._project_list[index]
def get(self):
return self._project_list
def get(self, project_uuid = None):
if project_uuid == None:
return self._project_list
else:
for project in self._project_list:
if project.uuid == project_uuid:
return project
def run(self, project):
def run_project(self, project):
project.start()
def stop(self, project):
project.stop()
def stop_project(self, project):
_project = self.get(project)
_project.stop()
+4
View File
@@ -28,6 +28,10 @@ class TaskManager():
def task_list(self):
return self._task_list
@property
def export_task_list(self):
return [d.as_json() for d in self._task_list]
@property
def prev_task(self):
return self._prev_task
+3 -2
View File
@@ -69,7 +69,8 @@ class DataBaseProcess(Process):
self._data_raw_create_sql_str = None
self._data_raw_update_sql_str = None
self._data_raw_recording_sql_str = 'UPDATE "public"."%s_recording_data_raws" SET data = concat(data, %s), end_time=%s, size=%s where id = %s'
self._data_raw_recording_sql_str = 'UPDATE "public"."%s_recording_data_raws" SET data = concat(data, %s) where id = %s'
self._new_data_raw_recording_sql_str = 'UPDATE "public"."%s_recording_data_raws" SET data = concat(data, %s), end_time=%s, size=%s where id = %s'
self._data_mini_recording_sql_str = 'UPDATE "public"."%s_recording_data_minis" SET data_mean = concat(data_mean, %s) where id = %s'
@property
@@ -384,7 +385,7 @@ class DataBaseProcess(Process):
para_list.append([_channel, _data_dict[_channel] + '"***"', _end_time_dict[_channel], _size_dict[_channel], _id_dict[_channel]])
with self._psql_conn as conn:
with conn.cursor() as sql_cursor:
execute_batch(sql_cursor, self._data_raw_recording_sql_str, para_list)
execute_batch(sql_cursor, self._new_data_raw_recording_sql_str, para_list)
except psycopg2.Error as e:
print('recording error', e)
return None
+14 -3
View File
@@ -1014,9 +1014,20 @@ class ControlServer(SocketServer, ControlServerAPI):
@logging_info
def run_project(self, project) -> bool:
project = self._project_manager.create(project)
self._project_manager.run(project)
return False
if project is not None:
project = self._project_manager.create(project)
self._project_manager.run_project(project)
return project.as_json()
@logging_info
def stop_project(self, project) -> bool:
if project is not None:
self._project_manager.stop_project(project)
return True
@logging_info
def get_running_project(self) -> bool:
return self._project_manager.get()
@logging_info
def device_internal_command(self, device: int, oper: str, value: Any) -> bool:
+5 -5
View File
@@ -297,8 +297,8 @@ class RecordingProcess(Process):
self._last_cnt[7] = head_counter - 1
last_data_cnt = self._last_cnt[7]
# dont save to section when head or id is wrong
if (head != 255 or device_id != device):
# dont save to section when head or id is wrong
if (head != 255 or device_id != device or head_counter > 255 or head_counter < 0):
save = False
last_data_cnt = last_data_cnt + 1
@@ -349,13 +349,13 @@ class RecordingProcess(Process):
if colum_total == 1:
print('this ram data < 3 records, colum_total = ', colum_total)
print('raw_data[0]', raw_data[0])
print('raw_data[0]', list(raw_data[0]))
return save
elif colum_total == 2:
print('this ram data < 3 records, colum_total = ', colum_total)
print('raw_data[0]', raw_data[0])
print('raw_data[1]', raw_data[1])
print('raw_data[0]', list(raw_data[0]))
print('raw_data[1]', list(raw_data[1]))
if (raw_data[col + 1][1] - raw_data[col][1] == 1) or (raw_data[col][1] == 255 and raw_data[col + 1][1] == 0):
save = True
+69 -47
View File
@@ -17,7 +17,7 @@
"DPV_e_init": {
"description": "DPV initial voltage ",
"record_meta": true,
"initial":20000,
"initial": 20000,
"domain": [
50001
],
@@ -28,7 +28,7 @@
"DPV_e_final": {
"description": "DPV final voltage",
"record_meta": true,
"initial":30000,
"initial": 30000,
"domain": [
50001
],
@@ -39,7 +39,7 @@
"DPV_e_1": {
"description": "DPV voltage return 1",
"record_meta": true,
"initial":35000,
"initial": 35000,
"domain": [
50001
],
@@ -50,7 +50,7 @@
"DPV_e_2": {
"description": "DPV voltage return 2",
"record_meta": true,
"initial":15000,
"initial": 15000,
"domain": [
50001
],
@@ -61,7 +61,7 @@
"DPV_amp": {
"description": "DPV pulse amplitude",
"record_meta": true,
"initial":25125,
"initial": 25125,
"domain": [
50001
],
@@ -72,7 +72,7 @@
"DPV_pul_width": {
"description": "DPV pulse width",
"record_meta": true,
"initial":50,
"initial": 50,
"domain": [
1000001
],
@@ -83,7 +83,7 @@
"DPV_increment": {
"description": "DPV increment",
"record_meta": true,
"initial":25025,
"initial": 25025,
"domain": [
50001
],
@@ -94,7 +94,7 @@
"DPV_step_time": {
"description": "DPV step time = time of one period",
"record_meta": true,
"initial":500,
"initial": 500,
"domain": [
1000001
],
@@ -105,7 +105,7 @@
"DPV_notify_rate": {
"description": "DPV sample rate",
"record_meta": true,
"initial":1000,
"initial": 1000,
"domain": [
1001
],
@@ -116,7 +116,7 @@
"DPV_curr_rec_min": {
"description": "DPV current recording period start",
"record_meta": true,
"initial":25,
"initial": 25,
"domain": [
101
],
@@ -127,7 +127,7 @@
"DPV_curr_rec_max": {
"description": "DPV current recording period end",
"record_meta": true,
"initial":100,
"initial": 100,
"domain": [
101
],
@@ -166,7 +166,7 @@
"V_initial_0": {
"description": "Pulse Mode Segment Voltage 0",
"record_meta": true,
"initial":50000,
"initial": 50000,
"domain": [
50001
],
@@ -177,7 +177,7 @@
"V_initial_1": {
"description": "Pulse Mode Segment Voltage 1",
"record_meta": true,
"initial":25000,
"initial": 25000,
"domain": [
50001
],
@@ -188,7 +188,7 @@
"V_initial_2": {
"description": "Pulse Mode Segment Voltage 2",
"record_meta": true,
"initial":25000,
"initial": 25000,
"domain": [
50001
],
@@ -199,7 +199,7 @@
"V_initial_3": {
"description": "Pulse Mode Segment Voltage 3",
"record_meta": true,
"initial":25000,
"initial": 25000,
"domain": [
50001
],
@@ -210,7 +210,7 @@
"t_pulse_0": {
"description": "Pulse Mode Segment Duration 0",
"record_meta": true,
"initial":750,
"initial": 750,
"domain": [
1000001
],
@@ -221,7 +221,7 @@
"t_pulse_1": {
"description": "Pulse Mode Segment Duration 1",
"record_meta": true,
"initial":9250,
"initial": 9250,
"domain": [
1000001
],
@@ -232,7 +232,7 @@
"t_pulse_2": {
"description": "Pulse Mode Segment Duration 2",
"record_meta": true,
"initial":1000,
"initial": 1000,
"domain": [
1000001
],
@@ -243,7 +243,7 @@
"t_pulse_3": {
"description": "Pulse Mode Segment Duration 3",
"record_meta": true,
"initial":1000,
"initial": 1000,
"domain": [
1000001
],
@@ -254,7 +254,7 @@
"CURR_REC_START_0": {
"description": "Pulse Mode Current Recording Period Start",
"record_meta": true,
"initial":35,
"initial": 35,
"domain": [
100
],
@@ -265,7 +265,7 @@
"CURR_REC_START_1": {
"description": "Pulse Mode Current Recording Period Start",
"record_meta": true,
"initial":35,
"initial": 35,
"domain": [
100
],
@@ -276,7 +276,7 @@
"CURR_REC_START_2": {
"description": "Pulse Mode Current Recording Period Start",
"record_meta": true,
"initial":35,
"initial": 35,
"domain": [
100
],
@@ -287,7 +287,7 @@
"CURR_REC_START_3": {
"description": "Pulse Mode Current Recording Period Start",
"record_meta": true,
"initial":35,
"initial": 35,
"domain": [
100
],
@@ -298,7 +298,7 @@
"CURR_REC_END_0": {
"description": "Pulse Mode Current Recording Period End",
"record_meta": true,
"initial":90,
"initial": 90,
"domain": [
100
],
@@ -309,7 +309,7 @@
"CURR_REC_END_1": {
"description": "Pulse Mode Current Recording Period End",
"record_meta": true,
"initial":99,
"initial": 99,
"domain": [
100
],
@@ -320,7 +320,7 @@
"CURR_REC_END_2": {
"description": "Pulse Mode Current Recording Period End",
"record_meta": true,
"initial":95,
"initial": 95,
"domain": [
100
],
@@ -331,7 +331,7 @@
"CURR_REC_END_3": {
"description": "Pulse Mode Current Recording Period End",
"record_meta": true,
"initial":95,
"initial": 95,
"domain": [
100
],
@@ -478,13 +478,14 @@
"Constant Current",
"Cyclic Voltammetry",
"Linear Sweep Voltammetry",
"Chronoamperometric Graph",
"Chronoamperometric",
"Cali DAC - test",
"Cali ADC - test",
"Dev Mode",
"Open Circuit Potential",
"Pulse Sensing",
"Differential Pulse Voltammetry (DPV)"
"Differential Pulse Voltammetry (DPV)",
"Chronopotentiometry"
]
},
"VOLT_ORIGIN": {
@@ -644,7 +645,7 @@
},
"CURRNET_LIMIT_VALUE": {
"description": "Current value Setting",
"initial":1500000,
"initial": 1500000,
"domain": [
"Const_Current_Range"
],
@@ -812,7 +813,8 @@
"7": "set_adc_gain_I",
"8": "set_adc_gain_I",
"9": "set_adc_gain_I",
"13": "set_adc_gain_I"
"13": "set_adc_gain_I",
"16": "set_adc_gain_I"
}
},
{
@@ -827,7 +829,8 @@
"7": "set_adc_gain_Vin",
"8": "set_adc_gain_Vin",
"9": "set_adc_gain_Vin",
"13": "set_adc_gain_Vin"
"13": "set_adc_gain_Vin",
"16": "set_adc_gain_Vin"
}
},
{
@@ -845,7 +848,8 @@
"9": "curve_const_vscan",
"13": "curve_ocp",
"14": "curve_pulse_sensing",
"15": "curve_dpv"
"15": "curve_dpv",
"16": "curve_const_vscan"
}
},
{
@@ -1219,9 +1223,18 @@
],
"pul_sen_start": {
"type": "RIS",
"parameter": {
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE"
},
"data": [
"1X0D;",
"1XFF"
"1XFF",
"4b>pa;4b>pb;",
"4b>pc;4b>pd"
]
},
"pul_sen_segment_0": {
@@ -1304,9 +1317,7 @@
"2B>va;4B>vb;1B>vc;1B>vd;1B>ve"
]
},
"curve_dpv":[
"curve_dpv": [
{
"expression": "DPV_mode",
"when": {
@@ -1365,14 +1376,20 @@
},
"dpv_auto_mode_ins_final": {
"type": "RIS",
"parameter": {
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE"
},
"data": [
"1X0E;",
"1XFF"
"1XFF;",
"4b>pa;4b>pb;",
"4b>pc;4b>pd"
]
},
"dpv_advanced_mode": [
"dpv_advanced_mode_ins_1",
"dpv_advanced_mode_ins_2",
@@ -1437,9 +1454,18 @@
},
"dpv_advanced_mode_ins_final": {
"type": "RIS",
"parameter": {
"pa": "ADC_LEVEL_I_15",
"pb": "ADC_LEVEL_V_IN_15",
"pc": "DAC_LEVEL_V_OUT_15",
"pd": "CTRL_HIGH_Z_15",
"pe": "SAMPLE_RATE"
},
"data": [
"1X10;",
"1XFF"
"1XFF;",
"4b>pa;4b>pb;",
"4b>pc;4b>pd"
]
},
"dpv_engineering_mode": [
@@ -1457,8 +1483,6 @@
"dpv_engineering_mode_advanced": [
"dpv_advanced_mode"
],
"VIS_CC_ZERO": [
"_data_format('I4V4Z4T4')",
"_disable_cache(False)",
@@ -1499,6 +1523,4 @@
]
}
}
}
}
+3
View File
@@ -0,0 +1,3 @@
#!/bin/bash
find /home/pi -maxdepth 1 -type f -iname '*.out' -mtime +30 -delete