void espUartTx(u08 Cmd, u08* Value, u08 Len){ if espModuleIsNot() //Нет модуля, ничего не делаем return; while(FIFO_SPACE(espTxBuf) < (Len+6)){ //Ждем пока буфер не освободится TaskManager(); if espModuleIsNot(){ //Не удалось определить наличие модуля return; } } u08 FlagInt = SREG & SREG_I; cli(); //Формируется пакет FIFO_PUSH(espTxBuf, CMD_CLCK_PILOT1); FIFO_PUSH(espTxBuf, CMD_CLCK_PILOT2); FIFO_PUSH(espTxBuf, CMD_CLCK_PILOT1); FIFO_PUSH(espTxBuf, CMD_CLCK_PILOT2); FIFO_PUSH(espTxBuf, Len); while(Len){ FIFO_PUSH(espTxBuf, *Value++); Len--; } FIFO_PUSH(espTxBuf, Cmd); epsTxStart(); if (FlagInt) sei(); espAttemptLinkSet(); SetTimerTask(espTimeoutError, ESP_ERR_TIMEOUT); //Таймаут ответа от модуля }
void usb_midi_DataSend(uint8_t* Buf, uint32_t Len) { uint32_t packedge; uint32_t len=Len>>2; for(uint32_t i=0; i<len; i++){ packedge=*(uint32_t*)Buf; FIFO_PUSH(USB_midi_packets_in, packedge); Buf+=4; } }
void read_buttons_state(void) { static uint8_t button_number; //Number of current button; uint16_t IDR_tmp; encoder_speed_tick(); switch (buttons_read_status) { case read_buttons: if (!hd44780_active) { //If display is writing we do not read buttons to avoid pins conflict. buttons_active = 1; //Set to prevent display usage in this moment. The display should wait buttons_active = 0; GPIOE->ODR |= 0x00FF; //High level on PE0-7; GPIOE->MODER &= 0xFFFF0000; //PE0-7 Will be Input button_ports[buttons_chunk].port->BSRRH = button_ports[buttons_chunk].pin; buttons_delay(); buttons = ~GPIOE->IDR; //Read buttons state button_ports[buttons_chunk].port->BSRRL = button_ports[buttons_chunk].pin; GPIOE->MODER |= 0x00005555; //PE0-7 Will be Output GPIOE->ODR |= 0x00FF; //High level on PD0-7; controlLEDs_switch(); buttons_read_status = check_button; buttons_active = 0; break; } else { buttons_read_status = read_encoders; break; } case check_button: button_number = buttons_chunk * 8 + button_counter; if (buttons & button_positions[button_counter]) { if (buttons_state[button_number].value < BUTTON_MAX_STATE) { buttons_state[button_number].value++; } else if (!buttons_state[button_number].pressed) { FIFO_PUSH(control_events, button_number); buttons_state[button_number].pressed = 1; //send pressed } } else { if (buttons_state[button_number].value > 0) { buttons_state[button_number].value--; } else if (buttons_state[button_number].pressed) { FIFO_PUSH(control_events, 0x80|button_number); buttons_state[button_number].pressed = 0; //send depressed } } button_counter++; if (button_counter > 7) { button_counter = 0; buttons_read_status = next_buttons_chunk; } break; case next_buttons_chunk: buttons_chunk++; if (buttons_chunk > 2) { buttons_chunk = 0; buttons_read_status = read_encoders; } else { buttons_read_status = read_buttons; } break; case read_encoders: /*Read both encoder signals from the same port because ENCODER1_PORT=ENCODER2_PORT =GPIOD*/ IDR_tmp = (uint8_t)( (ENCODER1_PORT->IDR & ENCODER1_PIN) | (ENCODER2_PORT->IDR & ENCODER2_PIN)); if (IDR_tmp == encoder_state) { //State is not changed buttons_read_status = read_buttons; break; } else { if (IDR_tmp == 0) { encoder_zero = 1; encoder_state = 0; buttons_read_status = read_buttons; break; } else if (IDR_tmp == 3) { // This means the encoder is in unstable average position because it is turned. if (encoder_zero) { if (encoder_state == 1) { //Direction depends previous state encoder_state = 3; switch (encoder_speed_measure()){ case ENCODER_SLOW: FIFO_PUSH(control_events, ENCODER_LEFT1); break; case ENCODER_AVERAGE: FIFO_PUSH(control_events, ENCODER_LEFT2); break; case ENCODER_FAST: FIFO_PUSH(control_events, ENCODER_LEFT3); break; } buttons_read_status = read_buttons; encoder_zero = 0; break; } else if (encoder_state == 2) { encoder_state = 3; switch (encoder_speed_measure()){ case ENCODER_SLOW: FIFO_PUSH(control_events, ENCODER_RIGHT1); break; case ENCODER_AVERAGE: FIFO_PUSH(control_events, ENCODER_RIGHT2); break; case ENCODER_FAST: FIFO_PUSH(control_events, ENCODER_RIGHT3); break; } buttons_read_status = read_buttons; encoder_zero = 0; break; } encoder_speed_counter = 0; } else { encoder_state = IDR_tmp; buttons_read_status = read_buttons; break; } } else { encoder_state = IDR_tmp; buttons_read_status = read_buttons; break; } } } }
void send_message(uint8_t mes){ FIFO_PUSH(control_events, mes); }
static void slider_FIFO_send(uint8_t num, uint16_t value, Slider_type* sliders, Calibration_slider_type* sliders_calibr) { double a,b; int midi_value; double max_in = sliders_calibr->max_in_value; double min_in = sliders_calibr->min_in_value; double length = max_in - min_in; min_in = min_in + length / 100 * (double)(sliders_calibr->gap); max_in = max_in - length / 100 * (double)(sliders_calibr->gap); length = max_in - min_in; //pitch band has a dead zone and 14-bit precision if (num == SLIDER_PITCH) { double dead = (double)sliders_calibr->dead / 100 * length; a = (double) (sliders->max_out_value - sliders->min_out_value) / (double) (length - dead); double middle_in = (double)(max_in + min_in) / 2; double middle_out = (double)(sliders->max_out_value + sliders->min_out_value) / 2; //alpha is the point when the dead zone begins double alpha = middle_in - dead/2; //pitch potentiometer is inverted value = max_in - value + min_in; //the in-out function is piecewise linear if (value < alpha) { midi_value = (int)(a * value - min_in * a + sliders->min_out_value); } else if (value < alpha + dead) { midi_value = (middle_out - (int) middle_out) > 0 ? (int) (middle_out + 1) : (int) middle_out; } else { midi_value = (int)(a * value - (alpha + dead) * a + middle_out); } } else { a = (double) (sliders->max_out_value - sliders->min_out_value) / length; if (sliders->reverse) { a = -a; b = (double)(sliders->max_out_value) - min_in * a; } else { b = (double)(sliders->min_out_value) - min_in * a; } midi_value = (int)(a * value + b); } if (sliders->binary) { double middle = (double)(sliders->max_out_value + sliders->min_out_value) / 2; middle = (middle - (int) middle) > 0 ? (int) (middle + 1) : (int) middle; if (midi_value < middle) { midi_value = sliders->min_out_value; } else { midi_value = sliders->max_out_value; } } else { if (midi_value > sliders->max_out_value) { midi_value = sliders->max_out_value; } if (midi_value < sliders->min_out_value) { midi_value = sliders->min_out_value; } } if (num == SLIDER_PITCH) { uint16_t midi_value16 = (uint16_t)(midi_value); if (midi_value16 != pitch_old_value) { FIFO_PUSH(pitch_events, midi_value16); pitch_old_value = midi_value16; } } else { uint8_t midi_value8=(uint8_t)(midi_value); if (midi_value8 != sliders_old_values[num]) { FIFO_PUSH(sliders_events, (((uint16_t)(midi_value8))<<8)+num); sliders_old_values[num] = midi_value8; } } }