Library for DMX and MIDI protocol

Dependents:   Arts_DMX512_carteV3_MIDI Arts_DMX512_carteV3_MIDI_nRF

projecteurs.cpp

Committer:
villemejane
Date:
2021-12-12
Revision:
0:9cf6898e6b66

File content as of revision 0:9cf6898e6b66:

/****************************************************************************/
/*  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;    
}