Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void ICACHE_RAM_ATTR CrowAlarmPanelStore::interrupt(CrowAlarmPanelStore *arg) {
- bool data_bit = arg->data_pin_->digital_read();
- arg->buffer.push_back(data_bit);
- std::vector<bool> last8(arg->buffer.end() - 8, arg->buffer.end());
- if (byte_from_binary(last8) == BOUNDARY) {
- // Found right boundary?
- if (arg->inside_) {
- if (arg->buffer.size() % 8 == 0) { // Ignore data that is not solid bytes
- CrowAlarmPanelMessage message;
- std::vector<uint8_t> bytes;
- std::vector<bool> type_bits(arg->buffer.begin() + 8, arg->buffer.begin() + 16);
- message.type = byte_from_binary(type_bits, true);
- for (uint8_t i = 16; i < arg->buffer.size() - 8; i += 8) {
- std::vector<bool> bits(arg->buffer.begin() + i, arg->buffer.begin() + i + 8);
- uint8_t byte = byte_from_binary(bits, true);
- bytes.push_back(byte);
- }
- message.data = bytes;
- arg->messages.push_back(std::move(message));
- }
- arg->buffer.clear();
- }
- arg->inside_ = !arg->inside_;
- } else if (!arg->inside_ && arg->buffer.size() >= 8) {
- arg->buffer.pop_front();
- }
- // Wrong side of boundary?
- if (arg->inside_ && arg->buffer.size() > 200) {
- arg->inside_ = false;
- ESP_LOGD(TAG, "Wrong side of boundary");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement