Esempio n. 1
0
int main()
{
  unsigned short old_temp, new_temp, fan_speed, steps;
  short temp_change;
  float step_up, step_down;
  
  /* prepare_fan(); */
  
  /* assume running on boot so set fan speed to minimum */
  new_temp = get_temp();
  fan_speed = 2000;
  set_fan_speed(fan_speed);
  sleep(polling_interval);

  step_up = (float)(max_fan_speed - min_fan_speed) / 
            (float)((max_temp - high_temp) * (max_temp - high_temp + 1) / 2);
  
  step_down = (float)(max_fan_speed - min_fan_speed) / 
              (float)((max_temp - low_temp) * (max_temp - low_temp + 1) / 2);
     
  while(1)
  {
    old_temp = new_temp;
    new_temp = get_temp();
    
    if(new_temp >= max_temp && fan_speed != max_fan_speed) {
      fan_speed = max_fan_speed;
    }
    
    if(new_temp <= low_temp && fan_speed != min_fan_speed) {
      fan_speed = min_fan_speed;
    }
    
    temp_change = new_temp - old_temp;
    
    if(temp_change > 0 && new_temp > high_temp && new_temp < max_temp) {
      steps = (new_temp - high_temp) * (new_temp - high_temp + 1) / 2;
      fan_speed = max(fan_speed, ceil(min_fan_speed + steps * step_up));
    }

    if(temp_change < 0 && new_temp > low_temp && new_temp < max_temp) {
      steps = (max_temp - new_temp) * (max_temp - new_temp + 1) / 2;
      fan_speed = min(fan_speed, floor(max_fan_speed - steps * step_down));
    }

    set_fan_speed(fan_speed);
    sleep(polling_interval);    
  }
  
  return 0;
}
Esempio n. 2
0
void main(void)
{
    init_pins();
    init_oscillator();
    SPI1_Initialize();
    
    float temp = 0;
    // Set all pins RD1-7 to inputs, RD0 (MSB is set to output)
    //TRISD = 0b11111110;
    // RC2 is PWM pin
    TRISCbits.RC2 = 0;
    
    configure_adc();
    configure_pwm();
    int ticks = 0;
    
    while (1)
    {  
        MAX_7221_INIT();
        temp = get_temperature(0);
        set_fan_speed(temp);
        if(ticks % 125 == 0) {
            MAX_7221_WRITE_FLOAT(temp, 3);
            ticks = 0;
        }
        ticks++;
    }
}
Esempio n. 3
0
int main(void)
{
	int result, done, op;

	result = SusiDllInit();
	if (result == FALSE) {
		printf("SusiDllInit() failed\n");
		return 1;
	}

	result = SusiHWMAvailable();
	if (result == FALSE) {
		printf("SusiHWMAvailable() failed\n");
		SusiDllUnInit();
		return 1;
	}

	result = show_platform_info();
	
	done = 0;
	while (! done) {
		show_menu();
		if (scanf("%i", &op) <= 0)
			op = -1;

		switch (op) {
		case 0:
			done = 1;
			continue;
		case 1:
			result = get_voltage();
			break;
		case 2:
			result = get_temperature();
			break;
		case 3:
			result = get_fan_speed();
			break;
		case 4:
			result = set_fan_speed();
			break;
		default:
			printf("\nUnknown choice!\n\n");
			continue;
		}
		if (result != 0) {
			printf("Library returns with error.\n");
			SusiDllUnInit();
			return 1;
		}
	}

	result = SusiDllUnInit();
	if (result == FALSE) {
		printf("SusiDllUnInit() failed\n");
		return 1;
	}

	return 0;
}
Esempio n. 4
0
/* Main function */
int main()
{
    Machine mach;
    double A, k;

    init(&mach);

    k = (log(mach.fan.max_speed) - log(mach.fan.min_speed)) / (mach.high_temp - mach.low_temp);
    A = mach.fan.max_speed * exp(-(mach.high_temp * k));

    while(1)
    {
        mach.temp = get_temp(mach.cores);
        mach.fan.speed = calc_fan_speed(mach, A, k);
        if(mach.fan.old_speed != mach.fan.speed)
        {
            set_fan_speed(mach.fan.speed);
            log_fan_speed(mach.fan.speed, mach.temp);
            mach.fan.old_speed = mach.fan.speed;
            mach.old_temp = mach.temp;
        }
        sleep(mach.polling_interval);
    }

    return SUCCESS;
}
Esempio n. 5
0
static int
do_fan( SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id,
        SaHpiRdrT *rdr )
{
        SaErrorT rv;
        SaHpiCtrlRecT *ctrl_rec = &rdr->RdrTypeUnion.CtrlRec;

        printf( "\tfan: num %d, id ", ctrl_rec->Num );
        display_textbuffer( rdr->IdString );
        printf( "\n" );

        if ( ctrl_rec->Type != SAHPI_CTRL_TYPE_ANALOG ) {
                fprintf( stderr, "cannot handle non analog fan controls !\n" );
                return 0;
        }

        printf( "\t\tmin       %d\n", ctrl_rec->TypeUnion.Analog.Min );
        printf( "\t\tmax       %d\n", ctrl_rec->TypeUnion.Analog.Max );
        printf( "\t\tdefault   %d\n", ctrl_rec->TypeUnion.Analog.Default );

        SaHpiCtrlStateAnalogT speed;

        rv = get_fan_speed( session_id, resource_id, ctrl_rec->Num, &speed );

        if ( rv != SA_OK )
                return 0;

        printf( "\t\tcurrent   %d\n", speed );

        if ( fan_speed == -1 )
                return 0;
  
        if (    fan_speed < ctrl_rec->TypeUnion.Analog.Min 
                || fan_speed > ctrl_rec->TypeUnion.Analog.Max ) {
                fprintf( stderr, "fan speed %d out of range [%d,%d] !\n",
                         fan_speed, ctrl_rec->TypeUnion.Analog.Min,
                         ctrl_rec->TypeUnion.Analog.Max );
                return 0;
        }

        speed = fan_speed;
        rv = set_fan_speed( session_id, resource_id, ctrl_rec->Num, speed );

        if ( rv != SA_OK )
                return 0;
  
        rv = get_fan_speed( session_id, resource_id, ctrl_rec->Num, &speed );

        if ( rv != SA_OK )
                return 0;
  
        printf( "\t\tnew speed %d\n", speed );

        return 0;
}
Esempio n. 6
0
static int on_fan_speed_change(CanopyContext ctx, const char *varName, void *userData)
{
    int8_t fanSpeed;
    CanopyResultEnum result;

    result = canopy_var_get_int8(ctx, "fan_speed", &fanSpeed);
    if (!ctx) {
        fprintf(stderr, "Error reading fan_speed\n");
        return -1;
    }

    set_fan_speed(fanSpeed);
    return 0;
}
Esempio n. 7
0
/*
 * Open fan devices and initialize per fan data structure.
 * Returns #fans found.
 */
