blob: b53a82324289d6e0d6a82e6866c6378451010325 [file] [log] [blame]
Hisham Muhammadd6231ba2006-03-04 18:16:49 +00001#ifndef HEADER_Meter
2#define HEADER_Meter
3/*
Hisham Muhammadf6e0b7d2006-06-06 20:28:42 +00004htop - Meter.h
Hisham Muhammad300caa02011-05-26 16:35:07 +00005(C) 2004-2011 Hisham H. Muhammad
Daniel Lange94ad1112021-09-22 11:33:00 +02006Released under the GNU GPLv2+, see the COPYING file
Hisham Muhammadd6231ba2006-03-04 18:16:49 +00007in the source distribution for its full text.
8*/
9
Benny Baumann0f526292020-09-19 13:55:23 +020010#include <stdbool.h>
mayurdahibhate1b74dfe2021-04-29 20:42:43 +053011#include <stddef.h>
Christian Göttsche7cf52772020-11-18 14:26:30 +010012#include <stdint.h>
Hisham Muhammad3383d8e2015-01-21 23:27:31 -020013#include <sys/time.h>
Hisham Muhammadd6231ba2006-03-04 18:16:49 +000014
Benny Baumanne1c96872020-09-18 19:23:04 +020015#include "ListItem.h"
Nathan Scott0bdade12023-05-02 09:02:22 +100016#include "Machine.h"
Explorer09981d6372024-08-13 08:18:33 +080017#include "Macros.h"
Explorer09c167a2c2024-04-18 22:07:39 +080018#include "MeterMode.h"
Benny Baumann0f526292020-09-19 13:55:23 +020019#include "Object.h"
Benny Baumann0f526292020-09-19 13:55:23 +020020
Benny Baumanne1c96872020-09-18 19:23:04 +020021
Christian Göttsche2d1042a2020-10-06 13:13:16 +020022#define METER_TXTBUFFER_LEN 256
Explorer0983041f32023-10-10 20:07:57 +080023#define MAX_METER_GRAPHDATA_VALUES 32768
Hugo Musso Gualandi92074012020-09-12 18:25:25 -030024
Christian Göttschead764ff2020-11-24 19:34:27 +010025#define METER_BUFFER_CHECK(buffer, size, written) \
26 do { \
27 if ((written) < 0 || (size_t)(written) >= (size)) { \
28 return; \
29 } \
30 (buffer) += (written); \
31 (size) -= (size_t)(written); \
32 } while (0)
33
34#define METER_BUFFER_APPEND_CHR(buffer, size, c) \
35 do { \
36 if ((size) < 2) { \
37 return; \
38 } \
39 *(buffer)++ = c; \
40 *(buffer) = '\0'; \
41 (size)--; \
42 if ((size) == 0) { \
43 return; \
44 } \
45 } while (0)
46
47
Benny Baumann0f526292020-09-19 13:55:23 +020048struct Meter_;
Hisham Muhammadd6231ba2006-03-04 18:16:49 +000049typedef struct Meter_ Meter;
50
Explorer09981d6372024-08-13 08:18:33 +080051typedef ATTR_NONNULL void (*Meter_Init)(Meter*);
52typedef ATTR_NONNULL void (*Meter_Done)(Meter*);
53typedef ATTR_NONNULL void (*Meter_UpdateMode)(Meter*, MeterModeId);
54typedef ATTR_NONNULL void (*Meter_UpdateValues)(Meter*);
55typedef ATTR_NONNULL void (*Meter_Draw)(Meter*, int, int, int);
56typedef ATTR_NONNULL const char* (*Meter_GetCaption)(const Meter*);
57typedef ATTR_NONNULL ATTR_ACCESS3_W(2, 3) void (*Meter_GetUiName)(const Meter*, char*, size_t);
Hisham Muhammadd6231ba2006-03-04 18:16:49 +000058
Hisham Muhammad00b324b2012-12-05 15:12:20 +000059typedef struct MeterClass_ {
Christian Göttsche08d85e62020-10-04 17:55:08 +020060 const ObjectClass super;
Hisham Muhammad00b324b2012-12-05 15:12:20 +000061 const Meter_Init init;
62 const Meter_Done done;
63 const Meter_UpdateMode updateMode;
Explorer099dea20e2016-05-04 13:39:26 +080064 const Meter_UpdateValues updateValues;
Nathan Scottf0ed0fd2021-06-23 17:44:56 +100065 const Meter_Draw draw;
Nathan Scott01f5b892021-07-07 16:57:03 +100066 const Meter_GetCaption getCaption;
Nathan Scottf0ed0fd2021-06-23 17:44:56 +100067 const Meter_GetUiName getUiName;
Explorer09c2c2a702024-04-18 22:18:40 +080068 const MeterModeId defaultMode;
Explorer091723ed72024-04-21 07:15:16 +080069 const uint32_t supportedModes; /* bitset of supported modes, 1<<mode_id */
Hisham Muhammad00b324b2012-12-05 15:12:20 +000070 const double total;
Christian Göttsche08d85e62020-10-04 17:55:08 +020071 const int* const attributes;
Christian Göttsche472f0122020-11-29 15:26:57 +010072 const char* const name; /* internal name of the meter, must not contain any space */
73 const char* const uiName; /* display name in header setup menu */
74 const char* const caption; /* prefix in the actual header */
75 const char* const description; /* optional meter description in header setup menu */
Christian Göttsche43d274a2020-10-29 23:17:12 +010076 const uint8_t maxItems;
Christian Göttschebdb015f2021-09-18 15:37:20 +020077 const bool isMultiColumn; /* whether the meter draws multiple sub-columns (defaults to false) */
Hisham Muhammad00b324b2012-12-05 15:12:20 +000078} MeterClass;
79
Christian Göttsche08d85e62020-10-04 17:55:08 +020080#define As_Meter(this_) ((const MeterClass*)((this_)->super.klass))
Hisham Muhammad00b324b2012-12-05 15:12:20 +000081#define Meter_initFn(this_) As_Meter(this_)->init
82#define Meter_init(this_) As_Meter(this_)->init((Meter*)(this_))
83#define Meter_done(this_) As_Meter(this_)->done((Meter*)(this_))
84#define Meter_updateModeFn(this_) As_Meter(this_)->updateMode
85#define Meter_updateMode(this_, m_) As_Meter(this_)->updateMode((Meter*)(this_), m_)
86#define Meter_drawFn(this_) As_Meter(this_)->draw
87#define Meter_doneFn(this_) As_Meter(this_)->done
Christian Göttsche2d1042a2020-10-06 13:13:16 +020088#define Meter_updateValues(this_) As_Meter(this_)->updateValues((Meter*)(this_))
Nathan Scottf0ed0fd2021-06-23 17:44:56 +100089#define Meter_getUiNameFn(this_) As_Meter(this_)->getUiName
90#define Meter_getUiName(this_,n_,l_) As_Meter(this_)->getUiName((const Meter*)(this_),n_,l_)
Nathan Scott01f5b892021-07-07 16:57:03 +100091#define Meter_getCaptionFn(this_) As_Meter(this_)->getCaption
92#define Meter_getCaption(this_) (Meter_getCaptionFn(this_) ? As_Meter(this_)->getCaption((const Meter*)(this_)) : (this_)->caption)
Explorer091723ed72024-04-21 07:15:16 +080093#define Meter_supportedModes(this_) As_Meter(this_)->supportedModes
Hisham Muhammad00b324b2012-12-05 15:12:20 +000094#define Meter_attributes(this_) As_Meter(this_)->attributes
95#define Meter_name(this_) As_Meter(this_)->name
96#define Meter_uiName(this_) As_Meter(this_)->uiName
Christian Göttschebdb015f2021-09-18 15:37:20 +020097#define Meter_isMultiColumn(this_) As_Meter(this_)->isMultiColumn
Hisham Muhammadd6231ba2006-03-04 18:16:49 +000098
Christian Göttsche0b9a0012020-10-02 16:27:57 +020099typedef struct GraphData_ {
100 struct timeval time;
Zev Weissa33cbae2022-05-21 20:14:02 -0700101 size_t nValues;
102 double* values;
Christian Göttsche0b9a0012020-10-02 16:27:57 +0200103} GraphData;
104
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000105struct Meter_ {
106 Object super;
Hisham Muhammad00b324b2012-12-05 15:12:20 +0000107 Meter_Draw draw;
Nathan Scott0bdade12023-05-02 09:02:22 +1000108 const Machine* host;
Daniel Flanagandd334442019-10-31 11:39:12 -0500109
Hisham Muhammad33113fe2006-04-10 20:40:38 +0000110 char* caption;
Explorer09c2c2a702024-04-18 22:18:40 +0800111 MeterModeId mode;
Christian Göttschea11d0152021-02-17 17:38:35 +0100112 unsigned int param;
Zev Weissa33cbae2022-05-21 20:14:02 -0700113 GraphData drawData;
Hisham Muhammad33113fe2006-04-10 20:40:38 +0000114 int h;
Christian Göttschea905c452021-08-14 11:32:38 +0200115 int columnWidthCount; /**< only used internally by the Header */
Christian Göttsche43d274a2020-10-29 23:17:12 +0100116 uint8_t curItems;
Christian Göttsche2c065662020-12-23 20:56:19 +0100117 const int* curAttributes;
Christian Göttsche2d1042a2020-10-06 13:13:16 +0200118 char txtBuffer[METER_TXTBUFFER_LEN];
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000119 double* values;
120 double total;
Christian Göttsche9f5b50e2020-09-23 11:58:11 +0200121 void* meterData;
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000122};
123
Hisham Muhammad33113fe2006-04-10 20:40:38 +0000124typedef enum {
Christian Göttsche63fafb42021-12-04 18:08:59 +0100125 RATESTATUS_DATA,
126 RATESTATUS_INIT,
127 RATESTATUS_NODATA,
128 RATESTATUS_STALE
129} MeterRateStatus;
130
Christian Göttscheba282cf2020-10-05 13:19:50 +0200131extern const MeterClass Meter_class;
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000132
Nathan Scott0bdade12023-05-02 09:02:22 +1000133Meter* Meter_new(const Machine* host, unsigned int param, const MeterClass* type);
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000134
Explorer095751baf2023-10-27 18:34:47 +0800135/* Converts 'value' in kibibytes into a human readable string.
136 Example output strings: "0K", "1023K", "98.7M" and "1.23G" */
137int Meter_humanUnit(char* buffer, double value, size_t size);
Christian Hesse6f58fbc2015-06-12 09:50:55 +0200138
Zev Weiss7b7822b2020-09-02 02:38:44 -0500139void Meter_delete(Object* cast);
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000140
Zev Weiss7b7822b2020-09-02 02:38:44 -0500141void Meter_setCaption(Meter* this, const char* caption);
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000142
Explorer09c2c2a702024-04-18 22:18:40 +0800143void Meter_setMode(Meter* this, MeterModeId modeIndex);
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000144
Explorer091723ed72024-04-21 07:15:16 +0800145MeterModeId Meter_nextSupportedMode(const Meter* this);
146
Christian Göttsched72b0a62021-01-05 23:42:55 +0100147ListItem* Meter_toListItem(const Meter* this, bool moving);
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000148
Christian Göttscheba282cf2020-10-05 13:19:50 +0200149extern const MeterClass BlankMeter_class;
Hisham Muhammad6d90e582014-02-27 16:35:22 -0300150
Hisham Muhammadd6231ba2006-03-04 18:16:49 +0000151#endif