void diag (char *fmt, ...) { va_list args; char line[1024]; va_start (args, fmt); vsprintf (line, fmt, args); va_end (args); WinPaintChars (line, strlen (line), 0, 0); DbgMessage (line); SysTaskDelay (sysTicksPerSecond/4); }
void CScoringForm::OnDraw() { HostTraceOutputTL(sysErrorClass, "OnDraw"); Boolean won_bid = false; Int16 high_p = -1, low_p = -1, jack_p = -1, game_p = -1; Card::face_t high_c, low_c; Int16 points[3]; Int16 old_points[3]; points[0] = gManager->scores[0]; points[1] = gManager->scores[1]; points[2] = gManager->scores[2]; old_points[0] = gManager->scores[0]; old_points[1] = gManager->scores[1]; old_points[2] = gManager->scores[2]; Boolean smudge = false; won_bid = gManager->trk->CalculateGamePoints(&high_p, &low_p, &jack_p, &game_p, &high_c, &low_c, &smudge ); if ( gManager->CutThroat() == false ) { if ( smudge ) { switch ( (*gManager->tbl->winning_bidder)->playerIndex ) { case 0: case 2: points[0]++; break; case 1: case 3: points[1]++; break; } } switch( high_p ) { case 0: case 2: points[0]++; break; case 1: case 3: points[1]++; break; } switch( low_p ) { case 0: case 2: points[0]++; break; case 1: case 3: points[1]++; break; } switch( game_p ) { case 0: case 2: points[0]++; break; case 1: case 3: points[1]++; break; } switch( jack_p ) { case 0: case 2: points[0]++; break; case 1: case 3: points[1]++; break; } } else { points[high_p]++; points[low_p]++; if ( game_p != -1 ) { points[game_p]++; } if ( jack_p != -1 ) { points[jack_p]++; } } if ( high_p != -1 ) { high_field.Replace( (const char *)gManager->getPlayer(high_p)->getName() ); } if ( low_p != -1 ) { low_field.Replace( (const char *)gManager->getPlayer(low_p)->getName() ); } if ( jack_p != -1 ) { jack_field.Replace( (const char *)gManager->getPlayer(jack_p)->getName() ); } else { jack_field.Replace("none"); } Card foo(gManager->trk->getTrump(), high_c); Card foo2(gManager->trk->getTrump(), low_c); FormPtr frmP = FrmGetActiveForm(); RectangleType bounds; UInt16 gadgetIndex = FrmGetObjectIndex(frmP, HighCardGadget ); FrmGetObjectBounds(frmP, gadgetIndex, &bounds); foo.Draw(bounds.topLeft.x, bounds.topLeft.y, CPlayerHandGadget::card_width, CPlayerHandGadget::card_height); gadgetIndex = FrmGetObjectIndex(frmP, LowCardGadget ); FrmGetObjectBounds(frmP, gadgetIndex, &bounds); foo2.Draw(bounds.topLeft.x, bounds.topLeft.y, CPlayerHandGadget::card_width, CPlayerHandGadget::card_height); char gamestr[80]; if ( gManager->CutThroat() == false ) { if ( game_p == 1 ) { StrPrintF(gamestr, "E/W team wins, %d - %d", gManager->GetTeamPoints('b'), gManager->GetTeamPoints('a') ); } else if ( game_p == 0 ) { StrPrintF(gamestr, "N/S team wins, %d - %d", gManager->GetTeamPoints('a'), gManager->GetTeamPoints('b') ); } else { StrPrintF(gamestr, "teams tied on points at %d", gManager->GetTeamPoints('a') ); } } else { if ( game_p == 2 ) { StrPrintF(gamestr, "%s wins, %d - %d - %d", (const char *)gManager->players[2]->getName(), gManager->GetTeamPoints('c'), gManager->GetTeamPoints('a'), gManager->GetTeamPoints('b') ); } else if ( game_p == 1 ) { StrPrintF(gamestr, "%s wins, %d - %d - %d", (const char *)gManager->players[1]->getName(), gManager->GetTeamPoints('b'), gManager->GetTeamPoints('a'), gManager->GetTeamPoints('c') ); } else if ( game_p == 0 ) { StrPrintF(gamestr, "%s wins, %d - %d - %d", (const char *)gManager->players[0]->getName(), gManager->GetTeamPoints('a'), gManager->GetTeamPoints('b'), gManager->GetTeamPoints('c') ); } else { StrPrintF(gamestr, "tied on points at %d", gManager->GetTeamPoints('a') ); } } game_field.Replace( gamestr ); char bid_results_str[255]; char bidval[10]; if ( gManager->tbl->bid != 5 ) { StrPrintF(bidval, "%d", gManager->tbl->bid); } else { StrCopy(bidval, "smudge"); } Int16 score_diff; Int16 bidder_score = 0; char other_results[80]; other_results[0] = 0; if ( gManager->CutThroat() == false ) { if ( (*gManager->tbl->winning_bidder)->playerIndex == 1 || (*gManager->tbl->winning_bidder)->playerIndex == 3 ) { score_diff = points[0] - old_points[0]; bidder_score = points[1] - old_points[1]; } else { score_diff = points[1] - old_points[1]; bidder_score = points[0] - old_points[0]; } } else { bidder_score = points[(*gManager->tbl->winning_bidder)->playerIndex] - old_points[(*gManager->tbl->winning_bidder)->playerIndex]; } if ( won_bid ) { StrPrintF(bid_results_str, "%s bid %s and won %d\n", (const char *)(*gManager->tbl->winning_bidder)->getName(), bidval, bidder_score ); } else { StrPrintF(bid_results_str, "%s bid %s and lost\n", (const char *)(*gManager->tbl->winning_bidder)->getName(), bidval ); if ( gManager->CutThroat() == false ) { switch ( (*gManager->tbl->winning_bidder)->playerIndex ) { case 0: case 2: // points[0] += (-1 * gManager->tbl->bid); points[0] = old_points[0] + (-1 * gManager->tbl->bid); break; case 1: case 3: // points[1] += (-1 * gManager->tbl->bid); points[1] = old_points[1] + (-1 * gManager->tbl->bid); break; } } else { // points[(*gManager->tbl->winning_bidder)->playerIndex] = -1 * gManager->tbl->bid; points[(*gManager->tbl->winning_bidder)->playerIndex] = old_points[(*gManager->tbl->winning_bidder)->playerIndex] + (-1 * gManager->tbl->bid); } } if ( gManager->CutThroat() == false ) { char other_team[4]; if ( (*gManager->tbl->winning_bidder)->playerIndex == 1 || (*gManager->tbl->winning_bidder)->playerIndex == 3 ) { StrCopy(other_team, "N/S"); } else { StrCopy(other_team, "E/W"); } if ( score_diff == 0 ) { StrPrintF(other_results, "%s team scored no points", other_team); } else if ( score_diff == 1 ) { StrPrintF(other_results, "%s team scored 1 point", other_team); } else { StrPrintF(other_results, "%s team scored %d points", other_team, score_diff); } StrCat(bid_results_str, other_results); } else { bidder_score = points[(*gManager->tbl->winning_bidder)->playerIndex] - old_points[(*gManager->tbl->winning_bidder)->playerIndex]; if ((*gManager->tbl->winning_bidder)->playerIndex != 0 ) { score_diff = points[0] - old_points[0]; if ( score_diff == 0 ) { StrPrintF(other_results, "%s scored no points\n", (const char *)gManager->players[0]->getName() ); } else if ( score_diff == 1 ) { StrPrintF(other_results, "%s scored 1 point\n", (const char *)gManager->players[0]->getName() ); } else { StrPrintF(other_results, "%s scored %d points\n", (const char *)gManager->players[0]->getName(), score_diff ); } StrCat(bid_results_str, other_results); } if ((*gManager->tbl->winning_bidder)->playerIndex != 1 ) { score_diff = points[1] - old_points[1]; char tmpstr[40]; if ( score_diff == 0 ) { StrPrintF(tmpstr, "%s scored no points\n", (const char *)gManager->players[1]->getName() ); } else if ( score_diff == 1 ) { StrPrintF(tmpstr, "%s scored 1 point\n", (const char *)gManager->players[1]->getName() ); } else { StrPrintF(tmpstr, "%s scored %d points\n", (const char *)gManager->players[1]->getName(), score_diff ); } StrCat(bid_results_str, tmpstr); } if ((*gManager->tbl->winning_bidder)->playerIndex != 2 ) { score_diff = points[2] - old_points[2]; char tmpstr[60]; if ( score_diff == 0 ) { StrPrintF(tmpstr, "%s scored no points", (const char *)gManager->players[2]->getName() ); } else if ( score_diff == 1 ) { StrPrintF(tmpstr, "%s scored 1 point", (const char *)gManager->players[2]->getName() ); } else { StrPrintF(tmpstr, "%s scored %d points", (const char *)gManager->players[2]->getName(), score_diff ); } StrCat(bid_results_str, tmpstr); } } bid_results.Replace( bid_results_str ); RectangleType score_bounds; gadgetIndex = FrmGetObjectIndex(frmP, ScoreDisplayGadget ); FrmGetObjectBounds(frmP, gadgetIndex, &score_bounds); Int16 y = score_bounds.topLeft.y; if ( gManager->CutThroat() ) { CString scores[3]; CString tmp; for ( int i = 0; i < 3; i++ ) { // tmp.Format("%d", gManager->scores[i] + points[i] - old_points[i]); tmp.Format("%d", points[i]); scores[i] = gManager->players[i]->getName() + ": " + tmp + " points"; WinPaintChars(scores[i], StrLen(scores[i]), score_bounds.topLeft.x + 2, y); y += FntLineHeight() + 2; } } else { CString ew_score_str; CString ns_score_str; // ew_score_str.Format("E/W: %d points", gManager->scores[1] + points[1] - old_points[1]); // ns_score_str.Format("N/S: %d points", gManager->scores[0] + points[0] - old_points[0]); ns_score_str.Format("N/S: %d points", points[0]); ew_score_str.Format("E/W: %d points", points[1]); WinPaintChars(ns_score_str, StrLen(ns_score_str), score_bounds.topLeft.x + 2, y ); y += FntLineHeight() + 2; WinPaintChars(ew_score_str, StrLen(ew_score_str), score_bounds.topLeft.x + 2, y); } HostTraceOutputTL(sysErrorClass, "OnDraw done"); }
static Boolean MainFormHandleEvent (EventPtr e) { Boolean handled = false; FormPtr frm; static UInt32 start_sec=0; static UInt32 start_tik; static UInt32 end_sec; static UInt32 end_tik; //static int run = 0; switch (e->eType) { case frmOpenEvent: frm = FrmGetActiveForm(); FrmDrawForm(frm); // resume interrupted count // note now stopWatchPrefs.tik_timestamp != stopWatchPrefs.timestamp // now this does work okay when switching away from app BUT // not when palm is turned off & on but stays in app // I think possibly GetTicks gets ticks from start of app // when palm off the ticks do not increment if (stopWatchPrefs.timestamp != 0) { stopWatchPrefs.tik_timestamp = TimGetSeconds(); start_tik = TimGetTicks(); RunCount(start_tik); } handled = true; break; case menuEvent: MenuEraseStatus(NULL); switch(e->data.menu.itemID) { // TODO add to TestTemp code //case itemBar: case itemRun: if (start_sec == 0) { stopWatchPrefs.tik_timestamp = stopWatchPrefs.timestamp = start_sec = TimGetSeconds(); start_tik = TimGetTicks(); } RunCount(start_tik); break; case itemHold: // break the run loop run = 0; break; case itemStop: // break the run loop run = 0; end_sec = TimGetSeconds(); end_tik = TimGetTicks(); break; case itemClear: // break the run loop run = 0; start_sec = 0; stopWatchPrefs.timestamp = 0; stopWatchPrefs.tik_timestamp = 0; end_tik = 0; drawCount(0); break; case itemPrefs: FrmPopupForm(PrefForm); break; case itemTest1: WinDrawLine(20,20,50,50); //void WinDrawChar (WChar theChar, Coord x, Coord y) ///void WinDrawChars (const Char *chars, Int16 len, Coord x, Coord y) //void WinPaintChar (WChar theChar, Coord x, Coord y) //void WinPaintChars (const Char *chars, Int16 len, Coord x, Coord y) ///opt/palmdev/sdk-5/include/Core/System/Window.h // Font.h WinDrawChar('X',20,50); FntSetFont(symbol11Font); WinDrawChar('Y',40,50); FntSetFont(largeFont); WinDrawChar('Z',60,50); WinDrawChars("large Font",10,80,50); FntSetFont(largeBoldFont); WinDrawChars("large Bold",10,110,50); { char buf[100]; int l=0; UInt32 t = SysTicksPerSecond(); l+=StrPrintF(buf+l, "SysTicksPerSec is %lu", t); FntSetFont(largeBoldFont); WinPaintChars(buf,l,1,20); } if (0){ digiFontType ft; ft.h = 20; ft.w = 16; ft.th = 4; ft.tw = 7; drawHSeg(11,9,ft,WinDrawLineF); drawVSeg(10,10,ft,WinDrawLineF); drawHSeg(11,36,ft,WinDrawLineF); drawVSeg(39,10,ft,WinDrawLineF); } if (0){ digiFontType ft; ft.h = 20; ft.w = 12; ft.th = 4; ft.tw = 7; drawHSeg(11,59,ft,WinDrawLineF); drawVSeg(10,60,ft,WinDrawLineF); drawVSeg(38,60,ft,WinDrawLineF); drawHSeg(11,79,ft,WinDrawLineF); drawVSeg(10,80,ft,WinDrawLineF); drawVSeg(38,80,ft,WinDrawLineF); drawHSeg(11,99,ft,WinDrawLineF); } bigDigit(5,20,'2',WinDrawLineF); bigDigit(40,20,'5',WinDrawLineF); bigDigit(5,70,'7',WinDrawLineF); break; case itemTest2: bigDigit(5,20,'8',WinEraseLineF); bigDigit(40,20,'8',WinEraseLineF); bigDigit(5,70,'8',WinEraseLineF); WinDrawChars("Hello",5,20,80); WinPaintChars("Paint",5,20,110); //Err err; err = TimInit(); { char buf[100]; int l=0; UInt32 s,t; UInt32 hour,min,sec; UInt32 day; // seconds since 1/1/1904 //void TimSetSeconds(UInt32 seconds) // ticks since power on t = TimGetTicks(); s = TimGetSeconds(); l+=StrPrintF(buf+l, "Secs %lu", s); FntSetFont(largeBoldFont); WinPaintChars(buf,l,1,20); l=0; l+=StrPrintF(buf+l, "Ticks %lu", t); FntSetFont(largeBoldFont); WinPaintChars(buf,l,1,40); day = s / (UInt32)(24 * 60 * 60); s = s - day * (24 * 60 * 60); hour = s / (60 * 60); s = s - hour * (60 * 60); min = s / 60; sec = s - min * 60; l=0; l+=StrPrintF(buf+l, "%07d:%02d:%02d:%02d", day, hour,min,sec); FntSetFont(largeBoldFont); WinPaintChars(buf,l,1,60); } break; // call this periodically to hold off auto off // Err EvtResetAutoOffTimer(void) // SystemMgr.h //Err SysTimerCreate(UInt32 *timerIDP, UInt32 *tagP, // SysTimerProcPtr timerProc, UInt32 periodicDelay, UInt32 param) //Err SysTimerDelete(UInt32 timerID) //Err SysTimerWrite(UInt32 timerID, UInt32 value) //Err SysTimerRead(UInt32 timerID, UInt32 *valueP) // SysTaskDelay((100 * SysTicksPerSecond())/1000); case itemOptHelp: FrmHelp(hlpHelp); break; //case itemOptDbgDump: //debugDump(e->eType); //break; case itemOptCopy: FrmHelp(hlpCopy); break; case itemOptAbout: FrmCustomAlert(alertInfo, "stopWatch v" VERSION " not even Alpha. " "Built " __DATE__ ", " __TIME__ ". " "James Coleman http://www.dspsrv.com/~jamesc " "copyleft me.", "", ""); break; } //DEBUGBOX("menuEvent",""); handled = true; break; case ctlSelectEvent: switch(e->data.ctlSelect.controlID) { case btnRun: if (start_sec == 0) { stopWatchPrefs.tik_timestamp = stopWatchPrefs.timestamp = start_sec = TimGetSeconds(); start_tik = TimGetTicks(); } RunCount(start_tik); break; case btnHold: // break the run loop run = 0; break; case btnStop: // break the run loop run = 0; end_sec = TimGetSeconds(); end_tik = TimGetTicks(); break; case btnClear: // break the run loop run = 0; stopWatchPrefs.timestamp = start_sec = 0; stopWatchPrefs.tik_timestamp = 0; end_tik = 0; drawCount(0); break; } break; //case ctlRepeatEvent: //break; case penDownEvent: case penMoveEvent: doPenAction( e->eType, e->screenX, e->screenY, 0, 0); //FrmCustomAlert(alertInfo, "pen down", "ARGSTR1", "ARGSTR2"); break; case penUpEvent: doPenAction( penUpEvent, e->data.penUp.start.x, e->data.penUp.start.y, e->data.penUp.end.x, e->data.penUp.end.y); break; case keyDownEvent: { char buf[1000]; int l=0; l+=StrPrintF(buf+l, "Char: %c %02x\n",e->data.keyDown.chr,e->data.keyDown.chr); buf[l]=0; DEBUGBOX("keyDownEvent",buf); } switch(e->data.keyDown.chr) { case pageUpChr: case pageDownChr: handled = true; break; case prevFieldChr: case nextFieldChr: case '\n': handled = true; break; default: if (!TxtCharIsCntrl(e->data.keyDown.chr)) { handled = true; /* Swallow event */ } break; } break; default: break; } return handled; }
Boolean CBiddingForm::OnNilEvent(EventPtr pEvent, Boolean& bHandled) { if ( gManager->Status() == GetHandBids ) { HighlightActiveBidder(); FormPtr frmP = FrmGetActiveForm(); Int16 player_index = (*gManager->tbl->current_bidder)->playerIndex; // // if this is a human player, we need to render the screen widgets for their bid // if ( player_index == gManager->humanIndex && player_has_bid == false ) { player_hand.Render(true); Int16 current_bid = 0; if ( (*gManager->tbl->dealer)->playerIndex != gManager->humanIndex || ! gManager->dealer_take_bid ) { current_bid = gManager->tbl->high_bid; } else { current_bid = gManager->tbl->high_bid - 1; } if ( (*gManager->tbl->dealer)->playerIndex == gManager->humanIndex && gManager->tbl->high_bid < 2 ) { CtlSetEnabled((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBid4PushButton )), false); CtlSetLabel ((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBid4PushButton )), "-4-"); CtlSetEnabled((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBid3PushButton )), false); CtlSetLabel ((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBid3PushButton )), "-3-"); CtlSetEnabled((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBidPassPushButton )), false); CtlSetLabel ((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBidPassPushButton )), "-Pass-"); } else { switch (current_bid) { case 5: CtlSetEnabled((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBidSmudgePushButton )), false); CtlSetLabel ((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBidSmudgePushButton )), "-S-"); case 4: CtlSetEnabled((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBid4PushButton )), false); CtlSetLabel ((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBid4PushButton )), "-4-"); case 3: CtlSetEnabled((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBid3PushButton )), false); CtlSetLabel ((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBid3PushButton )), "-3-"); case 2: CtlSetEnabled((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBid2PushButton )), false); CtlSetLabel ((ControlType *)FrmGetObjectPtr( frmP, FrmGetObjectIndex( frmP, PlayerBid2PushButton )), "-2-"); } } } // if if ( player_index == 3 && player_has_bid == false ) // // handle processing actual bids here - get one automatically if this player isn't // a human, or if the human has already bid // if ( player_index != gManager->humanIndex || player_has_bid == true ) { Boolean player_did_bid = gManager->GetNextBid(gManager->trk, false ); Int16 tmp_bid = (*gManager->tbl->current_bidder)->Bid(); if ( player_did_bid && gManager->tbl->current_bidder == gManager->tbl->winning_bidder && (tmp_bid >= 2) ) { char x[10]; StrPrintF(x, "bids %d", tmp_bid ); bidstr = x; } else { bidstr = "passes"; } bids[(*gManager->tbl->current_bidder)->playerIndex].Replace(bidstr); // // if we just got the dealer's bid, then we are all done // if ( gManager->tbl->current_bidder == gManager->tbl->dealer ) { // // at this point we need to set trump... // gManager->Status(SetHandTrump); if ( (*gManager->tbl->winning_bidder)->playerIndex == gManager->humanIndex ) { CPlayerTrumpForm frmPlayerTrump; frmPlayerTrump.DoModal(); } FrmDrawForm(frmP); // // ... and display the final results // Card::suit_t foo = (*gManager->tbl->winning_bidder)->Trump(); gManager->tbl->trump = foo; gManager->trk->no_trump_first_trick = (*gManager->tbl->winning_bidder)->NoTrumpFirstTrickP(); MemHandle hRsc; BitmapType* bitmapP; switch ( gManager->tbl->trump ) { case Card::heart: hRsc = DmGetResource(bitmapRsc, HeartBitmapFamily ); break; case Card::diamond: hRsc = DmGetResource(bitmapRsc, DiamondBitmapFamily ); break; case Card::club: hRsc = DmGetResource(bitmapRsc, ClubBitmapFamily ); break; case Card::spade: hRsc = DmGetResource(bitmapRsc, SpadeBitmapFamily ); break; } if ( gManager->trk->no_trump_first_trick ) { FrmCustomAlert(NoTrumpFirstTrickAlert, (*gManager->tbl->winning_bidder)->name, "", ""); } RectangleType bounds; UInt16 gadgetIndex = FrmGetObjectIndex(frmP, BiddingTrumpGadget); FrmGetObjectBounds(frmP, gadgetIndex, &bounds); WinPaintChars("Trump Is: ", StrLen("Trump Is: "), bounds.topLeft.x, bounds.topLeft.y ); ErrFatalDisplayIf(!hRsc, "Could not get bitmap family resource"); bitmapP = (BitmapType*) MemHandleLock(hRsc); WinDrawBitmap (bitmapP, bounds.topLeft.x + 40, bounds.topLeft.y); MemHandleUnlock(hRsc); DmReleaseResource(hRsc); UInt32 hsStatusVersion; if (FtrGet (hsFtrCreator, hsFtrIDNavigationSupported, &hsStatusVersion) == 0) { FrmGlueNavObjectTakeFocus(FrmGetActiveForm(), BiddingOKButton ); } } // if ( dealer bid ) else { // move along to the next player gManager->tbl->current_bidder = gManager->getNextPlayerIter(gManager->tbl->current_bidder); EventType event; event.eType = nilEvent; EvtAddEventToQueue (&event); // pause here // SysTaskDelay(SysTicksPerSecond()); gManager->ShortDelay(); } } // if ( player_index != 3 || player_has_bid == true ) } // if GetHandBids bHandled = false; return true; }
// TODO: use timestamp stored in porefs so if palm turned off // or app switch, stopwatch should continue running void drawCount(UInt32 dtik) { char buf[100]; int l=0; unsigned long int s,hour,min,sec,hs; static unsigned long int lastsec=666; static unsigned long int lastmin=666; if (stopWatchPrefs.showTicks) { l=0; l+=StrPrintF(buf+l, "Ticks %lu", dtik); FntSetFont(largeBoldFont); WinPaintChars(buf,l,1,100); } //ms = dtik / (SysTicksPerSecond()/1000); s = dtik / (SysTicksPerSecond()/100); // for resumption of interrupted timer hs = s % 100; s = s / 100; s += stopWatchPrefs.tik_timestamp - stopWatchPrefs.timestamp; sec = s % 60; s = s / 60; min = s % 60; s = s / 60; hour = s % 60; l=0; l+=StrPrintF(buf+l, "%02d:%02d:%02d:%02d", (int)hour,(int)min,(int)sec,(int)hs); FntSetFont(largeBoldFont); WinPaintChars(buf,l,1,120); // a minute alarm if (sec == 0 && stopWatchPrefs.vol!=0) { int i; for(i=0;i<min%10;i++){ playFreq(sndCmdFrqOn,100+min*4,10,stopWatchPrefs.vol); // freq,maxdur, amp(0 - sndMaxAmp) } } // not wanted every update, every second should do. if (sec != lastsec) { lastsec = sec; switch(stopWatchPrefs.visual) { case btnVisualNum: // a big font // gfx too big & flickery ugly to flick every sec if (min != lastmin) { lastmin=min; bigDigit(5,20,'8',WinEraseLineF); bigDigit(40,20,'8',WinEraseLineF); //bigDigit(5,70,'8',WinEraseLineF); bigDigit(80,20,'8',WinEraseLineF); bigDigit(115,20,'8',WinEraseLineF); l=0; //l+=StrPrintF(buf+l, "%02d:%02d", (int)min,(int)sec); l+=StrPrintF(buf+l, "%02d:%02d", (int)hour, (int)min); bigDigit(5,20,buf[0],WinDrawLineF); bigDigit(40,20,buf[1],WinDrawLineF); //bigDigit(5,70,'7',WinDrawLineF); bigDigit(80,20,buf[3],WinDrawLineF); bigDigit(115,20,buf[4],WinDrawLineF); } break; case btnVisualHour: break; case btnVisualBar: eraseRectangleSafe(0, 20, 160, 20); // x,y,width,height drawRectangleSafe(0, 20, min * 4, 20); // x,y,width,height eraseRectangleSafe((min * 4)-1, 41, 160, 1); // x,y,width,height drawRectangleSafe((min * 4)-1, 41, 1, 1); // x,y,width,height if ((min%5)==0){ eraseRectangleSafe((min * 4)-2, 41, 160, 2); // x,y,width,height drawRectangleSafe((min * 4)-2, 41, 2, 2); // x,y,width,height } break; case btnVisualSticks: /* count like this 1 line = 1 minute ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- 160/4 = 40 => width 32 + 4 each side base weights 1, 5, 20, oh look rns :) 3 height with 2 sep + 5 sep big blocks */ // better visually but is not a bar anymore /*drawRectangleSafe(4+36*(((min-1)/5)%4), 20 + 30*((min-1)/20) + 5*((min-1)%5), 32, 3); // x,y,width,height*/ drawRectangleSafe(4+36*(((min)/5)%4), 20 + 30*((min)/20) + 5*((min)%5), (32*sec)/59, 3); // x,y,width,height break; } } /* for testing drawRectangleSafe(4+36*(((sec-1)/5)%4), 20 + 30*((sec-1)/20) + 5*((sec-1)%5), 32, 3); // x,y,width,height */ }