void mode_0(void) { uint8_t dmx_index = (uint8_t) 0; bool dmx_new_data = false; if (midi_get_active_sense_state() == MIDI_ACTIVE_SENSE_FAILED) { if (!midi_active_sense_failed) { dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, false); midi_active_sense_failed = true; } } else if (midi_active_sense_failed) { dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, true); midi_active_sense_failed = false; } if (midi_read_channel(midi_channel)) { if (midi_message->channel != 0 ) { // Channel messages switch (midi_message->type) { case MIDI_TYPES_NOTE_OFF: dmx_index = dmx_start_address + midi_message->data1; // MIDI Channel starts with 0, DMX address starts with 1 if (dmx_index <= DMX_UNIVERSE_SIZE) { // we skip SC dmx_data[dmx_index] = (uint8_t) 0; } dmx_new_data = true; break; case MIDI_TYPES_NOTE_ON: dmx_index = dmx_start_address + midi_message->data1; if (dmx_index <= DMX_UNIVERSE_SIZE) { // we skip SC uint8_t data = midi_message->data2 << 1; dmx_data[dmx_index] = data; } dmx_new_data = true; break; case MIDI_TYPES_CONTROL_CHANGE: { switch (midi_message->data1) { case MIDI_CONTROL_CHANGE_ALL_NOTES_OFF: clear_dmx_data(); dmx_new_data = true; break; default: break; } break; } default: break; } if (dmx_new_data) { dmx_set_send_data(dmx_data, 1 + dmx_max_slot); } } } }
/** * * Output Only Send DMX Packet Request (label = 6 \ref OUTPUT_ONLY_SEND_DMX_PACKET_REQUEST) * * This message requests the Widget to periodically send a DMX packet out of the Widget DMX port * at the configured DMX output rate. This message causes the widget to leave the DMX port direction * as output after each DMX packet is sent, so no DMX packets will be received as a result of this * request. * * The periodic DMX packet output will stop and the Widget DMX port direction will change to input * when the Widget receives any request message other than the Output Only Send DMX Packet * request, or the Get Widget Parameters request. * * @param data_length DMX data to send, beginning with the start code. */ void widget_send_dmx_packet_request_output_only(uint16_t data_length) { if (widget_send_rdm_packet_start != 0) { return; } monitor_line(MONITOR_LINE_INFO, "OUTPUT_ONLY_SEND_DMX_PACKET_REQUEST"); monitor_line(MONITOR_LINE_STATUS, NULL); dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, false); dmx_set_send_data(widget_data, data_length); dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, true); }
void mode_0_init(void) { clear_dmx_data(); midi_message = (const struct _midi_message *) midi_message_get(); midi_channel = bridge_params_get_midi_channel(); midi_active_sense_failed = (midi_get_active_sense_state() == MIDI_ACTIVE_SENSE_FAILED); dmx_start_address = bridge_params_get_dmx_start_address(); dmx_max_slot = (dmx_start_address + (uint16_t) 127) <= DMX_UNIVERSE_SIZE ? (dmx_start_address + (uint16_t) 127) : DMX_UNIVERSE_SIZE + (uint16_t) 1; // SC dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, false); dmx_set_send_data(dmx_data, 1 + dmx_max_slot); // SC + data dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, true); monitor_line(5, "Listening channel : %d %s", midi_channel, midi_channel == 0 ? "<OMNI>" : ""); monitor_line(6, "DMX start address : %d", dmx_start_address); monitor_line(7, "DMX slots : %d", dmx_max_slot); }