static int
envd_setup_fans(void)
{
	int		i, fd;
	fanspeed_t	speed;
	env_fan_t	*fanp;
	char		path[FILENAME_MAX];
	int		fancnt = 0;

	for (i = 0; (fanp = envd_fans[i]) != NULL; i++) {
		fanp->fd = -1;
		fanp->cur_speed = 0;
		fanp->prev_speed = 0;

		(void) strcpy(path, "/devices");
		(void) strlcat(path, fanp->devfs_path, sizeof (path));
		fd = open(path, O_RDWR);
		if (fd == -1) {
			envd_log(LOG_WARNING, ENV_FAN_OPEN_FAIL, fanp->name,
			    fanp->devfs_path, errno, strerror(errno));
			fanp->present = B_FALSE;
			continue;
		}
		fanp->fd = fd;
		fanp->present = B_TRUE;
		fancnt++;

		/*
		 * Set cur_speed/prev_speed to current fan speed
		 */
		if (get_fan_speed(fanp, &speed) == -1) {
			/*
			 * The Fan driver does not know the current fan speed.
			 * Initialize it to 50% of the max speed and reread
			 * to get the current speed.
			 */
			speed = fanp->speed_max/2;
			(void) set_fan_speed(fanp, speed);
			if (get_fan_speed(fanp, &speed) == -1)
				continue;
		}
		fanp->cur_speed = speed;
		fanp->prev_speed = speed;
	}
	return (fancnt);
}
Esempio n. 8
0
int main(void)
{
    CanopyContext ctx;
    CanopyResultEnum result;
    uint64_t reportTimer = 0;

    result = canopy_set_global_opt(
        CANOPY_LOG_LEVEL, 0,
        CANOPY_LOG_PAYLOADS, true);

    ctx = canopy_init_context();
    if (!ctx) {
        fprintf(stderr, "Error initializing context\n");
        return -1;
    }

    result = canopy_set_opt(ctx,
        CANOPY_DEVICE_UUID, "e6968460-f010-48ef-8e69-835543843b32",
        CANOPY_DEVICE_SECRET_KEY, "/pMdwTzEA3+d66qo3MZQ2bWjsYGXAHAb",
        CANOPY_CLOUD_SERVER, "sandbox.canopy.link"
    );

    if (result != CANOPY_SUCCESS){
        fprintf(stderr, "Failed to configure context\n");
        return -1;
    }

    result = canopy_var_init(ctx, "out float32 temperature");
    if (result != CANOPY_SUCCESS){
        fprintf(stderr, "Failed to init cloudvar 'temperature'\n");
        return -1;
    }
    result = canopy_var_init(ctx, "out float32 humidity");
    if (result != CANOPY_SUCCESS){
        fprintf(stderr, "Failed to init cloudvar 'humidity'\n");
        return -1;
    }
    result = canopy_var_init(ctx, "inout int8 fan_speed");
    if (result != CANOPY_SUCCESS){
        fprintf(stderr, "Failed to init cloudvar 'fan_speed'\n");
        return -1;
    }

    /*result = canopy_var_on_change(ctx, "fan_speed", on_fan_speed_change, NULL);
    if (result != CANOPY_SUCCESS) {
        fprintf(stderr, "Error setting up fan_speed callback\n");
        return -1;
    }*/

    // turn fan off
    init_fan_pins();
    result = canopy_var_set_int8(ctx, "fan_speed", 0);
    if (!ctx) {
        fprintf(stderr, "Error setting fan_speed\n");
        return -1;
    }

    while (1) {
        int8_t speed;
        canopy_sync_blocking(ctx, 10*CANOPY_SECONDS);

        result = canopy_var_get_int8(ctx, "fan_speed", &speed);
        if (result != CANOPY_SUCCESS) {
            fprintf(stderr, "Error reading fan_speed\n");
            return -1;
        }
        set_fan_speed(speed);

        if (canopy_once_every(&reportTimer, 60*CANOPY_SECONDS)) {
            printf("reading sensors...\n");
            float temperature, humidity;
            bool sensorOk;
            sensorOk = read_sensors(&temperature, &humidity);
            if (sensorOk) {
                printf("Temperature: %f    Humidity: %f\n", temperature, humidity);
                result = canopy_var_set_float32(ctx, "temperature", temperature);
                if (result != CANOPY_SUCCESS) {
                    fprintf(stderr, "Failed to set cloudvar 'temperature'\n");
                    return -1;
                }

                result = canopy_var_set_float32(ctx, "humidity", humidity);
                if (result != CANOPY_SUCCESS) {
                    fprintf(stderr, "Failed to set cloudvar 'humidity'\n");
                    return -1;
                }
            }
        }
    }
}
Esempio n. 9
0
/**
 * Main TWI handler
 */
