|  | # Introduction | 
|  |  | 
|  | Swampd's primary function is to drive the fans of a system given various inputs. | 
|  |  | 
|  | # Layout | 
|  |  | 
|  | The code is broken out into modules as follows: | 
|  |  | 
|  | * `dbus` - Any read or write interface that uses dbus primarily. | 
|  | * `experiments` - Small execution paths that allow for fan examination | 
|  | including how quickly fans respond to changes. | 
|  | * `ipmi` - Manual control for any zone is handled by receiving an IPMI message. | 
|  | This holds the ipmid provider for receiving those messages and sending them | 
|  | onto swampd. | 
|  | * `notimpl` - These are read-only and write-only interface implementations that | 
|  | can be dropped into a pluggable sensor to make it complete. | 
|  | * `pid` - This contains all the PID associated code, including the zone | 
|  | definition, controller definition, and the PID computational code. | 
|  | * `scripts` - This contains the scripts that convert YAML into C++. | 
|  | * `sensors` - This contains a couple of sensor types including the pluggable | 
|  | sensor's definition.  It also holds the sensor manager. | 
|  | * `sysfs` - This contains code that reads from or writes to sysfs. | 
|  | * `threads` - Most of swampd's threads run in this method where there's just a | 
|  | dbus bus that we manage. | 
|  |  | 
|  |  | 
|  | # Design | 
|  |  | 
|  | One defines a series of sensors and a series of PIDs that utilize those sensors | 
|  | as inputs (and outputs). | 
|  |  | 
|  | The thermal PID | 
|  |  | 
|  | set-point -------->|---|---> RPM | 
|  | current value ---->|___| | 
|  |  | 
|  | The fan PID | 
|  |  | 
|  | set-point -------->|---|---> pwm% | 
|  | current value ---->|___| | 
|  |  | 
|  | How to get set-point for fan PIDs | 
|  |  | 
|  | thermal-out ----->|-----| | 
|  | thermal-out ----->|     |-----> RPM | 
|  | thermal-out ----->| MAX | | 
|  | thermal-out ----->|_____| |