diff --git a/.gitignore b/.gitignore deleted file mode 100644 index f5861ba..0000000 --- a/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.DS_Store -/sensors/ -/bin/ -/curses/ -/info/ -temp_sensor \ No newline at end of file diff --git a/Makefile b/Makefile deleted file mode 100644 index 2e790ec..0000000 --- a/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -CC=clang - -FRAMEWORKS:= -framework Foundation -framework IOKit -LIBRARIES:= -lobjc - -SOURCE=temp_sensor.m - -CFLAGS=-Wall -v $(SOURCE) -LDFLAGS=$(LIBRARIES) $(FRAMEWORKS) -OUT=-o temp_sensor - -build: - $(CC) $(CFLAGS) $(LDFLAGS) $(OUT) - -all: build - -run: - ./temp_sensor | ./monitor.py - -.phony: build run \ No newline at end of file diff --git a/monitor.cpp b/monitor.cpp new file mode 100644 index 0000000..e59fc72 --- /dev/null +++ b/monitor.cpp @@ -0,0 +1,114 @@ +#include +#include +#include +#include + +#include +#include + +#include +#include + +using namespace std; + +const string WHITESPACE = " \n\r\t\f\v"; +string ltrim(const string& s) { + size_t start = s.find_first_not_of(WHITESPACE); + return (start == string::npos) ? "" : s.substr(start); +} +string rtrim(const string& s) { + size_t end = s.find_last_not_of(WHITESPACE); + return (end == string::npos) ? "" : s.substr(0, end + 1); +} +string trim(const string& s) { return rtrim(ltrim(s)); } + +void split_comma(string &s, vector &l); +void sort_names(vector &l, vector &order, int &num); +int max_len(vector &l); + +int main(int argc,char *argv[]) { + string name_line, value_line; + getline(cin, name_line); + // cout< orders; + vector names, values; + vector raw_values; + + split_comma(name_line, names); + num = names.size(); + sort_names(names, orders, num); + name_length_max = max_len(names); + + for(int i=0;i &l) { + l.clear(); + stringstream s_stream(s); + while(s_stream.good()) { + string w; + getline(s_stream, w, ','); //get first string delimited by comma + w=trim(w); + if(!w.empty()) + l.push_back(w); + } +} + +void sort_names(vector &l, vector &order, int &num) { + vector< pair > l_id; + for(int i=0;i &l) { + int res = 0; + for(int i=0;i res) + res = l[i].size(); + return res; +} + + + + + +/* + cout << "\r%1"<screen_record.mp4[1.4MB] +![screen record](https://raw.githubusercontent.com/fermion-star/apple_sensors/master/screen_record.mp4) + +- screen shot +![screen shot](https://raw.githubusercontent.com/fermion-star/apple_sensors/master/screen_shot.png) + + + + diff --git a/screen_record.mp4 b/screen_record.mp4 new file mode 100644 index 0000000..35ed260 Binary files /dev/null and b/screen_record.mp4 differ diff --git a/screen_shot.png b/screen_shot.png new file mode 100644 index 0000000..9bfb735 Binary files /dev/null and b/screen_shot.png differ diff --git a/temp_sensor.m b/temp_sensor.m index aa419d1..79f9d87 100644 --- a/temp_sensor.m +++ b/temp_sensor.m @@ -1,35 +1,9 @@ -// This code is originally from https://github.com/freedomtan/sensors/blob/master/sensors/sensors.m -// Here is the original code's license - -// BSD 3-Clause License - -// Copyright (c) 2016-2018, "freedom" Koan-Sin Tan -// All rights reserved. - -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: - -// * Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. - -// * Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. - -// * Neither the name of the copyright holder nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. - -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// main.m +// sensors +// +// Created by Yang on 11/26/20. +// #include @@ -53,17 +27,16 @@ IOHIDEventRef IOHIDServiceClientCopyEvent(IOHIDServiceClientRef, int64_t , int32 CFStringRef IOHIDServiceClientCopyProperty(IOHIDServiceClientRef service, CFStringRef property); IOHIDFloat IOHIDEventGetFloatValue(IOHIDEventRef event, int32_t field); -// create a dict ref, like for temperature sensor {"PrimaryUsagePage":0xff00, "PrimaryUsage":0x5} CFDictionaryRef matching(int page, int usage) { CFNumberRef nums[2]; CFStringRef keys[2]; - + keys[0] = CFStringCreateWithCString(0, "PrimaryUsagePage", 0); keys[1] = CFStringCreateWithCString(0, "PrimaryUsage", 0); nums[0] = CFNumberCreate(0, kCFNumberSInt32Type, &page); nums[1] = CFNumberCreate(0, kCFNumberSInt32Type, &usage); - + CFDictionaryRef dict = CFDictionaryCreate(0, (const void**)keys, (const void**)nums, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); return dict; } @@ -73,10 +46,10 @@ CFArrayRef getProductNames(CFDictionaryRef sensors) { // ... this is the same as using kCFAllocatorDefault or the return value from CFAllocatorGetDefault() IOHIDEventSystemClientSetMatching(system, sensors); CFArrayRef matchingsrvs = IOHIDEventSystemClientCopyServices(system); // matchingsrvs = matching services - + long count = CFArrayGetCount(matchingsrvs); CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); - + for (int i = 0; i < count; i++) { IOHIDServiceClientRef sc = (IOHIDServiceClientRef)CFArrayGetValueAtIndex(matchingsrvs, i); CFStringRef name = IOHIDServiceClientCopyProperty(sc, CFSTR("Product")); // here we use ...CopyProperty @@ -100,13 +73,13 @@ CFArrayRef getPowerValues(CFDictionaryRef sensors) { IOHIDEventSystemClientRef system = IOHIDEventSystemClientCreate(kCFAllocatorDefault); IOHIDEventSystemClientSetMatching(system, sensors); CFArrayRef matchingsrvs = IOHIDEventSystemClientCopyServices(system); - + long count = CFArrayGetCount(matchingsrvs); CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); for (int i = 0; i < count; i++) { IOHIDServiceClientRef sc = (IOHIDServiceClientRef)CFArrayGetValueAtIndex(matchingsrvs, i); IOHIDEventRef event = IOHIDServiceClientCopyEvent(sc, kIOHIDEventTypePower, 0, 0); - + CFNumberRef value; if (event != 0) { double temp = IOHIDEventGetFloatValue(event, IOHIDEventFieldBase(kIOHIDEventTypePower)); @@ -124,14 +97,14 @@ CFArrayRef getThermalValues(CFDictionaryRef sensors) { IOHIDEventSystemClientRef system = IOHIDEventSystemClientCreate(kCFAllocatorDefault); IOHIDEventSystemClientSetMatching(system, sensors); CFArrayRef matchingsrvs = IOHIDEventSystemClientCopyServices(system); - + long count = CFArrayGetCount(matchingsrvs); CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); - + for (int i = 0; i < count; i++) { IOHIDServiceClientRef sc = (IOHIDServiceClientRef)CFArrayGetValueAtIndex(matchingsrvs, i); IOHIDEventRef event = IOHIDServiceClientCopyEvent(sc, kIOHIDEventTypeTemperature, 0, 0); // here we use ...CopyEvent - + CFNumberRef value; if (event != 0) { double temp = IOHIDEventGetFloatValue(event, IOHIDEventFieldBase(kIOHIDEventTypeTemperature)); @@ -145,34 +118,16 @@ CFArrayRef getThermalValues(CFDictionaryRef sensors) { return array; } -double getTempValue(CFArrayRef values, int index) { - CFNumberRef value = CFArrayGetValueAtIndex(values, index); - double temp = 0.0; - CFNumberGetValue(value, kCFNumberDoubleType, &temp); - return temp; -} - -void printCPUGPUTemps(CFArrayRef values) { - printf("CPU %0.1lf GPU %0.1lf, ", getTempValue(values,0), getTempValue(values,2)); - -} - void dumpValues(CFArrayRef values) { long count = CFArrayGetCount(values); - - double accumTemp = 0.0; - for (int i = 0; i < count; i++) { CFNumberRef value = CFArrayGetValueAtIndex(values, i); double temp = 0.0; CFNumberGetValue(value, kCFNumberDoubleType, &temp); // NSLog(@"value = %lf\n", temp); - //printf("%0.1lf, ", temp); - if(temp > 0) - accumTemp+=temp; + printf("%0.1lf, ", temp); } - printf("%0.0lf", accumTemp/count); } void dumpNames(CFArrayRef names, char *cat) @@ -233,41 +188,40 @@ int main () { // kHIDUsage_AppleVendorPowerSensor_Voltage = 0x0003, // See IOHIDFamily/AppleHIDUsageTables.h for more information // https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-701.60.2/IOHIDFamily/AppleHIDUsageTables.h.auto.html - + CFDictionaryRef currentSensors = matching(0xff08, 2); CFDictionaryRef voltageSensors = matching(0xff08, 3); CFDictionaryRef thermalSensors = matching(0xff00, 5); // 65280_10 = FF00_16 - // thermalSensors's PrimaryUsagePage should be 0xff00 for M1 chip, instead of 0xff05 - // can be checked by ioreg -lfx - + // I change it to 0xff00, due to ioreg -dlx + CFArrayRef currentNames = getProductNames(currentSensors); CFArrayRef voltageNames = getProductNames(voltageSensors); CFArrayRef thermalNames = getProductNames(thermalSensors); - - + + // printf("freq, v_bat, a_bat, temp_bat"); // dumpNames(voltageNames, "V"); // dumpNames(currentNames, "A"); - //dumpNames(thermalNames, "C"); - //printf("\n"); fflush(stdout); - - //while (1) { + dumpNames(thermalNames, "C"); + printf("\n"); fflush(stdout); + + while (1) { CFArrayRef currentValues = getPowerValues(currentSensors); CFArrayRef voltageValues = getPowerValues(voltageSensors); CFArrayRef thermalValues = getThermalValues(thermalSensors); // printf("%lld, ", my_mhz()); // mybat(); - + // dumpValues(voltageValues); // dumpValues(currentValues); dumpValues(thermalValues); printf("\n"); fflush(stdout); - usleep(500000); // usleep - suspend execution for microsecond intervals + usleep(1000000); // usleep - suspend execution for microsecond intervals CFRelease(currentValues); CFRelease(voltageValues); CFRelease(thermalValues); - //} - + } + #if 0 NSLog(@"%@\n", CFArrayGetValueAtIndex(currentNames, 0)); NSLog(@"%@\n", CFArrayGetValueAtIndex(currentNames, 1)); @@ -276,9 +230,9 @@ int main () { NSLog(@"%@\n", CFArrayGetValueAtIndex(thermalNames, 0)); NSLog(@"%@\n", CFArrayGetValueAtIndex(thermalNames, 1)); #endif - + // IOHIDEventRef event = IOHIDServiceClientCopyEvent(alssc, 25, 0, 0); - + return 0; } #endif