void twi_handler(void) {
    struct ucinfo_t *info = &ucinfo;

    if (ts_rx_valid == true) {
        /* I must be a slave, I've received something */
        switch (slave_rx_addr) {
        case TWICMD_POWERUP:
            /*
             * Turn on a the power supply. If I'm getting this command, I'm a
             * slave and I must have standby power on, so there must be a power
             * supply on me. Separating this and TWICMD_STARTUP gets power to
             * ALL slaves, even those without power supplies, for when the
             * TWICMD_STARTUP happens.
             */
            info->addressing_complete = false;
            gpio_set_pin_high(SPARE_DOWN);
            gpio_set_pin_high(HAVE_USB);
            power_supply_on();
            break;

        case TWICMD_STARTUP:
            /* restart addressing cycle */
            info->addressing_complete = false;
            gpio_set_pin_high(SPARE_DOWN);
            gpio_set_pin_high(HAVE_USB);
            usb_powerup_request();
            break;

        case TWICMD_POWERDOWN:
            usb_powerdown_request();
            break;

        case TWICMD_ADDRESS:
            if (tmp1 < sizeof(addresses) / sizeof(addresses[0])) {
                addresses[tmp1] = slave_rx_data.b[0];
                su_pin[tmp1] = gpio_pin_is_high(SPARE_UP);
                sd_pin[tmp1] = gpio_pin_is_high(SPARE_DOWN);
                tmp1++;
            }

            if (gpio_pin_is_low(SPARE_UP) && gpio_pin_is_high(SPARE_DOWN)) {
                /* This is MY address! Grab it. */
                my_twi_address = slave_rx_data.b[0];
                my_twi_address_set = true;
                delay_msec(1);
                twi_slave_setup(my_twi_address);
                delay_msec(1);

                if (info->chain_configuration == CC_OPEN_UP) {
                    /*
                     * Send notification back up chain to master.
                     * Last address done
                     */
                    gpio_set_pin_low(HAVE_USB);
                } else {
                    /* Propagate down so next module gets next address. */
                    gpio_set_pin_low(SPARE_DOWN);
                }
            }
            break;

        case TWICMD_ADDRESSING_COMPLETE:
            info->addressing_complete = true;
            gpio_set_pin_high(SPARE_DOWN);
            gpio_set_pin_high(HAVE_USB);
            break;

        case TWICMD_FPGA_ASIC_CTL:
            fpga_reg_write(FA_ASIC_CONTROL,
                    (slave_rx_data.b[0] & F_FORCE_BAUD) ? (slave_rx_data.b[0] & ~F_FORCE_BAUD) : ((slave_rx_data.b[0] & ~F_ASIC_BAUD_MASK) | ucinfo.asic_baud_rate_code));
            break;

        case TWICMD_REBOOT:
            if (slave_rx_nb && slave_rx_data.b[0]) {
                /*
                 * Tell Atmel DFU loader not to start app ever again (harmless
                 * with custom loader).
                 */
                flashc_erase_gp_fuse_bit(31, true);
                flashc_write_gp_fuse_bit(31, true);
                /*
                 * Tell custom bootloader not to start app on this boot
                 * (harmless with Atmel DFU loader).
                 */
                AVR32_PM.gplp[1] = 0x73746179;
            }
            /* never returns */
            self_reset();
            break;

        case TWICMD_FAN_SET:
            set_fan_speed(slave_rx_data.b[0], slave_rx_data.b[1]);
            break;

        case TWICMD_DIE_SETTINGS:
            if (slave_rx_nb) {
                hf_nvram_write_die_settings(0, &slave_rx_data.opSettings);
            }
            break;

        case TWICMD_BAD_CORE_BITMAP:
            if (slave_rx_nb) {
                hf_nvram_write_bad_core_bitmap(0, (((uint16_t) slave_rx_data.b[0]) << 8) | slave_rx_data.b[1]);
            }
            break;

        case TWICMD_MIXED_BAUD:
            set_mixed_slave_baudrate();
            break;

        case TWICMD_VOLTAGE_SET:
            if (slave_rx_nb >= 3) {
                module_voltage_set(0, slave_rx_data.b[0], ((uint16_t) slave_rx_data.b[1] << 8) | slave_rx_data.b[2]);
            }
            break;

        default:
            break;
        }
        ts_rx_valid = false;
    }

    if (info->master == false) {
        if (info->addressing_complete == false) {
            /* propagate HAVE_USB back up chain to master during address cycle */
            if (info->chain_configuration == CC_MIDDLE) {
                if (gpio_pin_is_high(USB_DOWN)) {
                    gpio_set_pin_high(HAVE_USB);
                } else {
                    gpio_set_pin_low(HAVE_USB);
                }
            }
        }
    }

    masterHandler();
}
Esempio n. 10
0
/*
 * This is the environment thread, which monitors the current temperature
 * and power managed state and controls system fan speed.  Temperature is
 * polled every sensor-poll_interval seconds duration.
 */
