diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f5861ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.DS_Store +/sensors/ +/bin/ +/curses/ +/info/ +temp_sensor \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2e790ec --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +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 deleted file mode 100644 index e59fc72..0000000 --- a/monitor.cpp +++ /dev/null @@ -1,114 +0,0 @@ -#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 deleted file mode 100644 index 35ed260..0000000 Binary files a/screen_record.mp4 and /dev/null differ diff --git a/screen_shot.png b/screen_shot.png deleted file mode 100644 index 9bfb735..0000000 Binary files a/screen_shot.png and /dev/null differ diff --git a/temp_sensor.m b/temp_sensor.m index 79f9d87..aa419d1 100644 --- a/temp_sensor.m +++ b/temp_sensor.m @@ -1,9 +1,35 @@ -// -// main.m -// sensors -// -// Created by Yang on 11/26/20. -// +// 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. #include @@ -27,16 +53,17 @@ 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; } @@ -46,10 +73,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 @@ -73,13 +100,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)); @@ -97,14 +124,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)); @@ -118,16 +145,34 @@ 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); + //printf("%0.1lf, ", temp); + if(temp > 0) + accumTemp+=temp; } + printf("%0.0lf", accumTemp/count); } void dumpNames(CFArrayRef names, char *cat) @@ -188,40 +233,41 @@ 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 - // I change it to 0xff00, due to ioreg -dlx - + // thermalSensors's PrimaryUsagePage should be 0xff00 for M1 chip, instead of 0xff05 + // can be checked by ioreg -lfx + 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(1000000); // usleep - suspend execution for microsecond intervals + usleep(500000); // usleep - suspend execution for microsecond intervals CFRelease(currentValues); CFRelease(voltageValues); CFRelease(thermalValues); - } - + //} + #if 0 NSLog(@"%@\n", CFArrayGetValueAtIndex(currentNames, 0)); NSLog(@"%@\n", CFArrayGetValueAtIndex(currentNames, 1)); @@ -230,9 +276,9 @@ int main () { NSLog(@"%@\n", CFArrayGetValueAtIndex(thermalNames, 0)); NSLog(@"%@\n", CFArrayGetValueAtIndex(thermalNames, 1)); #endif - + // IOHIDEventRef event = IOHIDServiceClientCopyEvent(alssc, 25, 0, 0); - + return 0; } #endif