Library for DMX and MIDI protocol
Dependents: Arts_DMX512_carteV3_MIDI Arts_DMX512_carteV3_MIDI_nRF
Diff: projecteurs.cpp
- Revision:
- 0:9cf6898e6b66
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/projecteurs.cpp Sun Dec 12 12:41:49 2021 +0000 @@ -0,0 +1,138 @@ +/****************************************************************************/ +/* DMX_MIDI module library */ +/****************************************************************************/ +/* LEnsE / Julien VILLEMEJANE / Institut d'Optique Graduate School */ +/****************************************************************************/ +/* Library - projecteurs.cpp file */ +/* Spots are defined as follow : */ +/* * ADR (uint_16) : DMX first address */ +/* * TYPE (char) : (L)yre, (S)canner, (P)ar, (R)gbawu, Stro(B)e */ +/* * ID (char) : unique identifier of the spot */ +/* * GROUP(char) : group of the spots */ +/* */ +/* * DIM (char) : channel used for DIMMER - 0 if not used */ +/* */ +/* * RED (char) : channel used for RED color - 0 if not used */ +/* * GRN (char) : channel used for GREEN color - 0 if not used */ +/* * BLU (char) : channel used for BLUE color - 0 if not used */ +/* * WHT (char) : channel used for WHITE color - 0 if not used */ +/* * AMB (char) : channel used for AMBER color - 0 if not used */ +/* * UV (char) : channel used for UV color - 0 if not used */ +/* */ +/* * PAN (char) : channel used for PAN moves - 0 if not used */ +/* * TIL (char) : channel used for TILT moves - 0 if not used */ +/* * SPD (char) : channel used for SPEED setup - 0 if not used */ +/* * STB (char) : channel used for STROBE function- 0 if not used */ +/* */ +/****************************************************************************/ +/* Tested on Nucleo-L476RG / 16th nov 2021 */ +/****************************************************************************/ + +#include "projecteurs.h" +#include "controleurs.h" + +/* Global Variables */ +char projecteurs[PROJ_NB_TOTAL][DMX_PROJ_NB_DATA]; +int groups[MIDI_NOTES_GROUPS]; + + +/* Functions */ +/* initialisation of spots */ +void initProjectors(void){ + for(int k = 0; k < MIDI_NOTES_GROUPS; k++){ + groups[k] = 0; + } + for(int j = 0; j < PROJ_NB_TOTAL; j++){ + for(int i = 0; i < DMX_PROJ_NB_DATA; i++){ + projecteurs[j][i] = 0; + } + } + + /* LED PARTY Eurolite */ + projecteurs[0][DMX_PROJ_ADR] = 0; + projecteurs[0][DMX_PROJ_ADR + 1] = 1; + projecteurs[0][DMX_PROJ_TYPE] = 'R'; + projecteurs[0][DMX_PROJ_ID] = 1; + projecteurs[0][DMX_PROJ_GROUP] = 1; + projecteurs[0][DMX_PROJ_DIM] = 5; + projecteurs[0][DMX_PROJ_RED] = 1; + projecteurs[0][DMX_PROJ_GRN] = 2; + projecteurs[0][DMX_PROJ_BLU] = 3; + projecteurs[0][DMX_PROJ_WHT] = 4; + projecteurs[0][DMX_PROJ_STB] = 6; + groups[1] = 0b1; + /* LED PARTY Eurolite */ + projecteurs[1][DMX_PROJ_ADR] = 0; + projecteurs[1][DMX_PROJ_ADR + 1] = 9; + projecteurs[1][DMX_PROJ_TYPE] = 'R'; + projecteurs[1][DMX_PROJ_ID] = 2; + projecteurs[1][DMX_PROJ_GROUP] = 2; + projecteurs[1][DMX_PROJ_DIM] = 5; + projecteurs[1][DMX_PROJ_RED] = 1; + projecteurs[1][DMX_PROJ_GRN] = 2; + projecteurs[1][DMX_PROJ_BLU] = 3; + projecteurs[1][DMX_PROJ_WHT] = 4; + projecteurs[1][DMX_PROJ_STB] = 6; + groups[2] = 0b10; +} + +/* get adress of a spot with number */ +uint16_t getProjAddress(char num){ return ((projecteurs[num][DMX_PROJ_ADR] << 8) + projecteurs[num][DMX_PROJ_ADR + 1]); } +/* get channel of green of a spot with number */ +char getProjGroup(char num){ return projecteurs[num][DMX_PROJ_GROUP]; } +/* get channel of dimmer of a spot with number */ +char getProjDimmer(char num){ return projecteurs[num][DMX_PROJ_DIM]; } +/* get channel of red of a spot with number */ +char getProjRed(char num){ return projecteurs[num][DMX_PROJ_RED]; } +/* get channel of blue of a spot with number */ +char getProjBlue(char num){ return projecteurs[num][DMX_PROJ_BLU]; } +/* get channel of green of a spot with number */ +char getProjGreen(char num){ return projecteurs[num][DMX_PROJ_GRN]; } + +/* update spots with MIDI notes */ // TO TEST AND FINISH + TEST TIMING +void updateProjFromMidi(char note){ + // Finding Note and Light to update + for(int grp = 0; grp < MIDI_NOTES_GROUPS; grp++){ + char ctl_M = notes[note][grp][MIDI_CTL_CTL_M]; + char ctl_L = notes[note][grp][MIDI_CTL_CTL_L]; + + if((ctl_M != 0) || (ctl_L != 0)){ + int spots = groups[grp]; + if(spots != 0){ + // get lights to update + for(int spot = 0; spot < PROJ_NB_TOTAL; spot++){ + if((spots & 1) == 1){ + updateProj(spot, note, grp, ctl_M, ctl_L); + } + spots = spots >> 1; + } + } + } + } +} + +/* update a spot */ // TO TEST AND FINISH + TEST TIMING +void updateProj(char num, char note, char grp, char ctl_M, char ctl_L){ + char add = getProjAddress(num); + + // Dimmer + if((ctl_M & MIDI_CTL_DIM_MASK) == MIDI_CTL_DIM_MASK ) + dmx_data[getProjDimmer(num)+add-2] = notes[note][grp][MIDI_CTL_DIM]; + else + dmx_data[getProjDimmer(num)+add-2] = 0; + // Red + if((ctl_M & MIDI_CTL_RED_MASK) == MIDI_CTL_RED_MASK ) + dmx_data[getProjRed(num)+add-2] = notes[note][grp][MIDI_CTL_RED]; + else + dmx_data[getProjRed(num)+add-2] = 0; + // Blue + if((ctl_M & MIDI_CTL_BLUE_MASK) == MIDI_CTL_BLUE_MASK ) + dmx_data[getProjBlue(num)+add-2] = notes[note][grp][MIDI_CTL_BLUE]; + else + dmx_data[getProjBlue(num)+add-2] = 0; + // Green + if((ctl_M & MIDI_CTL_GREEN_MASK) == MIDI_CTL_GREEN_MASK ) + dmx_data[getProjGreen(num)+add-2] = notes[note][grp][MIDI_CTL_GREEN]; + else + dmx_data[getProjGreen(num)+add-2] = 0; +} \ No newline at end of file