static void *
envthr(void *args)
{
	int		err;
	fanspeed_t 	fan_speed;
	struct timeval	ct;
	struct timespec	to;
	env_fan_t	*pmfanp = &envd_system_fan;
	tempr_t		cpu_amb_temp, cpu_die_temp;
	tempr_t		cpu_amb_warning, cpu_die_warning;

	(void) pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
	(void) pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);

	cpu_amb_warning = cpu_amb_sensor.temp_thresh->high_warning;
	cpu_die_warning = cpu_die_sensor.temp_thresh->high_warning;

	for (;;) {
		(void) gettimeofday(&ct, NULL);

		/*
		 * Monitor current temperature for all sensors
		 * (current temperature is recorded in the "cur_temp"
		 * field within each sensor data structure)
		 */
		monitor_sensors();

		cpu_amb_temp =  cpu_amb_sensor.cur_temp;
		cpu_die_temp =  cpu_die_sensor.cur_temp;

		/*
		 * Process any PM state change events while waiting until
		 * time to poll sensors again (i.e. sensor_poll_interval
		 * seconds from the last time).
		 */
		to.tv_sec = ct.tv_sec + sensor_poll_interval;
		to.tv_nsec = 0;
		for (;;) {
			/*
			 * Turn off system fan if in lowest power state
			 * and both CPU die and ambient temperatures are
			 * below corresponding high warning temperatures.
			 */
			fan_speed = pmfanp->speed_max;
			if (cur_lpstate && cpu_amb_temp < cpu_amb_warning &&
			    cpu_die_temp < cpu_die_warning)
				fan_speed = pmfanp->speed_min;

			if (env_debug)
				envd_log(LOG_INFO,
				    "fan: %-16s speed cur:%3d  new:%3d "
				    "low-power:%d\n", pmfanp->name,
				    (uint_t)pmfanp->cur_speed,
				    (uint_t)fan_speed, cur_lpstate);

			if (fan_speed != pmfanp->cur_speed &&
			    set_fan_speed(pmfanp, fan_speed) == 0)
				pmfanp->cur_speed = fan_speed;

			/* wait for power state change or time to poll */
			pthread_mutex_lock(&lpstate_lock);
			err = pthread_cond_timedwait(&lpstate_cond,
			    &lpstate_lock, &to);
			pthread_mutex_unlock(&lpstate_lock);
			if (err == ETIMEDOUT)
				break;
		}
	}
	/*NOTREACHED*/
	return (NULL);
}