Esempio n. 1
0
void tick(const uint8_t tick_type) {
    if(tick_type & TICK_TASK_TYPE_MESSAGE) {
        if(PIN_OVER_CURRENT.pio->PIO_PDSR & PIN_OVER_CURRENT.mask) {
            BC->over_current = false;
        } else {
            if(!BC->over_current) {
                logbli("Over Current");
                BC->over_current = true;

                StandardMessage sm;
                BA->com_make_default_header(&sm, BS->uid, sizeof(StandardMessage), FID_OVER_CURRENT);

                BA->send_blocking_with_timeout(&sm,
                                               sizeof(StandardMessage),
                                               *BA->com_current);
            }
        }
    }

    simple_tick(tick_type);
}
void tick(const uint8_t tick_type) {
	if(tick_type & TICK_TASK_TYPE_CALCULATION) {
		if(!(BC->pin_alert->pio->PIO_PDSR & BC->pin_alert->mask)) {
			if(BA->mutex_take(*BA->mutex_twi_bricklet, 10)) {
				if(BC->gain_muldiv[1] != 0) {
					BC->value[SIMPLE_UNIT_CURRENT] = (ina226_read_register(INA226_REG_CURRENT)*CURRENT_40OHM_MUL/CURRENT_40OHM_DIV)*BC->gain_muldiv[0]/BC->gain_muldiv[1];
				} else {
					BC->value[SIMPLE_UNIT_CURRENT] = ina226_read_register(INA226_REG_CURRENT);
				}
				BC->value[SIMPLE_UNIT_VOLTAGE] = ina226_read_register(INA226_REG_BUS_VOLTAGE)*VOLTAGE_MUL/VOLTAGE_DIV;

				// clear alert pin
				ina226_read_mask();
				BA->mutex_give(*BA->mutex_twi_bricklet);

				BC->value[SIMPLE_UNIT_POWER]   = BC->value[SIMPLE_UNIT_CURRENT]*BC->value[SIMPLE_UNIT_VOLTAGE]/1000;
			}
		}
	}

	simple_tick(tick_type);
}
void tick(const uint8_t tick_type) {
	simple_tick(tick_type);
}
void tick(const uint8_t tick_type) {
    if(tick_type & TICK_TASK_TYPE_CALCULATION) {
        BC->tick_counter++;
        if(BC->tick_counter > 60000/10) {
            BC->tick_counter = 0;
            for(uint8_t i = 0; i < BEAT_INTERVALS_SIZE; i++) {
                BC->beat_intervals[i] = 0;
            }
            BC->beat_intervals_filled = false;
            BC->value[SIMPLE_UNIT_HEART_RATE] = 0;
        }
        
        if(PIN_SIGNAL.pio->PIO_PDSR & PIN_SIGNAL.mask) {
            // Debounce mechanism after high was detected
            if (BC->tick_counter < BC->debounce_high/REDUCE_DEBOUNCE) {
                simple_tick(tick_type);
                return;
            }
            if(!(BC->previous_signal_state)) {
                BC->beat_state_changed = 1;
                BC->beat_state = 1;
                
                BC->last_high_at = BC->tick_counter;
                if(BC->beat_intervals_iterator == BEAT_INTERVALS_SIZE) {
                    BC->beat_intervals_iterator = 0;
                    BC->beat_intervals_filled = true;
                }
                BC->beat_intervals[BC->beat_intervals_iterator] = BC->tick_counter;
                if(BC->last_low_at != 0) {
                    BC->debounce_low_times[BC->beat_intervals_iterator] = BC->tick_counter - BC->last_low_at; // current detected low time
                }
                else {
                    BC->debounce_low_times[BC->beat_intervals_iterator] = BC->debounce_low;
                }
                BC->tick_counter = 0;
                
                if(BC->beat_intervals_iterator >= 0 && BC->beat_intervals_iterator < 8) {
                    if(BC->beat_intervals_filled) {
                        uint32_t sum = 0;
                        uint32_t sum_debounce_low = 0;
                        for(uint8_t i = 0; i < BEAT_INTERVALS_SIZE; i++) {
                            sum += BC->beat_intervals[i];
                            sum_debounce_low += BC->debounce_low_times[i];
                        }
                        BC->value[SIMPLE_UNIT_HEART_RATE] = (BEAT_INTERVALS_SIZE*60000)/sum;
                        BC->debounce_low = BETWEEN(MIN_DEBOUNCE, sum_debounce_low/BEAT_INTERVALS_SIZE, MAX_DEBOUNCE);
                    }
                    else {
                        uint32_t sum = 0;
                        uint32_t sum_debounce_low = 0;
                        for(uint8_t i = 0; i < BC->beat_intervals_iterator+1; i++) {
                            sum += BC->beat_intervals[i];
                            sum_debounce_low += BC->debounce_low_times[i];
                        }
                        BC->value[SIMPLE_UNIT_HEART_RATE] = ((BC->beat_intervals_iterator+1)*60000)/sum;
                        BC->debounce_low = BETWEEN(MIN_DEBOUNCE, sum_debounce_low/(BC->beat_intervals_iterator+1), MAX_DEBOUNCE);
                    }
                    BC->beat_intervals_iterator ++;
                }
                BC->previous_signal_state = true;
            }
        }
        if(!(PIN_SIGNAL.pio->PIO_PDSR & PIN_SIGNAL.mask)) {
            // Debounce mechanism after low was detected
            if (BC->tick_counter < BC->debounce_low/REDUCE_DEBOUNCE) {
                simple_tick(tick_type);
                return;
            }
            if(BC->previous_signal_state) {
                BC->beat_state_changed = 1;
                BC->beat_state = 0;
                
                BC->last_low_at = BC->tick_counter;
                if(BC->debounce_high_iterator == DEBOUNCE_HIGH_TIMES_SIZE) {
                    BC->debounce_high_iterator = 0;
                    BC->debounce_high_filled = true;
                }
                BC->debounce_high_times[BC->debounce_high_iterator] = BC->tick_counter; //current detected high time
                if(BC->debounce_high_iterator >= 0 && BC->debounce_high_iterator < DEBOUNCE_HIGH_TIMES_SIZE) {
                    if(BC->debounce_high_filled) {
                        uint32_t sum_debounce_high = 0;
                        for(uint8_t i = 0; i < DEBOUNCE_HIGH_TIMES_SIZE; i++) {
                            sum_debounce_high += BC->debounce_high_times[i];
                        }
                        BC->debounce_high = BETWEEN(MIN_DEBOUNCE, sum_debounce_high/DEBOUNCE_HIGH_TIMES_SIZE, MAX_DEBOUNCE);
                    }
                    else {
                        uint32_t sum_debounce_high = 0;
                        for(uint8_t i = 0; i < BC->debounce_high_iterator+1; i++) {
                            sum_debounce_high += BC->debounce_high_times[i];
                        }
                        BC->debounce_high = BETWEEN(MIN_DEBOUNCE, sum_debounce_high/BC->debounce_high_iterator+1, MAX_DEBOUNCE);
                    }
                    BC->debounce_high_iterator ++;
                }
                BC->previous_signal_state = false;
            }
        }
    }
    if(tick_type & TICK_TASK_TYPE_MESSAGE) {
		if(BC->beat_state_changed_callback_enabled) {
			if(BC->beat_state_changed) {
                BC->beat_state_changed = 0;
                send_beat_state_changed_callback();
            }
		}
	}
    simple_tick(tick_type);
}
void tick(const uint8_t tick_type) {
	if(tick_type & TICK_TASK_TYPE_CALCULATION) {
		if(BC->next_measurement_state_counter > 0) {
			BC->next_measurement_state_counter--;
		} else {
			switch(BC->measurement_state) {
				case MS_DISABLED: {
					new_velocity_value(0);
					new_distance_value(0);
					if(BC->update_mode) {
						BC->measurement_state = MS_UPDATE_MODE;
					} else if(BC->laser_enabled) {
						BC->measurement_state = MS_START_ACQUISITION;
					}

					break;
				}

				case MS_UPDATE_MODE: {
					if(BC->new_mode == 0) {
						uint8_t data = 0;
						if(lidar_write_register(REG_AQUISATION_MODE_CONTROL, 1, &data)) {
							BC->update_mode = false;
							if(BC->laser_enabled) {
								BC->measurement_state = MS_START_ACQUISITION;
							} else {
								BC->measurement_state = MS_DISABLED;
							};
						}
					} else {
						uint8_t velocity_resoluition_value = 0xC8;
						switch(BC->new_mode) {
							case 1: velocity_resoluition_value = 0xC8; break;
							case 2: velocity_resoluition_value = 0x50; break;
							case 3: velocity_resoluition_value = 0x28; break;
							case 4: velocity_resoluition_value = 0x14; break;
						}

						if(lidar_write_register(REG_VELOCITY_RESOLUTION, 1, &velocity_resoluition_value)) {
							BC->update_mode = false;
							if(BC->laser_enabled) {
								BC->measurement_state = MS_START_ACQUISITION;
							} else {
								BC->measurement_state = MS_DISABLED;
							}
						}
					}

					break;
				}

				case MS_START_ACQUISITION: {
					if(BC->update_mode) {
						BC->measurement_state = MS_UPDATE_MODE;
					} else if(!BC->laser_enabled) {
						BC->measurement_state = MS_DISABLED;
					} else {
						const uint8_t data = 0x04; // Take acquisition & correlation processing with DC correction
						if(lidar_write_register(REG_CONTROL, 1, &data)) {
							if(BC->new_mode == 0) {
								BC->measurement_state = MS_READ_DISTANCE;
							} else {
								BC->measurement_state = MS_TAKE_VELOCITY_MEASUREMENT;
							}
						}
					}

					break;
				}

				case MS_READ_DISTANCE: {
					uint8_t data[2];
					if(lidar_read_register(REG_DISTANCE, 2, data)) {
						const uint16_t distance = (data[0] << 8) | data[1];
						if((distance & (1 << 15)) != (1 << 15)) { // If the MSB is 1 then the reading is not considered valid
							new_distance_value(distance);
							new_velocity_value(0);
						}
						BC->measurement_state = MS_START_ACQUISITION;
					}

					break;
				}

				case MS_TAKE_VELOCITY_MEASUREMENT: {
					const uint8_t data = 0x80; // Take velocity measurement
					if(lidar_write_register(REG_AQUISATION_MODE_CONTROL, 1, &data)) {
						BC->measurement_state = MS_READ_VELOCITY;
					}

					break;
				}

				case MS_READ_VELOCITY: {
					int8_t velocity;
					if(lidar_read_register(REG_VELOCITY_MEASUREMENT, 1, (uint8_t *)&velocity)) {
						new_velocity_value(velocity);
						new_distance_value(0);
						BC->measurement_state = MS_START_ACQUISITION;
					}

					break;
				}

				default: {
					BC->measurement_state = MS_START_ACQUISITION;

					break;
				}
			}
		}
	}

	simple_tick(tick_type);
}