예제 #1
0
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;
	    }
}
예제 #3
0
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;
			}
		}
	}

}
예제 #4
0
void send_message(uint8_t mes){
	FIFO_PUSH(control_events, mes);
}
예제 #5
0
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;
		}
	}
}