An bei externer Stromversorgung

  • O.T.


    @jwoegerbauer


    die Antworten sind oft nach bestem Wissen geschrieben, und
    Pitterchen ist in seinem Forum auch keiner der einen Hängen lässt,


    ich habe mich auch schon über einige Meinungsäusserungen von Usern hier im Forum geärgert, aber die Leute die Ahnung haben, sind hier länger aktiv als andere , die nur mal etwas sagen wollen, aber nicht viel wissen. gerade bei dir sehe ich wissen, welches auch für gopal 5 wichtig ist, und die zusammenarbeit hier im Forum passt schon.


    Schlaf mal eine Nacht darüber.: drink :)


    rohoel


    post ist da


    Stefan

  • @jwoegerbauer
    Sorry, aber ich verstehe Dich jetzt nicht! Ich habe mir mehrmals die entspr. Postings durchgelesen und kann nicht feststellen, dass Pitterchen Dir (und nur Dir!) in irgendeiner Weise 'über den Mund gefahren' ist.
    Er hat doch recht sachlich seine Meinung zum Thema geäußert und ich vermute mal, dass er auch zu einem kleinen Teil Recht hat. Die Registry dient evtl. der Steuerung des ganzen Szenarios, mit ein paar Einträgen darin werden Threads/Tasks, die im Hintergrund laufen und bspw. den USB-Port auf Stromzufuhr scannen, entspr. gesteuert, um ggfs. alle Komponenten wieder kontrolliert mit Strom zu versorgen. Daher auch das Ausgangsmenue im Cleanup-Menue, vor einem ReBoot. ;)


    Ich möchte jetzt nicht soweit gehen und schreiben, dass Du aufgrund der anderen Situation (und da kann ich Pitter's Reaktion durchaus verstehen) etwas dünnhäutig reagiert hast, aber Dir gegenüber hat er doch aus seiner Sicht fair argumentiert.
    Nur, weil man mal anderer Meinung ist (und ein tieferer Argumentenaustausch hat ja eigentlich noch garnicht stattgefunden), schmeißt man doch nicht gleich die Flinte ins Korn! ;)


    Auch ich schreibe manchmal meine Postings recht knapp und kurz (ohne böse Absicht!), wo ich mir im Nachhinein auch denke, Mensch, dass hättest Du auch anders formulieren können. Beim Austausch unter 4 Augen können die Dinge sofort korrigiert werden. Hier hattest Du Pitter's Stellungnahme noch gar nicht abgewartet. ;)


    Schlaf am besten noch mal drüber und überleg's Dir nochmal. : drink


  • Hallo jwoegerbauer,


    ich habe keine Ahnung, was ich Dir getan habe, aber Deine Reaktion ist vermutlich auf einen Irrtum zurück zu führen.


    Ich habe mich nur gegen eine Unverschämtheit gewehrt, die sich ein anderer User erlaubt hat. Keinerlei Unmut Dir gegenüber... warum auch?


    In der Vergangenheit hat es viele solcher Situationen gegeben, in denen Leute unverhältnismässig angegriffen wurden. Wenn man da nicht Tacheles redet, verstehen dies Leute das leider nicht.


    Ich hab hier im Forum fast ein Jahr keine Beiträge geschrieben, aus genau diesen Gründen...


    Selbstverständlich stelle ich Dir die komplette REG zur Verfügung, meine Ansicht der Dinge ändert sich aber nicht.


    Klar... ich habe mal behauptet, dass es nur an der Registry liegen kann, weil ich genau wie du davon ausgegangen war, dass "nur" in der Reg gefunden werden muss, welcher "Schalter" gesetzt werden muss.... und ich weiss schon was ein Registry-Eintrag ist... ;)


    Mittlerweile, nach Kauf des P4445, der genau dieses "Auto-Boot on DC" bereits im CleanUp anbietet, habe ich meine Meinung geändert. Ich denke, das gesteht man jemandem zu, dass er seine Meinung revidiert und gehe sogar so weit zu behaupten, dass das im "ROM" drin steckt. Kann sein dass ich mich irre... um so besser!!! Da habe ich sogar sehr gerne Unrecht!!!


    Wenn ich Dir die REG schicken soll, lass es mich bitte wissen, ic schicke sie Dir dann gerne per Mail. Eine komplette REG hat in einem öffentlichen Forum nichts zu suchen... meiner Meinung nach, alleine schon um Missbrauch damit zu verhindern.


    Nochmal... ich habe weder dich angepuupt noch angreifen wollen. sollte dieser Eindruck entstanden sein, so entschuldige ich mich bei Dir.


    Zu meiner Reaktion auf diesen anderen "User" stehe ich jedoch nach wie vor.
    Viele hier und in den anderen Foren verbringen einen Grossteil ihrer Freizeit damit, anderen zu helfen. Die meisten von uns helfen so viel sie können und dürfen sich auch mal irren. Wenn nicht... dann kann jedes Forum was ich kenne den Laden zu machen, weil es dann zum Experten-Forum gradiert wird und sich nicht um ein Hilfe-zur-Selbsthilfe-Forum handelt... und genau in einem solchen Forum befinden wir uns gerade.


    Solche "User" aber verleiden jedem überhaupt einen Hilfeversuch zu starten, wenn so was Usus wird. Deshalb meine harsche und unmissverständliche Aussage, die wohl überlegt war. Wehret den Anfängen... das Forum ist gerade aus so einen Loch raus und mir fing es gerade an hier wieder Spass zu machen...


    Also... bei Interesse an der exportierten Registry vom 4445 schreib mir ne PN mit Deiner Mail-Adresse, ich schicke dir dann zu treuen Händen die Datei.

    Gruß
    Pitter


    ...ich bin nicht die Signatur... ich putz hier nur! ;D

  • Hallo Pitterchen,



    ich habe gegen niemanden hier im Forum irgend etwas, ich möchte nur nicht, dass mir
    das Gleiche widerfährt wie Dir.


    Auch ich bin nicht unfehlbar, mache blamable Fehler - und ich ertrage auch entsprechende
    Rügen. Trotzdem: ich werde es mir künftig zweimal überlegen, ob ich einen "hilfreichen"
    Beitrag beisteuere.


    Zum aktuellen Thema werde ich nicht mehr beitragen, habe ich dessen Sinn doch von Anfang
    an nicht richtig durchschaut: geht's um einen Screen-Saver, einen Stromsparer, oder um
    ganz etwas anderes?


    Aber etwas Gutes hat es doch: das Thema power management, bzw. wie man das handeln kann,
    (device driver, etc) hat mich jetzt in den Bann gezogen


    1) den source code der PM.dll habe ich mir besorgt,


    2) ebenso einen ARM-spezifischen compiler (TCC),


    3) und zusätzlich einen ARM-Emulator für meinen Vista Hobel


    Vielleicht komme ich der Sache irgendwann auf den Grund, aber nicht heute, auch nicht
    morgen oder übermorgen, denn auch ich habe grundsätzlich etwas anderes zu tun. Und wenn
    ich es schaffen sollte, dann lasse ich es hier im Forum alle wissen. Versprochen.

  • Zitat

    Original von jwoegerbauer


    .... Und wenn
    ich es schaffen sollte, dann lasse ich es hier im Forum alle wissen. Versprochen.


    :) :tup

  • Hallo jwoegerbauer,


    das ist eine gute Entscheidung von Dir!


    Im Einstieg war dieser Thread allerdings genau auf dieses Thema abgezielt:


    Einschalten des PNA, wenn es Strom am USB bekommt.


    Titel des Themas ist ja auch " An bei externer Stromversorgung"


    Leider sind wir davon sehr schnell weg gekommen und in die Schiene "Strom sparen" abgedriftet. Wohl auch, weil da Zwischenfragen rein gerutscht sind, die mit dem Ursprungsthema recht wenig zu tun hatten.


    ...aber das ist recht häufig der Fall, damit muss man in Foren leben, oder kosequent solche Beiträge abtrennen.


    Ich hoffe nur, dass die PM.exe im PNA identisch ist mit Deinem Sourcecode, denn die neue PM.exe dann auf den PNA zu bekommen sehe ich als äusserst schwierig an ohne ein Flash-ROM.


    Ich drück die Daumen, dass Du das hin bekommst. : drink

    Gruß
    Pitter


    ...ich bin nicht die Signatur... ich putz hier nur! ;D



  • Hallo Pitterchen ( und alle anderen Interessierten),


    SetSystemPowerState(NULL, POWER_STATE_ON, 0);


    Dieser simple Win32-API-Funktionsaufruf weckt das PNA auf und bringt es ins volle Leben zurück. Das ist es, was scheinbar gewollt ist.


    Ein Ändern des Power Mangers ist nicht erforderlich, es reicht ein wrapper
    für genannten Funktionsaufruf.


    Also bis dann irgendwann ...


  • Mal (m)eine Laienhafte Frage dazu. ;)
    Ist es möglich Mort oder Koord als Wrapper zu benutzen um diese Funktion aufzurufen?
    Oder was braucht man in unserem Fall konkret dafür.

  • Zitat

    Original von Hepe


    Mal (m)eine Laienhafte Frage dazu. ;)
    Ist es möglich Mort oder Koord als Wrapper zu benutzen um diese Funktion aufzurufen?
    Oder was braucht man in unserem Fall konkret dafür.


    DAS GANZE GEHT WEDER MIT MORT NOCH MIT KOORD ALS "WRAPPER". LEIDER ...
    1.


    Eine Anwendung, hier das geplante Auto_On_Off Windows CE 5.0 Programm, muss natürlich
    beim Booten des PNA geladen, muss also unter HKEY_LOCAL_MACHINE\Init in der Registry eingetragen
    werden.


    z.Bsp.


    Launch98 \My Flash Disk\SystemProgs\Auto_On-Off.exe
    Depend98 0x14


    0x14 Hex = 20 Dezimal = Launch20 = "device.exe"


    Device.exe muss geladen sein, um Zugriff auf den USB-port zu haben.


    2.


    Das geplante Auto_On_Off wird periodisch die beiden Systemnachrichten


    NOTIFICATION_EVENT_OFF_AC_POWER // The units charger is disconnected
    NOTIFICATION_EVENT_ON_AC_POWER // The units charger is connected



    abfangen und dann entsprechend reagieren, sprich das PNA in den stand-by Modus bringen
    oder es hieraus erwecken.



    JETZT LASST MIR DOCH ETWAS ZEIT !!! AUF EIN, ZWEI WOCHEN KOMMT ES JETZT AUCH NICHT MEHR AN.

  • Zitat

    Original von jwoegerbauer
    JETZT LASST MIR DOCH ETWAS ZEIT !!! AUF EIN, ZWEI WOCHEN KOMMT ES JETZT AUCH NICHT MEHR AN.


    ok, ich bin ruhig und weg... ;)

  • Zitat

    Original von jwoegerbauer
    JETZT LASST MIR DOCH ETWAS ZEIT !!! AUF EIN, ZWEI WOCHEN KOMMT ES JETZT AUCH NICHT MEHR AN.


    Kein Thema, jetzt haben wir solange gewartet, da kommt's auch auf 1 Monat nicht an! ;) : drink :tup

  • Hallo Hepe, hallo Ralf25


    so ungefähr wird das Auto_On-Off Programm im Kern wohl aussehen
    (C++ - Notation)



    //////////////////////////////////////////////////////////////////////////////////
    //
    // AutoOnOff
    //
    // jwoegerbauer
    // August xx,2009
    //
    //////////////////////////////////////////////////////////////////////////////////


    int _stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow) {
    {
    int iWaitTime = 60 * 1000; // 1 minute
    CBattery b;
    CRegistry reg( NULL ); // No special flags


    // now attempt to open the key


    if ( reg.Open("Software\\www.pocketnavigation.de\\PNA\WinCE 5.0\\Tools\\AutoOnOff",
    HKEY_CURRENT_USER) ) {



    if ( reg["WaitTime"].Exists() ) {
    // value does exist
    iWaitTime = reg["WaitTime"];


    } else {
    // value does not exist
    reg["WaitTime"] = iWaitTime;


    }


    reg.Close();
    }


    // the run-for-ever loop


    while(1)
    {
    if (b.ReloadSystemPowerStatus())
    {
    switch(b.ACLineStatus())
    {
    case CBattery::ACLS_ONLINE:
    SetSystemPowerState(NULL, POWER_STATE_ON, 0);
    break;
    case CBattery::ACLS_OFFLINE:
    SetSystemPowerState(NULL, POWER_STATE_OFF, 0);
    break;
    default:
    // error handling goes here
    break;
    }
    }


    // yield


    Sleep(iWaitTime);


    }


    return 0;
    }


    Ich bin jetzt dann wieder für eine Woche weg.

  • Mhm, jwoegerbauer, hast Du nicht Deine IDE eh grade angeschmissen und könntest uns eine *.exe stricken? ;) Oder hast Du das erstmal so in einem Editor runtergehackt?


    Zitat

    Original von jwoegerbauer
    Ich bin jetzt dann wieder für eine Woche weg.


    Aber wenn's pressiert, dann hat das auch noch Zeit bis zu Deiner Rückkehr.

  • Hallo zusammen,



    meine Idee von einem Programm


    Zitat


    ... so ungefähr wird das Auto-On-Off Programm im Kern wohl aussehen ...


    basierte auf Funktionen des .Net CompactFramework 3.5 für Windows CE 5.0, was aber vermutlich
    kein Mensch auf seinem Medion-PNA hat.


    Übrigens, eine gleichlautende Diskussion fand bereits hier statt:


    http://www.pda-dev.de/topic.asp?TOPIC_ID=38&SearchTerms=CeRunAppAtTime




    A:


    Ich werfe hiermit das Handtuch: nicht weil ich es mir nicht zutrauen würde, das wake-up
    Problem software-mäßig lösen zu können, sondern weil mir der Zeitaufwand (Vertrautmachen mit Compiler,
    ARM-Emulator, Schreiben und Testen) hierzu viel zu groß ist - habe ich selbst doch gar kein Interesse
    an solch einer Lösung.



    Wie es grundsätzlich geht, ist u.a. hier nachlesbar:


    http://msdn.microsoft.com/en-us/library/ms836788.aspx


    SYSTEM AND METHOD FOR RECEIVING WIRELESS INFORMATION ON A MOBILE DEVICE
    European Patent EP1058874
    http://www.freepatentsonline.com/EP1058874.html


    Was die ominösen Pitterchen Registry-Einträge anbelangt - man kann hier etwas dazu nachlesen:


    http://blogs.msdn.com/ce_base/…-ce-power-management.aspx
    http://www.e-consystems.com/bl…windows-ce-power-manager/



    Vielleicht findet sich hier im Forum jemand, der diesen Part übernehmen will und kann.




    B:


    Hier mein - völlig ungetestetes - skeleton (Gerippe) einer möglichen, nativen software-mäßigen wake-up
    Lösung (C - Notation):



    #define MAX_MSG_SIZE 1024


    int _tmain(int argc, _TCHAR* argv[])
    {


    HANDLE hPowerMsgQueue = NULL;
    HANDLE hPowerNotifications = NULL;


    RegisterForPowerEventNotifications(&hPowerNotifications, &hPowerMsgQueue);


    while(WaitForPowerEventNotification(hPowerNotifications, hPowerMsgQueue))
    {
    // spin forever unless we have an error
    }


    UnregisterForPowerEventNotifications(hPowerNotifications, hPowerMsgQueue);


    return 0;
    }


    // creates a queue where Power Manager notifications can go, and
    // starts a thread that will wait for messages to appear on
    // that queue


    void RegisterForPowerEventNotifications(HANDLE * phPowerNotifications, HANDLE * phPowerMsgQueue)
    {
    // define the queue we will create for PM
    // notification messages


    MSGQUEUEOPTIONS mqo;
    size_t sizeMQO = sizeof(MSGQUEUEOPTIONS)
    ZeroMemory(mqo, sizeMQO);


    // initialise the structure members
    mqo.dwSize = sizeMQO;
    // allocate message buffers on demand and free after reading
    mqo.dwFlags = MSGQUEUE_NOPRECOMMIT;
    // number of messages to allow to build up on queue
    mqo.dwMaxMessages = 5;
    // max size of a message
    mqo.cbMaxMessage = MAX_MSG_SIZE;
    // we will only be getting messages from the queue
    mqo.bReadAccess = TRUE;


    // create the message queue and store handle
    *phPowerMsgQueue = CreateMsgQueue("9285ac65-c382-458c-8027-58f5b7d1bee4", &mqo);


    // register for AC_CONNECTION and AC_DISCONNECTION events
    *phPowerNotifications = RequestPowerNotifications( *phPowerMsgQueue, PBT_TRANSITION | PBT_ RESUME | PBT_POWERINFOCHANGE);
    }


    BOOL WaitForPowerEventNotification(HANDLE hPowerNotifications, HANDLE hPowerMsgQueue)
    {
    // wait for notifications
    DWORD ret = WaitForSingleObject(hPowerMsgQueue, INFINITE);
    if(ret != WAIT_OBJECT_0)
    {
    int err = GetLastError();
    // this will cause a full app exit
    return FALSE;
    }


    TCHAR message[MAX_MSG_SIZE];
    DEVDETAIL *detail = (DEVDETAIL*)message;
    ZeroMemory(message, MAX_MSG_SIZE);


    DWORD read = MAX_MSG_SIZE;
    DWORD flags = 0;


    // get the message off the queue
    if(! ReadMsgQueue(hPowerMsgQueue, detail, read, &read, 0, &flags))
    {
    // go back and wait for another notification
    return TRUE;
    }


    if(detail->fAttached)
    {
    // USB cable inserted
    OnInsert();
    }
    else
    {
    // USB cable removed
    OnRemove();
    }


    return TRUE;
    }


    // informs operating system to stop putting PM notification
    // messages on our message queue, and close the queue handle


    void UnregisterForPowerEventNotifications(HANDLE hPowerNotifications, HANDLE hPowerMsgQueue)
    {


    if (hPowerNotifications != NULL)
    {
    StopPowerNotifications(hPowerNotifications);
    }


    if (hPowerMsgQueue != NULL)
    {
    CloseMsgQueue(hPowerMsgQueue)
    }
    }


    // sends keystroke(s) to operating system
    //
    // Note:
    // The system makes a distinction between system keystrokes and nonsystem keystrokes.
    // System keystrokes produce system keystroke messages, such as WM_SYSKEYDOWN and WM_SYSKEYUP.
    // Nonsystem keystrokes produce nonsystem keystroke messages, such as WM_KEYDOWN and WM_KEYUP.
    // A system keystroke message is generated when the user types a key in combination with the ALT key
    //
    // Windows CE offers only the core set of virtual-key codes that are found on all keyboards.
    // http://msdn.microsoft.com/en-us/library/ms927178.aspx


    void OnInsert(void)
    {
    // Turn on the device
    const BYTE VK_OFF = 0xDF; // Power button
    const BYTE KEY_ALT_BUTTON = 0x12;


    // The keybd_event API is a simple but handy API. You can do anything you can do with
    // your keyboard using this function
    // See also:
    // http://msdn.microsoft.com/en-us/library/ms927178.aspx


    SendKey(KEY_ALT_BUTTON);
    SendKey(VK_OFF);
    }


    void OnRemove(void)
    {
    // Turn off the device
    const BYTE VK_OFF = 0xDF; // Power button
    const BYTE KEY_ALT_BUTTON = 0x12;


    SendKey(KEY_ALT_BUTTON);
    SendKey(VK_OFF);
    }


    static void SendKey(BYTE key)
    {
    const int KEYEVENTF_KEYUP = 0x02;
    const int KEYEVENTF_KEYDOWN = 0x00;
    keybd_event(key, 0, KEYEVENTF_KEYDOWN, 0);
    keybd_event(key, 0, KEYEVENTF_KEYUP, 0);
    }




    C:


    Wenn nur eine screen-saver Lösung gewünscht ist, ist dies mit Mort einfach zu realisieren,
    wie hier kurz aufgezeigt wird:



    ############################################################
    #
    # TOGGLE_STANDBY_LOOP.mscr
    # 2009-08-15
    # jwoegerbauer
    # GNU General Public License (GPL), Version 2, June 1991
    #
    # adjust to your needs
    Set WAIT_MINUTES, 2
    #
    #### !!! do not change anything below this line !!! #######
    #
    Set NAVIGATOR, "GoPal Navigator"
    Set DISPLAY_OFF_EXE, \
    "\My Flash Disk\SystemProgs\ScreenOff.exe"
    Set CLOSE_ALL_EXE, \
    "\My Flash Disk\SystemProgs\CloseAll.exe"
    Set MENU_EXE, \
    "\My Flash Disk\navigation\menu\menu.exe"
    Sleep 30
    #
    #
    ErrorLevel = "off"
    If (not FileExists(%DISPLAY_OFF_EXE%))
    #
    # go out
    Exit
    EndIf
    #
    # the everlasting loop
    While(1)
    Repeat(%WAIT_MINUTES%)
    Sleep 60000
    EndRepeat
    #
    If( BatteryPercentage() < 6)
    If (sleeping)
    Call("DoAwake")
    EndIf
    #
    # leave
    Exit
    EndIf
    #
    # externe Stromversorgung ?
    Switch(ExternalPowered()))
    Case 0
    sleeping = 1
    Call("DoSleep")
    Case 1
    sleeping = 0
    Call("DoAwake")
    EndSwitch
    #
    # stop ourselves if navigation has terminated
    If ( not WndActive(%NAVIGATOR%))
    If (sleeping)
    Call("DoAwake")
    EndIf
    #
    # leave
    Exit
    EndIf
    EndWhile
    #
    #
    Exit
    #
    ##########################################################
    #
    Sub DoSleep
    ErrorLevel = "off"
    If( FileExists(%DISPLAY_OFF_EXE%) )
    #
    # Automatisches Ausschalten verhindern
    IdleTimerReset
    #
    # soviele Programme wie möglich schließen
    # (u.a. auch das Desktop-Menü)
    ErrorLevel = "off"
    If ( FileExists(%CLOSE_ALL_EXE%) )
    RunWait(%CLOSE_ALL_EXE%)
    EndIf
    #
    # Bildschirm ausschalten
    # (nur noch ganz geringer Stromverlust)
    Run(%DISPLAY_OFF_EXE%)
    EndIf
    EndSub
    #
    ##########################################################
    #
    Sub DoAwake
    If ( not WndExists ("Menu"))
    #
    # Desktop-Menü wieder starten
    Run(%MENU_EXE%)
    EndIf
    #
    # Bildschirm wieder einschalten
    MouseClick(1,1)
    Sleep 100
    MouseClick(1,1)
    EndSub
    #
    ##########################################################




    Tut mir leid, wenn ich Hoffnungen geweckt haben sollte, aber ich habe hier mehrmals schon
    betont: VON WEM AUCH IMMER!