diff --git a/.github/workflows/run_alpine.yml b/.github/workflows/run_alpine.yml index c9b8b3857..6c5342a79 100644 --- a/.github/workflows/run_alpine.yml +++ b/.github/workflows/run_alpine.yml @@ -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 diff --git a/emulator/brainflow_emulator/galea_manual_v4.py b/emulator/brainflow_emulator/galea_manual_v4.py index 06fb6b24e..810676f0c 100644 --- a/emulator/brainflow_emulator/galea_manual_v4.py +++ b/emulator/brainflow_emulator/galea_manual_v4.py @@ -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' @@ -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() @@ -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)) @@ -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))) @@ -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()