static void play_url_push_success_song_and_wait(void) { if (switch_is_on(SW1)) { play_song_and_wait(melody_googlenfc001, sizeof(melody_googlenfc001) / sizeof(struct note)); } else { play_song_and_wait(melody_kayac_beep, sizeof(melody_kayac_beep) / sizeof(struct note)); } }
s32 MIXER_ApplyLimits(unsigned channel, struct Limit *limit, volatile s32 *_raw, volatile s32 *_Channels, enum LimitMask flags) { int applied_safety = 0; s32 value = _raw[NUM_INPUTS + 1 + channel] + get_trim(NUM_INPUTS + 1 + channel); if (channel >= NUM_OUT_CHANNELS) return value; if ((flags & APPLY_SAFETY) && MIXER_SRC(limit->safetysw) && switch_is_on(limit->safetysw, _raw)) { applied_safety = 1; value = PCT_TO_RANGE(Model.limits[channel].safetyval); } if (flags & APPLY_SCALAR) { if (value >= 0 || limit->servoscale_neg == 0) value = (s32)value * limit->servoscale / 100; else value = (s32)value * limit->servoscale_neg / 100; } if ((flags & APPLY_REVERSE) && (limit->flags & CH_REVERSE)) { value = -value; } if (flags & APPLY_SUBTRIM) value += PCT_TO_RANGE(limit->subtrim) / 10; if (! applied_safety) { //degrees / 100msec if (_Channels && (flags & APPLY_SPEED) && limit->speed) { s32 rate = CHAN_MAX_VALUE * limit->speed / 60 * MEDIUM_PRIORITY_MSEC / 100; if (value - _Channels[channel] > rate) value = _Channels[channel] + rate; else if(value - _Channels[channel] < -rate) value = _Channels[channel] - rate; } } if (flags & APPLY_LIMITS) { if (value > PCT_TO_RANGE(limit->max)) value = PCT_TO_RANGE(limit->max); else if( value < PCT_TO_RANGE(-(int)limit->min)) value = PCT_TO_RANGE(-(int)limit->min); } else { if (value > INT16_MAX) value = INT16_MAX; else if (value < INT16_MIN) value = INT16_MIN; } return value; }
void MIXER_ApplyMixer(struct Mixer *mixer, volatile s32 *raw, s32 *orig_value) { s32 value; if (! MIXER_SRC(mixer->src)) return; if (! switch_is_on(mixer->sw, raw)) { // Switch is off, so this mixer is not active return; } //1st: Get source value with trim value = raw[MIXER_SRC(mixer->src)]; //Invert if necessary if (MIXER_SRC_IS_INV(mixer->src)) value = - value; //2nd: apply curve value = CURVE_Evaluate(value, &mixer->curve); //3rd: apply scalar and offset value = value * mixer->scalar / 100 + PCT_TO_RANGE(mixer->offset); //4th: multiplex result switch(MIXER_MUX(mixer)) { case MUX_REPLACE: break; case MUX_MULTIPLY: value = raw[mixer->dest + NUM_INPUTS + 1] * value / CHAN_MAX_VALUE; break; case MUX_ADD: value = raw[mixer->dest + NUM_INPUTS + 1] + value; break; case MUX_MAX: value = raw[mixer->dest + NUM_INPUTS + 1] > value ? raw[mixer->dest + NUM_INPUTS + 1] : value; break; case MUX_MIN: value = raw[mixer->dest + NUM_INPUTS + 1] < value ? raw[mixer->dest + NUM_INPUTS + 1] : value; break; case MUX_DELAY: { //value initially represents 20ths of seconds to cover 60-degrees //convert value to represent #msecs to cover 60-degrees (zero->full) if (value == 0 || orig_value == NULL) { value = raw[mixer->dest + NUM_INPUTS + 1]; break; } value = abs(RANGE_TO_PCT(value)) * 50; //rate represents the maximum travel per iteration (once per MEDIUM_PRIORITY_MSEC) s32 rate = CHAN_MAX_VALUE * MEDIUM_PRIORITY_MSEC / value; value = raw[mixer->dest + NUM_INPUTS + 1]; if (value - *orig_value > rate) value = *orig_value + rate; else if(value - *orig_value < -rate) value = *orig_value - rate; } case MUX_LAST: break; } //5th: apply trim if (MIXER_APPLY_TRIM(mixer)) value = value + (MIXER_SRC_IS_INV(mixer->src) ? -1 : 1) * get_trim(MIXER_SRC(mixer->src)); //Ensure we don't overflow if (value > INT16_MAX) value = INT16_MAX; else if (value < INT16_MIN) value = INT16_MIN; raw[mixer->dest + NUM_INPUTS + 1] = value; }