/* 获取当前所有温度传感器最高的温度 */ static INT8 local_max_temperature_get() { UINT8 sensor_id, max = 0, i; INT16 temperature; /* 获取温度 */ temperature = ds_get_id_temperaturex16_unblock(&sensor_id); if(temperature > -1000 && sensor_id < TEMPERATURE_SENSOR_NUM){ /* 成功获取温度 */ temperature_info[0].temperature[sensor_id] = temperature / 16; temperature_info[0].lastTime[sensor_id] = timebase_get(); }else{ /* 有错误发生 */ } for(i=0; i<1; i++){ UINT32 diff = time_diff_ms(temperature_info[0].lastTime[i]); if(diff > 60000){ /* 60秒没有成功获取温度 */ temperature_info[0].temperature[i] = 120; } if(diff > 10000){ /* 十秒没有成功获取温度,温度+10度 */ temperature_info[0].lastTime[i] = local_ms_get(); temperature_info[0].temperature[i] += 10; if(temperature_info[0].temperature[i] > 120) temperature_info[0].temperature[i] = 120; } if(max < temperature_info[0].temperature[i]) max = temperature_info[0].temperature[i]; } return max; }
int main() { UINT32 val; char c, forceClearCfg = 0; /* enable watchdog */ wdt_enable(WDTO_8S); #ifdef INCLUDE_KTANK_UART /* init UART */ init_uart(9600); printk("\n\n\n!!!!!!!!!!ktank start!!!!!!!!!!!!!!\n\n\n"); #endif /* init PWM, local time */ pwm_init(); /* enable i2c bus, rtc need it */ I2C_init(); /* init timer */ timer_init(); val = timebase_get(); #ifdef INCLUDE_KTANK_UART do{ if(uart_poll_c((UINT8*)&c) > 0 && c == 'c'){ forceClearCfg++; } }while(time_diff_ms(val) < 2000); #endif if(forceClearCfg > 10){ DBG_PRINT("slave force clear cfg..\n"); EEPROM_put(EEPROM_OFS_RFAVAIL, 0xff); } local_device_info_load(); local_device_info_show(); if(RF_CFG_AVAL()){ rf_init(NULL, SLAVE_MODE_NORMAL); rf_config(EEPROM_get(EEPROM_OFS_HOSTID), EEPROM_get(EEPROM_OFS_DEVID)); DBG_PRINT("slave start hostid 0x%x devid 0x%x\n", EEPROM_get(EEPROM_OFS_HOSTID), EEPROM_get(EEPROM_OFS_DEVID)); nrf_enter_rx_mode(); }else{ #if 0 rf_init(NULL, SLAVE_MODE_WAIT_SYNC); DBG_PRINT("no cfg, force device id 1, host id 0xef\n"); rf_config(0xef, 1); nrf_enter_rx_mode(); #else rf_init(NULL, SLAVE_MODE_WAIT_DISCOVER); rf_config(0xc0, 0x80); DBG_PRINT("slave start without rf cfg\n"); #endif } sei(); while(1){ wdt_reset(); rf_process(); local_device_update(); } }
void waveform_update(const chunk_pt chunk){ //const float alpha = 0.98; float vall = 0.; float vhigh = 0.; float vmid = 0.; float vlow = 0.; static float slow = 0.; static float shigh = 0.; static float qlow = 0.; static float qmid = 0.; static float qhigh = 0.; #define MAX(a, b) ((a > b) ? a : b) #define MIN(a, b) ((a < b) ? a : b) #define LB1 0.03 #define LB2 0.0 //#define LA2 0.9914878835315175 // exp(-pi * f_1 / F_n); F_n = 22050Hz; f_1 = 60Hz //#define LA2 0.9719069870254697 // exp(-pi * f_1 / F_n); F_n = 22050Hz; f_1 = 200Hz #define LA2 0.98 #define L2A2 0.98 // DC-blocking 1-pole lpf #define LN ((1. - LA2) / (LB1 + LB2)) #define HB1 1.0 #define HB2 -1.0 //#define HA2 0.6521846367685737 // exp(-pi * f_1 / F_n); F_n = 22050Hz; f_1 = 3000Hz #define HA2 0.65 // exp(-pi * f_1 / F_n); F_n = 22050Hz; f_1 = 3000Hz #define HN ((1. + LA2) / 2.) * 4 #define H2A2 0.7 // DC-blocking 1-pole lpf #define LC1 0.9 #define MC1 0.8 #define HC1 0.7 for(int i = 0; i < config.audio.chunk_size; i++){ vall = MAX(vall, fabs(chunk[i])); //slow = slow * alpha + chunk[i] * (1 - alpha); //vlow = MAX(vlow, fabs(slow)); //vlow = MAX(vlow, fabs( (chunk[i] - slow * LA2) * LB1 + slow * LB2) * LN); //slow = chunk[i] - slow * LA2; slow = LA2 * slow + (1. - LA2) * chunk[i]; //vlow = MAX(vlow, fabs(slow)); vlow = L2A2 * vlow + (1.0 - L2A2) * fabs(slow); //shigh = - shigh * alpha + chunk[i] * (1 - alpha); //vhigh = MAX(vhigh, fabs(shigh)); //vhigh = MAX(vhigh, fabs( (chunk[i] - shigh * HA2) * HB1 + shigh * HB2) * HN); vhigh = H2A2 * vhigh + (1.0 - H2A2) * fabs(((chunk[i] - shigh * HA2) * HB1 + shigh * HB2) * HN); shigh = chunk[i] - shigh * HA2; } vhigh *= 1.5; vlow *= 2.0; vhigh = MIN(vhigh, vall); vlow = MIN(vlow, vall); vmid = MAX(0., vall - vlow - vhigh); waveform_bin_update(&waveform_bins[WF_LOW], (vlow + vmid + vhigh)); waveform_bin_update(&waveform_bins[WF_MID], (vhigh + vmid)); waveform_bin_update(&waveform_bins[WF_HIGH], (vhigh)); waveform_bin_update(&beat_bin, MB2B(timebase_get() % 1000)); qlow = LC1 * qlow + (1. - LC1) * vlow; qmid = MC1 * qmid + (1. - MC1) * vmid; qhigh = HC1 * qhigh + (1. - HC1) * vhigh; param_output_set(&waveform_bins[WF_LOW].output, MIN(qlow * 2., 1.)); param_output_set(&waveform_bins[WF_MID].output, MIN(qmid * 2., 1.)); param_output_set(&waveform_bins[WF_HIGH].output, MIN(qhigh * 2., 1.)); memmove(beat_lines + 1, beat_lines, (WAVEFORM_HISTORY_SIZE - 1) * sizeof(char)); beat_lines[0] = 0; }
void output_run(void* args) { FPSmanager fps_manager; unsigned char frame[4096]; SDL_initFramerate(&fps_manager); SDL_setFramerate(&fps_manager, 100); stat_ops = 100; output_running = 1; unsigned int last_tick = SDL_GetTicks(); while(output_running) { mbeat_t tb = timebase_get(); update_patterns(tb); update_signals(tb); for(int i=0; i<n_output_strips; i++) { if(!output_strips[i].bus) continue; output_to_buffer(&output_strips[i], output_buffers[i]); float energy = 0.; float scalar = 1.0; for(int k = 0; k < output_strips[i].length; k++){ energy += output_buffers[i][k].r; energy += output_buffers[i][k].g; energy += output_buffers[i][k].b; } scalar = output_strips[i].length * config.output.max_energy / energy * 255.; if(scalar > 255.) scalar = 255.; int j = 0; for(int k = 0; k < output_strips[i].length; k++){ frame[j++] = output_buffers[i][k].r * scalar; frame[j++] = output_buffers[i][k].g * scalar; frame[j++] = output_buffers[i][k].b * scalar; } if(output_on_flux && (output_strips[i].bus & OUTPUT_FLUX)) output_flux_push(&output_strips[i], frame, j); } SDL_framerateDelay(&fps_manager); //stat_ops = SDL_getFramerate(&fps_manager); stat_ops = 0.8 * stat_ops + 0.2 * (1000. / (SDL_GetTicks() - last_tick)); last_tick = SDL_GetTicks(); } for(int i=0; i<n_output_strips; i++) { free(output_buffers[i]); } free(output_buffers); if(output_on_flux) output_flux_del(); }