Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c96f76f438 | |||
| f0f1c9fc49 | |||
| 499964b287 | |||
| 16f12d40bf | |||
| 63c1ba8efb | |||
| 4a28348db4 | |||
| 64dfe87d05 | |||
| f7a5a867a4 | |||
| 1accaa9b9f | |||
| b810e35fb2 | |||
| 82c9d2b0e3 | |||
| e5a3f33b9f | |||
| 1dd4ae2ce4 | |||
| 515cc9f7a2 | |||
| 9b92249fdb | |||
| adcc13b4de | |||
| 5228290eac | |||
| 034b7976cd |
@@ -1,5 +1,7 @@
|
||||
.DS_Store
|
||||
*.cpython-37.opt-2.pyc
|
||||
*.cpython-39-arm-linux-gnueabihf.so
|
||||
*.
|
||||
*.pyc
|
||||
*/__pycache__
|
||||
/.vscode
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)):
|
||||
|
||||
@@ -881,12 +881,17 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
|
||||
def decode(self, data: bytes) -> Optional[RecordingData]:
|
||||
if len(data) < 18:
|
||||
return None
|
||||
|
||||
voltage = 0
|
||||
mem_cnt = data[1]
|
||||
time_stamp: float = struct.unpack('<I', data[4:8])[0] # unit: ms 0x18030000
|
||||
current = struct.unpack('<i', data[8:12])[0] # unit: nA
|
||||
voltage = struct.unpack('<i', data[12:16])[0] # unit: uV
|
||||
ch2 = 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 - ch2
|
||||
else:
|
||||
voltage = ch2
|
||||
|
||||
cycle_number = struct.unpack('<H', data[20:22])[0]
|
||||
finish_mode_falg = data[22]
|
||||
battery = struct.unpack('<i', data[23:27])[0]
|
||||
@@ -945,18 +950,18 @@ class I4V4Z4T4DataDecoder(RecDataDecoder):
|
||||
ret.append_data(1, voltage)
|
||||
ret.append_data(2, impedance)
|
||||
ret.append_data(3, cycle_number)
|
||||
ret.append_data(4, battery)
|
||||
ret.append_data(5, elite_notify_times)
|
||||
ret.append_data(6, mem_cnt)
|
||||
# ret.append_data(4, battery)
|
||||
# ret.append_data(5, elite_notify_times)
|
||||
# ret.append_data(6, mem_cnt)
|
||||
|
||||
# memoryboard information
|
||||
ret.append_data(7, ram_num)
|
||||
ret.append_data(8, broken_flag)
|
||||
try:
|
||||
ret.append_data(9, mem_wrong_information)
|
||||
# print('append_data success, mem_wrong_information:', mem_wrong_information, hex(mem_wrong_information))
|
||||
except:
|
||||
print('append_data fail, mem_wrong_information:', mem_wrong_information, hex(mem_wrong_information))
|
||||
# # memoryboard information
|
||||
# ret.append_data(7, ram_num)
|
||||
# ret.append_data(8, broken_flag)
|
||||
# try:
|
||||
# ret.append_data(9, mem_wrong_information)
|
||||
# # print('append_data success, mem_wrong_information:', mem_wrong_information, hex(mem_wrong_information))
|
||||
# except:
|
||||
# print('append_data fail, mem_wrong_information:', mem_wrong_information, hex(mem_wrong_information))
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -76,6 +76,8 @@ class MultiExtMemSpiInterface(LowLevelHardwareInterface):
|
||||
|
||||
def set_pin_mem_req(self, value: bool):
|
||||
channel = self.select
|
||||
if self._pin_mem_req_value[channel] == value:
|
||||
print('last_req_sig[channel] == value', channel, self._pin_mem_req_value[channel], value, datetime.now())
|
||||
self.pin_mem_req.output(value)
|
||||
self._pin_mem_req_value[channel] = value
|
||||
|
||||
|
||||
@@ -118,13 +118,13 @@ class Selector:
|
||||
self._p2.output(p[2])
|
||||
|
||||
# if (value == 4 and self._last_sel != 6):
|
||||
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel)
|
||||
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel, datetime.now())
|
||||
# elif (value == 5 and self._last_sel != 4):
|
||||
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel)
|
||||
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel, datetime.now())
|
||||
# elif (value == 7 and self._last_sel != 5):
|
||||
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel)
|
||||
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel, datetime.now())
|
||||
# elif (value == 6 and self._last_sel != 7):
|
||||
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel)
|
||||
# print('mem_sel is not use gray code, value:', value, ', last value:', self._last_sel, datetime.now())
|
||||
|
||||
self._last_sel = value
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -117,6 +117,9 @@ class DataServer(SocketServer, DataAPI):
|
||||
self.database_process = DataBaseProcess('data_server', self.log_verbose, self._queue_db, self._queue_ds_dict, self._queue_msg)
|
||||
self.database_process.start()
|
||||
|
||||
self._no_data_total_duration = 0
|
||||
self._recv_memory_cost_time = 0
|
||||
|
||||
@logging_info
|
||||
def setup(self):
|
||||
self._available_channel.clear()
|
||||
@@ -666,7 +669,17 @@ class DataServer(SocketServer, DataAPI):
|
||||
print("q size= ", self._configurations[device]._queue_rec.qsize())
|
||||
|
||||
self._configurations[device].put_rec_queue(data)
|
||||
self._no_data_total_duration = 0
|
||||
ret = True
|
||||
else:
|
||||
time_diff = time() - self._recv_memory_cost_time
|
||||
self._no_data_total_duration += time_diff
|
||||
if self._no_data_total_duration > 1:
|
||||
print('data is None', device, datetime.now(), self._no_data_total_duration)
|
||||
print("sync.get_pin_mem_req() != sync.get_pin_ram_sel()")
|
||||
print("no~", sync.select, sync.get_pin_mem_req(), sync.get_pin_ram_sel(), datetime.now())
|
||||
print()
|
||||
self._recv_memory_cost_time = time()
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -105,6 +105,9 @@ class RecordingProcess(Process):
|
||||
self._mem_tailer_len = 6
|
||||
self._single_data_len = self._elite_data_len + self._mem_header_len + self._mem_tailer_len
|
||||
|
||||
self._decoder = self.data_format()
|
||||
self._start_time = time()
|
||||
|
||||
def ensure_data_format(self) -> DataDecodeFormat:
|
||||
if isinstance(self._data_format, (str, bytes)):
|
||||
self._data_format = DataDecodeFormat.parse(self._data_format)
|
||||
@@ -133,9 +136,9 @@ class RecordingProcess(Process):
|
||||
decoder._prev_data = self._prev_data
|
||||
decoder._prev_delta_time = self._prev_delta_time
|
||||
decoder._prev_time_stamp = self._prev_time_stamp
|
||||
# elif isinstance(decoder, I4V4Z4T4DataDecoder):
|
||||
elif isinstance(decoder, I4V4Z4T4DataDecoder):
|
||||
# get cycle_time from meta file
|
||||
# decoder._mode = self._meta_file.configuration.MODE
|
||||
decoder._mode = self._meta_file.configuration.get_parameter('MODE')
|
||||
# decoder._cycle_start_time = self._cycle_start_time
|
||||
elif isinstance(decoder, NeuliveThreeOneDataDecoder):
|
||||
# get amp_gain from meta file
|
||||
@@ -151,9 +154,8 @@ class RecordingProcess(Process):
|
||||
decoder._prev_time_stamp = self._prev_time_stamp
|
||||
elif isinstance(decoder, EISZeroOneDataDecoder):
|
||||
# get amp_gain from meta file
|
||||
|
||||
decoder._ac_amp = self._meta_file.configuration.get_parameter('AC_AMP')
|
||||
decoder._mode = self._meta_file.configuration.get_parameter('MODE')
|
||||
decoder._ac_amp = self._meta_file.configuration.get_parameter('AC_AMP')
|
||||
decoder._freq_start = self._meta_file.configuration.get_parameter('FREQ_START')
|
||||
decoder._freq_stop = self._meta_file.configuration.get_parameter('FREQ_STOP')
|
||||
|
||||
@@ -200,14 +202,13 @@ class RecordingProcess(Process):
|
||||
self._isTimeOut = True
|
||||
self._timer = current_time
|
||||
|
||||
decoder = self.data_format()
|
||||
# print('sync_data')
|
||||
# print('data',data)
|
||||
|
||||
# print('server/data', self._prev_delta_time,self._prev_time_stamp, self._prev_data)
|
||||
|
||||
if data is None or len(data) == 0:
|
||||
result = decoder.decode(b'')
|
||||
result = self._decoder.decode(b'')
|
||||
if result is not None:
|
||||
ret = result
|
||||
|
||||
@@ -221,7 +222,7 @@ class RecordingProcess(Process):
|
||||
for offset, section in self._foreach_data_section(data):
|
||||
# for section in self._neu_foreach_data_section(data):
|
||||
|
||||
result = decoder.decode(section)
|
||||
result = self._decoder.decode(section)
|
||||
# if self._isTimeOut:
|
||||
# try:
|
||||
# print('result: ', result.data_size)
|
||||
@@ -229,9 +230,15 @@ class RecordingProcess(Process):
|
||||
# pass
|
||||
|
||||
try:
|
||||
if isinstance(decoder, I4V4Z4T4DataDecoder) or isinstance(decoder, EISZeroOneDataDecoder):
|
||||
if decoder.isFinishMode is not None and decoder.isFinishMode() == 1:
|
||||
time_duration = self._meta_file.configuration.get_parameter('TIME_DURATION')
|
||||
if time_duration and time_duration is not 0 and time() - self._start_time >= time_duration:
|
||||
self._queue_msg.put(['ds', self._device, 'interrupt'])
|
||||
return None
|
||||
|
||||
if isinstance(self._decoder, I4V4Z4T4DataDecoder) or isinstance(self._decoder, EISZeroOneDataDecoder):
|
||||
if self._decoder.isFinishMode is not None and self._decoder.isFinishMode() == 1:
|
||||
self._queue_msg.put(['ds', self._device, 'interrupt'])
|
||||
return None
|
||||
# content = {}
|
||||
# content['header'] = 'device_instruction/0'
|
||||
# content['device'] = result.device
|
||||
@@ -297,8 +304,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 +356,14 @@ class RecordingProcess(Process):
|
||||
|
||||
if colum_total == 1:
|
||||
print('this ram data < 3 records, colum_total = ', colum_total)
|
||||
print('raw_data[0]', raw_data[0])
|
||||
return save
|
||||
print('raw_data[0]', list(raw_data[0]))
|
||||
save = True
|
||||
# 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
|
||||
|
||||
|
||||
@@ -11,9 +11,21 @@
|
||||
"constant": {
|
||||
"FREQ_MAX": 4294967296,
|
||||
"VOLT_MAX": 65536,
|
||||
"BLE_WRITE_MAX": 255
|
||||
"BLE_WRITE_MAX": 255,
|
||||
"TIME_MAX": 100000
|
||||
},
|
||||
"parameters": {
|
||||
"TIME_DURATION": {
|
||||
"description": "Run duration",
|
||||
"record_meta": true,
|
||||
"initial": 0,
|
||||
"domain": [
|
||||
"TIME_MAX"
|
||||
],
|
||||
"value": {
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"CHANNEL": {
|
||||
"derzteription": "record channels",
|
||||
"record_meta": true,
|
||||
@@ -48,9 +60,9 @@
|
||||
"description": "working mode",
|
||||
"record_meta": true,
|
||||
"value": [
|
||||
"EIS CURVE",
|
||||
"Cyclic Voltammetry",
|
||||
"Dev Mode"
|
||||
"EIS CURVE",
|
||||
"Cyclic Voltammetry",
|
||||
"Dev Mode"
|
||||
]
|
||||
},
|
||||
"FREQ_START": {
|
||||
@@ -58,10 +70,10 @@
|
||||
"record_meta": true,
|
||||
"initial": 13422819,
|
||||
"domain": [
|
||||
"FREQ_MAX"
|
||||
"FREQ_MAX"
|
||||
],
|
||||
"value": {
|
||||
"expression": "VALUE"
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"FREQ_STOP": {
|
||||
@@ -69,10 +81,10 @@
|
||||
"record_meta": true,
|
||||
"initial": 7,
|
||||
"domain": [
|
||||
"FREQ_MAX"
|
||||
"FREQ_MAX"
|
||||
],
|
||||
"value": {
|
||||
"expression": "VALUE"
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"DELAY": {
|
||||
@@ -91,21 +103,21 @@
|
||||
"record_meta": true,
|
||||
"initial": 8,
|
||||
"value": [
|
||||
2,
|
||||
4,
|
||||
8,
|
||||
16
|
||||
2,
|
||||
4,
|
||||
8,
|
||||
16
|
||||
]
|
||||
},
|
||||
"DC_BIAS": {
|
||||
"description": "DC voltage bias in mV",
|
||||
"record_meta": true,
|
||||
"initial": 15000,
|
||||
"initial": 25000,
|
||||
"domain": [
|
||||
35001
|
||||
"VOLT_MAX"
|
||||
],
|
||||
"value": {
|
||||
"expression": "VALUE"
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"AC_AMP": {
|
||||
@@ -113,7 +125,7 @@
|
||||
"record_meta": true,
|
||||
"initial": 25,
|
||||
"domain": [
|
||||
2048
|
||||
2048
|
||||
]
|
||||
},
|
||||
"SCALE": {
|
||||
@@ -121,8 +133,8 @@
|
||||
"record_meta": true,
|
||||
"initial": 0,
|
||||
"value": [
|
||||
0,
|
||||
1
|
||||
0,
|
||||
1
|
||||
]
|
||||
},
|
||||
"PPD": {
|
||||
@@ -130,7 +142,7 @@
|
||||
"record_meta": true,
|
||||
"initial": 10,
|
||||
"domain": [
|
||||
11
|
||||
11
|
||||
]
|
||||
},
|
||||
"RTIA": {
|
||||
@@ -138,11 +150,11 @@
|
||||
"record_meta": true,
|
||||
"initial": 4,
|
||||
"value": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4
|
||||
]
|
||||
},
|
||||
"ADC_VALUE_I": {
|
||||
@@ -154,10 +166,10 @@
|
||||
"record_meta": true,
|
||||
"initial": 10000,
|
||||
"domain": [
|
||||
100001
|
||||
100001
|
||||
],
|
||||
"value": {
|
||||
"expression": "VALUE"
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"CTRL_HIGH_Z_15": {
|
||||
@@ -242,9 +254,9 @@
|
||||
"BLE_WRITE": {
|
||||
"description": "send msg to elite",
|
||||
"domain": {
|
||||
"list": [
|
||||
"list": [
|
||||
"BLE_WRITE_MAX"
|
||||
]
|
||||
]
|
||||
},
|
||||
"initial": "[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]",
|
||||
"value": "VALUE"
|
||||
@@ -254,12 +266,13 @@
|
||||
"domain": "int"
|
||||
}
|
||||
},
|
||||
|
||||
"instruction": {
|
||||
"start": [
|
||||
{
|
||||
"expression": "MODE",
|
||||
"when": {
|
||||
"*": "start_data"
|
||||
"*": "start_data"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -430,4 +443,4 @@
|
||||
"_cdr('20X>ADC_VALUE_I')"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@
|
||||
"minor_version_number": 6
|
||||
},
|
||||
"constant": {
|
||||
"TIME_MAX": 100000,
|
||||
"VOLT_MAX": 65536,
|
||||
"Const_Current_Range": 1500001,
|
||||
"BLE_WRITE_MAX": 255
|
||||
@@ -17,7 +18,7 @@
|
||||
"DPV_e_init": {
|
||||
"description": "DPV initial voltage ",
|
||||
"record_meta": true,
|
||||
"initial":20000,
|
||||
"initial": 20000,
|
||||
"domain": [
|
||||
50001
|
||||
],
|
||||
@@ -28,7 +29,7 @@
|
||||
"DPV_e_final": {
|
||||
"description": "DPV final voltage",
|
||||
"record_meta": true,
|
||||
"initial":30000,
|
||||
"initial": 30000,
|
||||
"domain": [
|
||||
50001
|
||||
],
|
||||
@@ -39,7 +40,7 @@
|
||||
"DPV_e_1": {
|
||||
"description": "DPV voltage return 1",
|
||||
"record_meta": true,
|
||||
"initial":35000,
|
||||
"initial": 35000,
|
||||
"domain": [
|
||||
50001
|
||||
],
|
||||
@@ -50,7 +51,7 @@
|
||||
"DPV_e_2": {
|
||||
"description": "DPV voltage return 2",
|
||||
"record_meta": true,
|
||||
"initial":15000,
|
||||
"initial": 15000,
|
||||
"domain": [
|
||||
50001
|
||||
],
|
||||
@@ -61,7 +62,7 @@
|
||||
"DPV_amp": {
|
||||
"description": "DPV pulse amplitude",
|
||||
"record_meta": true,
|
||||
"initial":25125,
|
||||
"initial": 25125,
|
||||
"domain": [
|
||||
50001
|
||||
],
|
||||
@@ -72,7 +73,7 @@
|
||||
"DPV_pul_width": {
|
||||
"description": "DPV pulse width",
|
||||
"record_meta": true,
|
||||
"initial":50,
|
||||
"initial": 50,
|
||||
"domain": [
|
||||
1000001
|
||||
],
|
||||
@@ -83,7 +84,7 @@
|
||||
"DPV_increment": {
|
||||
"description": "DPV increment",
|
||||
"record_meta": true,
|
||||
"initial":25025,
|
||||
"initial": 25025,
|
||||
"domain": [
|
||||
50001
|
||||
],
|
||||
@@ -94,7 +95,7 @@
|
||||
"DPV_step_time": {
|
||||
"description": "DPV step time = time of one period",
|
||||
"record_meta": true,
|
||||
"initial":500,
|
||||
"initial": 500,
|
||||
"domain": [
|
||||
1000001
|
||||
],
|
||||
@@ -105,7 +106,7 @@
|
||||
"DPV_notify_rate": {
|
||||
"description": "DPV sample rate",
|
||||
"record_meta": true,
|
||||
"initial":1000,
|
||||
"initial": 1000,
|
||||
"domain": [
|
||||
1001
|
||||
],
|
||||
@@ -116,7 +117,7 @@
|
||||
"DPV_curr_rec_min": {
|
||||
"description": "DPV current recording period start",
|
||||
"record_meta": true,
|
||||
"initial":25,
|
||||
"initial": 25,
|
||||
"domain": [
|
||||
101
|
||||
],
|
||||
@@ -127,7 +128,7 @@
|
||||
"DPV_curr_rec_max": {
|
||||
"description": "DPV current recording period end",
|
||||
"record_meta": true,
|
||||
"initial":100,
|
||||
"initial": 100,
|
||||
"domain": [
|
||||
101
|
||||
],
|
||||
@@ -166,7 +167,7 @@
|
||||
"V_initial_0": {
|
||||
"description": "Pulse Mode Segment Voltage 0",
|
||||
"record_meta": true,
|
||||
"initial":50000,
|
||||
"initial": 50000,
|
||||
"domain": [
|
||||
50001
|
||||
],
|
||||
@@ -177,7 +178,7 @@
|
||||
"V_initial_1": {
|
||||
"description": "Pulse Mode Segment Voltage 1",
|
||||
"record_meta": true,
|
||||
"initial":25000,
|
||||
"initial": 25000,
|
||||
"domain": [
|
||||
50001
|
||||
],
|
||||
@@ -188,7 +189,7 @@
|
||||
"V_initial_2": {
|
||||
"description": "Pulse Mode Segment Voltage 2",
|
||||
"record_meta": true,
|
||||
"initial":25000,
|
||||
"initial": 25000,
|
||||
"domain": [
|
||||
50001
|
||||
],
|
||||
@@ -199,7 +200,7 @@
|
||||
"V_initial_3": {
|
||||
"description": "Pulse Mode Segment Voltage 3",
|
||||
"record_meta": true,
|
||||
"initial":25000,
|
||||
"initial": 25000,
|
||||
"domain": [
|
||||
50001
|
||||
],
|
||||
@@ -210,7 +211,7 @@
|
||||
"t_pulse_0": {
|
||||
"description": "Pulse Mode Segment Duration 0",
|
||||
"record_meta": true,
|
||||
"initial":750,
|
||||
"initial": 750,
|
||||
"domain": [
|
||||
1000001
|
||||
],
|
||||
@@ -221,7 +222,7 @@
|
||||
"t_pulse_1": {
|
||||
"description": "Pulse Mode Segment Duration 1",
|
||||
"record_meta": true,
|
||||
"initial":9250,
|
||||
"initial": 9250,
|
||||
"domain": [
|
||||
1000001
|
||||
],
|
||||
@@ -232,7 +233,7 @@
|
||||
"t_pulse_2": {
|
||||
"description": "Pulse Mode Segment Duration 2",
|
||||
"record_meta": true,
|
||||
"initial":1000,
|
||||
"initial": 1000,
|
||||
"domain": [
|
||||
1000001
|
||||
],
|
||||
@@ -243,7 +244,7 @@
|
||||
"t_pulse_3": {
|
||||
"description": "Pulse Mode Segment Duration 3",
|
||||
"record_meta": true,
|
||||
"initial":1000,
|
||||
"initial": 1000,
|
||||
"domain": [
|
||||
1000001
|
||||
],
|
||||
@@ -254,7 +255,7 @@
|
||||
"CURR_REC_START_0": {
|
||||
"description": "Pulse Mode Current Recording Period Start",
|
||||
"record_meta": true,
|
||||
"initial":35,
|
||||
"initial": 35,
|
||||
"domain": [
|
||||
100
|
||||
],
|
||||
@@ -265,7 +266,7 @@
|
||||
"CURR_REC_START_1": {
|
||||
"description": "Pulse Mode Current Recording Period Start",
|
||||
"record_meta": true,
|
||||
"initial":35,
|
||||
"initial": 35,
|
||||
"domain": [
|
||||
100
|
||||
],
|
||||
@@ -276,7 +277,7 @@
|
||||
"CURR_REC_START_2": {
|
||||
"description": "Pulse Mode Current Recording Period Start",
|
||||
"record_meta": true,
|
||||
"initial":35,
|
||||
"initial": 35,
|
||||
"domain": [
|
||||
100
|
||||
],
|
||||
@@ -287,7 +288,7 @@
|
||||
"CURR_REC_START_3": {
|
||||
"description": "Pulse Mode Current Recording Period Start",
|
||||
"record_meta": true,
|
||||
"initial":35,
|
||||
"initial": 35,
|
||||
"domain": [
|
||||
100
|
||||
],
|
||||
@@ -298,7 +299,7 @@
|
||||
"CURR_REC_END_0": {
|
||||
"description": "Pulse Mode Current Recording Period End",
|
||||
"record_meta": true,
|
||||
"initial":90,
|
||||
"initial": 90,
|
||||
"domain": [
|
||||
100
|
||||
],
|
||||
@@ -309,7 +310,7 @@
|
||||
"CURR_REC_END_1": {
|
||||
"description": "Pulse Mode Current Recording Period End",
|
||||
"record_meta": true,
|
||||
"initial":99,
|
||||
"initial": 99,
|
||||
"domain": [
|
||||
100
|
||||
],
|
||||
@@ -320,7 +321,7 @@
|
||||
"CURR_REC_END_2": {
|
||||
"description": "Pulse Mode Current Recording Period End",
|
||||
"record_meta": true,
|
||||
"initial":95,
|
||||
"initial": 95,
|
||||
"domain": [
|
||||
100
|
||||
],
|
||||
@@ -331,7 +332,7 @@
|
||||
"CURR_REC_END_3": {
|
||||
"description": "Pulse Mode Current Recording Period End",
|
||||
"record_meta": true,
|
||||
"initial":95,
|
||||
"initial": 95,
|
||||
"domain": [
|
||||
100
|
||||
],
|
||||
@@ -478,13 +479,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 +646,7 @@
|
||||
},
|
||||
"CURRNET_LIMIT_VALUE": {
|
||||
"description": "Current value Setting",
|
||||
"initial":1500000,
|
||||
"initial": 1500000,
|
||||
"domain": [
|
||||
"Const_Current_Range"
|
||||
],
|
||||
@@ -685,6 +687,15 @@
|
||||
"expression": "VALUE"
|
||||
}
|
||||
},
|
||||
"CC_CP_SPEED": {
|
||||
"description": "charge speed for CC and CP mode",
|
||||
"initial": 1,
|
||||
"value": [
|
||||
"low",
|
||||
"normal",
|
||||
"high"
|
||||
]
|
||||
},
|
||||
"ADC_LEVEL_I_15": {
|
||||
"description": "ADC level",
|
||||
"record_meta": true,
|
||||
@@ -762,6 +773,17 @@
|
||||
"s",
|
||||
"ms"
|
||||
]
|
||||
},
|
||||
"TIME_DURATION": {
|
||||
"description": "Run duration",
|
||||
"record_meta": true,
|
||||
"initial": 0,
|
||||
"domain": [
|
||||
"TIME_MAX"
|
||||
],
|
||||
"value": {
|
||||
"expression": "VALUE"
|
||||
}
|
||||
}
|
||||
},
|
||||
"instruction": {
|
||||
@@ -812,7 +834,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 +850,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 +869,8 @@
|
||||
"9": "curve_const_vscan",
|
||||
"13": "curve_ocp",
|
||||
"14": "curve_pulse_sensing",
|
||||
"15": "curve_dpv"
|
||||
"15": "curve_dpv",
|
||||
"16": "curve_cp"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -1043,6 +1068,7 @@
|
||||
"vb": "Const_Current_value",
|
||||
"vc": "VOLTSTOP_MAX",
|
||||
"vd": "VOLTSTOP_MIN",
|
||||
"ve": "CC_CP_SPEED",
|
||||
"pa": "ADC_LEVEL_I_15",
|
||||
"pb": "ADC_LEVEL_V_IN_15",
|
||||
"pc": "DAC_LEVEL_V_OUT_15",
|
||||
@@ -1054,7 +1080,31 @@
|
||||
"B>va;4B>vb;2B>vc;2B>vd;",
|
||||
"4b>pa;4b>pb;",
|
||||
"4b>pc;4b>pd;",
|
||||
"2B>pe"
|
||||
"2B>pe;",
|
||||
"4b>0b0001;4b>ve"
|
||||
]
|
||||
},
|
||||
"curve_cp": {
|
||||
"type": "RIS",
|
||||
"parameter": {
|
||||
"va": "Charge",
|
||||
"vb": "Const_Current_value",
|
||||
"vc": "VOLTSTOP_MAX",
|
||||
"vd": "VOLTSTOP_MIN",
|
||||
"ve": "CC_CP_SPEED",
|
||||
"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": [
|
||||
"X07;",
|
||||
"B>va;4B>vb;2B>vc;2B>vd;",
|
||||
"4b>pa;4b>pb;",
|
||||
"4b>pc;4b>pd;",
|
||||
"2B>pe;",
|
||||
"4b>0b0000;4b>ve"
|
||||
]
|
||||
},
|
||||
"curve_cv3": {
|
||||
@@ -1219,9 +1269,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 +1363,7 @@
|
||||
"2B>va;4B>vb;1B>vc;1B>vd;1B>ve"
|
||||
]
|
||||
},
|
||||
|
||||
|
||||
"curve_dpv":[
|
||||
"curve_dpv": [
|
||||
{
|
||||
"expression": "DPV_mode",
|
||||
"when": {
|
||||
@@ -1365,14 +1422,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 +1500,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 +1529,6 @@
|
||||
"dpv_engineering_mode_advanced": [
|
||||
"dpv_advanced_mode"
|
||||
],
|
||||
|
||||
|
||||
"VIS_CC_ZERO": [
|
||||
"_data_format('I4V4Z4T4')",
|
||||
"_disable_cache(False)",
|
||||
@@ -1499,6 +1569,4 @@
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Executable
+3
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
find /home/pi -maxdepth 1 -type f -iname '*.out' -mtime +30 -delete
|
||||
Reference in New Issue
Block a user