Skip to content

Commit

Permalink
Update Galea v4 emulator to control sampling rate (#681)
Browse files Browse the repository at this point in the history
* fix failed alpine test and improve emulators 

---------

Signed-off-by: Andrey Parfenov <a1994ndrey@gmail.com>
Co-authored-by: Andrey Parfenov <a1994ndrey@gmail.com>
  • Loading branch information
retiutut and Andrey1994 committed Dec 16, 2023
1 parent ebf9722 commit cc833cf
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 13 deletions.
12 changes: 6 additions & 6 deletions .github/workflows/run_alpine.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,23 @@ jobs:
uses: actions/checkout@v2
- name: Compile BrainFlow in Alpine Docker container
run: |
docker pull alpine
docker run -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE alpine /bin/sh -c "apk add make gcc g++ cmake py3-pip && cd $GITHUB_WORKSPACE && mkdir build_docker && cd build_docker && cmake -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/installed -DCMAKE_BUILD_TYPE=Release .. && make && make install"
docker pull alpine:3.18.5
docker run -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE alpine:3.18.5 /bin/sh -c "apk add make gcc g++ cmake py3-pip && cd $GITHUB_WORKSPACE && mkdir build_docker && cd build_docker && cmake -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/installed -DCMAKE_BUILD_TYPE=Release .. && make && make install"
- name: Build Get Data Test
run: |
docker run -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE alpine /bin/sh -c "apk add make gcc g++ cmake py3-pip && cd $GITHUB_WORKSPACE/cpp_package/examples/get_data && mkdir build && cd build && cmake -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/installed .. && make -j"
docker run -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE alpine:3.18.5 /bin/sh -c "apk add make gcc g++ cmake py3-pip && cd $GITHUB_WORKSPACE/cpp_package/examples/get_data && mkdir build && cd build && cmake -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/installed .. && make -j"
- name: Run WIFI Shield Test
run: |
docker run -e LD_LIBRARY_PATH=$LD_LIBRARY_PATH -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE alpine /bin/sh -c "apk add make gcc g++ cmake py3-pip && cd $GITHUB_WORKSPACE/emulator && python3 -m pip install . && python3 $GITHUB_WORKSPACE/emulator/brainflow_emulator/wifi_shield_emulator.py $GITHUB_WORKSPACE/cpp_package/examples/get_data/build/brainflow_get_data --board-id 4 --ip-address 127.0.0.1 --ip-port 17982"
docker run -e LD_LIBRARY_PATH=$LD_LIBRARY_PATH -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE alpine:3.18.5 /bin/sh -c "apk add make gcc g++ cmake py3-pip && cd $GITHUB_WORKSPACE/emulator && python3 -m pip install . && python3 $GITHUB_WORKSPACE/emulator/brainflow_emulator/wifi_shield_emulator.py $GITHUB_WORKSPACE/cpp_package/examples/get_data/build/brainflow_get_data --board-id 4 --ip-address 127.0.0.1 --ip-port 17982"
env:
LD_LIBRARY_PATH: ${{ github.workspace }}/installed/lib
- name: Run WIFI Shield Test
run: |
docker run -e LD_LIBRARY_PATH=$LD_LIBRARY_PATH -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE alpine /bin/sh -c "apk add make gcc g++ cmake py3-pip && cd $GITHUB_WORKSPACE/emulator && python3 -m pip install . && python3 $GITHUB_WORKSPACE/emulator/brainflow_emulator/wifi_shield_emulator.py $GITHUB_WORKSPACE/cpp_package/examples/get_data/build/brainflow_get_data --board-id 5 --ip-address 127.0.0.1 --ip-port 17983"
docker run -e LD_LIBRARY_PATH=$LD_LIBRARY_PATH -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE alpine:3.18.5 /bin/sh -c "apk add make gcc g++ cmake py3-pip && cd $GITHUB_WORKSPACE/emulator && python3 -m pip install . && python3 $GITHUB_WORKSPACE/emulator/brainflow_emulator/wifi_shield_emulator.py $GITHUB_WORKSPACE/cpp_package/examples/get_data/build/brainflow_get_data --board-id 5 --ip-address 127.0.0.1 --ip-port 17983"
env:
LD_LIBRARY_PATH: ${{ github.workspace }}/installed/lib
- name: Run WIFI Shield Test Markers
run: |
docker run -e LD_LIBRARY_PATH=$LD_LIBRARY_PATH -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE alpine /bin/sh -c "apk add make gcc g++ cmake py3-pip && cd $GITHUB_WORKSPACE/emulator && python3 -m pip install . && python3 $GITHUB_WORKSPACE/emulator/brainflow_emulator/wifi_shield_emulator.py $GITHUB_WORKSPACE/cpp_package/examples/get_data/build/markers --board-id 6 --ip-address 127.0.0.1 --ip-port 17984"
docker run -e LD_LIBRARY_PATH=$LD_LIBRARY_PATH -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE alpine:3.18.5 /bin/sh -c "apk add make gcc g++ cmake py3-pip && cd $GITHUB_WORKSPACE/emulator && python3 -m pip install . && python3 $GITHUB_WORKSPACE/emulator/brainflow_emulator/wifi_shield_emulator.py $GITHUB_WORKSPACE/cpp_package/examples/get_data/build/markers --board-id 6 --ip-address 127.0.0.1 --ip-port 17984"
env:
LD_LIBRARY_PATH: ${{ github.workspace }}/installed/lib
61 changes: 54 additions & 7 deletions emulator/brainflow_emulator/galea_manual_v4.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class State(enum.Enum):
class Message(enum.Enum):
start_stream = b'b'
stop_stream = b's'
ack_values = (b'd', b'~6', b'~5', b'o', b'F0')
ack_values = (b'd', b'~6', b'~5', b'~4', b'o', b'F0')
ack_from_device = b'A'
time_calc_command = b'F4444444'

Expand All @@ -25,14 +25,19 @@ def __init__(self):
self.local_ip = '127.0.0.1'
self.local_port = 2390
self.server_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
self.server_socket.settimeout(
0.1) # decreases sampling rate significantly because it will wait for recv 0.1 sec but it's just a test
self.server_socket.bind((self.local_ip, self.local_port))
self.state = State.wait.value
self.addr = None
self.package_num = 0
self.transaction_size = 12
self.package_size = 114
self.server_socket.settimeout(.0001)
self.channel_on_off = [1] * 24
self.channel_identifiers = [
'1', '2', '3', '4', '5', '6', '7', '8',
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
'A', 'S', 'D', 'G', 'H', 'J', 'K', 'L'
]

def run(self):
start_time = time.time()
Expand All @@ -43,8 +48,14 @@ def run(self):
self.state = State.stream.value
elif msg == Message.stop_stream.value:
self.state = State.wait.value
elif msg.decode('utf-8').startswith('~'):
self.server_socket.sendto(Message.ack_from_device.value, self.addr)
self.process_sampling_rate(msg.decode('utf-8'))
elif msg in Message.ack_values.value or msg.decode('utf-8').startswith('x'):
self.server_socket.sendto(Message.ack_from_device.value, self.addr)
self.process_channel_on_off(msg.decode('utf-8'))
elif msg in Message.ack_values.value or msg.decode('utf-8').startswith('z'):
self.server_socket.sendto(Message.ack_from_device.value, self.addr)
elif msg == Message.time_calc_command.value:
cur_time = time.time()
resp = bytearray(struct.pack('d', (cur_time - start_time) * 1000))
Expand All @@ -58,15 +69,28 @@ def run(self):

if self.state == State.stream.value:
transaction = list()
for _ in range(self.transaction_size):
for t in range(self.transaction_size):
single_package = list()
channel = 0
for i in range(self.package_size):
single_package.append(random.randint(0, 255))
if (i > 4 and i < 77):
sample = i - 4
if (sample % 3 == 1):
channel += 1
if (self.channel_on_off[channel - 1] == 1):
if (sample % 3 == 2):
single_package.append(random.randint(0, 8 + (channel * 2)))
else:
single_package.append(0)
else:
single_package.append(0)
else:
single_package.append(random.randint(0, 255))
single_package[0] = self.package_num

cur_time = time.time()
timestamp = bytearray(struct.pack('d', (cur_time - start_time) * 1000))
eda = bytearray(struct.pack('f', random.random()))
eda = bytearray(struct.pack('f', .5))
ppg_red = bytearray(struct.pack('i', int(random.random() * 5000)))
ppg_ir = bytearray(struct.pack('i', int(random.random() * 5000)))

Expand All @@ -91,7 +115,30 @@ def run(self):
self.server_socket.sendto(bytes(package), self.addr)
except socket.timeout:
logging.info('timeout for send')

time.sleep(0.001)


def process_channel_on_off(self, msg):
if msg.startswith('x'):
for channel_id in self.channel_identifiers:
channel_num = self.channel_identifiers.index(channel_id)
if (msg[1] == channel_id):
if (msg[2] == '0'): # 0 is off (or Power Down), 1 is on
self.channel_on_off[channel_num] = 1
logging.info('channel '+ str(channel_num + 1) + ' is on')
else:
self.channel_on_off[channel_num] = 0
logging.info('channel ' + str(channel_num + 1) + ' is off')

def process_sampling_rate(self, msg):
if (msg[1] == '6'):
logging.info('sampling rate is 250Hz')
elif (msg[1] == '5'):
logging.info('sampling rate is 500Hz')
elif (msg[1] == '4'):
logging.info('sampling rate is 1000Hz')
else:
logging.warning(f'did not recognize sampling rate command: {msg}')

def main():
emulator = GaleaEmulator()
Expand Down

0 comments on commit cc833cf

Please sign in to comment.