Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update Galea v4 emulator to control sampling rate #681

Merged
merged 9 commits into from
Dec 16, 2023
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
Loading