プラットフォーム(OS X 10.6.8) - [MacBook Proの - デスクトップには適用されません - 私は、バッテリーの取り扱いに対処したいと、これは重要である]はChargeInhibitアサーションの作成(OS X 10.6.8)
5年以上でC/C++を書いていないので、私が見ていない基本的な間違いを犯した場合、私に許してください。リンゴのAPIがあなたに対処してほしい方法に完全に従っていませんそれで、これは私の質問に関係しています。基本的には、自分のコマンドでACアダプタからの充電を禁止したいので、ノートパソコンを充電するかどうかを、使用中でプラグインしているかどうか選択できるようにしたいと思います。この、私は最初にハードウェアレベルにあったとソフトウェアから変更することができませんでした何かとしてそれをオフに書かれた時に持っていたが、その後、私は有望なものに出会っ:
あなたは、ターミナルウィンドウを開き、実行した場合
pmset -g assertionslog
あなたはアサーションのリストを取得し、それぞれに対して0または1を取得して、アサーションをアサートしたプロセスがあるかどうかを示します。最初のものはChargeInhibitと題されており、ソフトウェアレベルではこれが欲しいと思っているものがいくつか見つかった。私はそれをどのようにアサートするかを理解する必要があります。
リンゴソースアーカイブのファイルからSetActive.c (link)という名前のファイルをコピーしました。私のXCodeプロジェクトにsendSmartBatteryCommand関数をコピーし、他のヘッダをリンクして定義をコピーして正しくコンパイルするまで時間を費やしました。ここにコピーされた機能は次のとおりです。
// The copied function,
// modified very slightly:
// to return a success/fail value instead of void
kern_return_t sendSmartBatteryCommand(uint32_t which, uint32_t level)
{
io_service_t sbmanager = MACH_PORT_NULL;
io_connect_t sbconnection = MACH_PORT_NULL;
kern_return_t kret = 99;
uint32_t output_count = 1;
uint64_t uc_return = kIOReturnError;
uint64_t level_64 = level;
// Find SmartBattery manager
sbmanager = IOServiceGetMatchingService(MACH_PORT_NULL,
IOServiceMatching("AppleSmartBatteryManager"));
if(MACH_PORT_NULL == sbmanager) {
goto bail;
}
kret = IOServiceOpen(sbmanager, mach_task_self(), 0, &sbconnection);
if(kIOReturnSuccess != kret) {
goto bail;
}
kret = IOConnectCallMethod(
sbconnection, // connection
which, // selector
&level_64, // uint64_t *input
1, // input Count
NULL, // input struct count
0, // input struct count
&uc_return, // output
&output_count, // output count
NULL, // output struct
0); // output struct count
bail:
if (MACH_PORT_NULL != sbconnection) {
IOServiceClose(sbconnection);
}
if (MACH_PORT_NULL != sbmanager) {
IOObjectRelease(sbmanager);
}
return kret;
}
私が阻害充流入無効化するためのアサーションを送信するためにそれを使用しようとすると、成功はバック値はありませんが、pmsetからのログはすべての変更を示していない、とどちらも行い得ます私のバッテリー充電/充電の実際の状態。
"AppleSmartBatteryManager"から無意味な言葉に変わるサービスの名前を変更して、関数が失敗を返すかどうかを確認しようとしました。実際のサービスに接続していることを示しています。
できるだけ簡単にこれを達成するためのヒントを教えてください。
ところで、PowerSourceプロジェクトのAppleSmartBatteryManagerをアップルのソースサイトのソースパッケージから再コンパイルしようとしましたが、XCodeの方がずっと多くのエラーがあります。私は既存のサービスとやりとりしようとしていますが、AppleSmartBatteryManagerソースを自分のプロジェクトと一緒に再コンパイルしないようにしています。
EDIT:ところで は、この関数を呼び出して、私の例です。
「」パラメータのオプションは、私のヘッダファイルで列挙型で定義されていint CInh()
{
kern_return_t kret = sendSmartBatteryCommand(kSBUCChargeInhibit, 255); // zero:uninhibit, non-zero:inhibit
if(kret == KERN_SUCCESS)
return 1;
else
return 0;
}
(ものsetActiveからコピー.c):
enum {
kSBUCInflowDisable = 0,
kSBUCChargeInhibit = 1
};
あなたが修正を見つけて、それを動作させることができたことがありますか?私はまったく同じ目標で同じことをしようとしてきましたが、あなたと同じくらいの距離になっていません。 –