2011-10-06 11 views
1

プラットフォーム(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 
}; 
+0

あなたが修正を見つけて、それを動作させることができたことがありますか?私はまったく同じ目標で同じことをしようとしてきましたが、あなたと同じくらいの距離になっていません。 –

答えて

0

私は最初、同じことを運がなかったのですが、「pmset noidle」が見つかりました。 (​​)これはアサーションを発生させますが、これは正しいものではありません。関数prevent_idle_sleepを見てください。

IOPMAssertionCreateWithName(kIOPMAssertionTypeNoIdleSleep, 
        kIOPMAssertionLevelOn, 
        CFSTR("pmset prevent sleep"), 
        &neverSleep)) 

変更この

IOPMAssertionCreateWithName(kIOPMAssertionTypeInhibitCharging, 
        kIOPMAssertionLevelOn, 
        CFSTR("prevent charging..."), 
        &neverSleep)) 

及びこれらの定義を追加:

// Disables battery charging (requires root to initiate) 
#define kIOPMAssertionTypeInhibitCharging  CFSTR("ChargeInhibit") 
#define kIOPMChargeInhibitAssertion    kIOPMAssertionTypeInhibitCharging 
関連する問題