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();
- // Check for boundary
- arg->boundary_buffer_ = (uint8_t)((arg->boundary_buffer_ << 1) | data_bit);
- uint8_t idx = arg->num_bits / 8;
- if (arg->inside_) {
- arg->buffer[idx] = (arg->buffer[idx] >> 1) | ((data_bit ? 1 : 0) << 7);
- arg->num_bits++;
- if (arg->boundary_buffer_ == BOUNDARY) {
- arg->message.type = arg->buffer[0];
- memcpy(arg->message.data_buffer, arg->buffer + 1, idx - 1);
- arg->message.data_len = idx - 1;
- arg->message_available = true;
- arg->inside_ = false;
- arg->num_bits = 0;
- }
- return;
- }
- if (arg->boundary_buffer_ == BOUNDARY) {
- arg->inside_ = true;
- }
- if (arg->inside_ && arg->num_bits > 200) {
- // Wrong side of boundary.
- arg->inside_ = false;
- arg->num_bits = 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement