void signalingWriteOutput(int eventType) { if (sigData.ledPort1) { if (sig_pattern[eventType][sigData.patPos]) { pwmDigitalHi(sigData.ledPort1); } else { pwmDigitalLo(sigData.ledPort1); } } if (sigData.ledPort2) { if (sig_pattern[eventType][sigData.patPos + sigData.patLen]) { pwmDigitalHi(sigData.ledPort2); } else { pwmDigitalLo(sigData.ledPort2); } } if (sigData.beeperPort) { if (sigData.beeperType) { // speaker *sigData.beeperPort->ccr = sig_pattern[eventType][sigData.patPos + sigData.patLen * 2] * SIG_SPEAKER_PULSE_LEN; } else { // buzzer if (sig_pattern[eventType][sigData.patPos + sigData.patLen * 2]) { pwmDigitalHi(sigData.beeperPort); } else { pwmDigitalLo(sigData.beeperPort); } } } if (sigData.pwmPort) { *sigData.pwmPort->ccr = sig_pattern[eventType][sigData.patLen * 3]; } }
void pwmDigitalToggle(pwmPortStruct_t *p) { if (pwmDigitalGet(p)) { pwmDigitalLo(p); } else { pwmDigitalHi(p); } }
// warning: this is a blocking event, only call it when not flying or from a non-critical process void signalingBeep(unsigned long hz, unsigned long ms) { if (sigData.beeperPort && ms) { // using a piezo speaker if (sigData.beeperType) { *sigData.beeperPort->ccr = SIG_SPEAKER_PULSE_LEN; delay(ms); *sigData.beeperPort->ccr = 0; } // piezo buzzer with its own oscillator, or LED else { pwmDigitalHi(sigData.beeperPort); delay(ms); pwmDigitalLo(sigData.beeperPort); } } }
pwmPortStruct_t *pwmInitDigitalOut(uint8_t pwmPort) { pwmPortStruct_t *p = 0; if (pwmValidatePort(pwmPort, 0)) { p = &pwmData[pwmPort]; p->direction = PWM_OUTPUT; p->pin = pwmPins[pwmPort]; p->port = (GPIO_TypeDef *)pwmPorts[pwmPort]; pwmDigitalLo(p); pwmGPIOInit(pwmPorts[pwmPort], pwmPins[pwmPort], GPIO_Mode_OUT); } return p; }