PRSEV_HANDLER_DEF(E_STATE_APP_SLEEP, tsEvent *pEv, teEvent eEvent, uint32 u32evarg) { if (eEvent == E_EVENT_NEW_STATE) { // Sleep は必ず E_EVENT_NEW_STATE 内など1回のみ呼び出される場所で呼び出す。 V_PRINTF(LB"! Sleeping..."); V_FLUSH(); pEv->bKeepStateOnSetAll = FALSE; // スリープ復帰の状態を維持 // Mininode の場合、特別な処理は無いのだが、ポーズ処理を行う ToCoNet_Nwk_bPause(sAppData.pContextNwk); // センサー用の電源制御回路を Hi に戻す vPortSetSns(FALSE); #ifdef LITE2525A vPortSetLo(LED); #else vPortSetHi(LED); #endif // 周期スリープに入る if(sAppData.sFlash.sData.i16param == NORMAL || sAppData.sFlash.sData.i16param == NEKOTTER ){ vSleep(sAppData.sFlash.sData.u32Slp, sAppData.u16frame_count == 1 ? FALSE : TRUE, FALSE); }else{ // 割り込みの設定 vAHI_DioSetDirection(PORT_INPUT_MASK_ADXL345, 0); // set as input (void)u32AHI_DioInterruptStatus(); // clear interrupt register vAHI_DioWakeEnable(PORT_INPUT_MASK_ADXL345, 0); // also use as DIO WAKE SOURCE vAHI_DioWakeEdge(PORT_INPUT_MASK_ADXL345, 0); // 割り込みエッジ(立上がりに設定) vSleep(0, FALSE, FALSE); } } }
static portTASK_FUNCTION(vCommsDemoTask, pvParameters) { (void) pvParameters; unsigned int counter = 0; unsigned int sizeLocSubField; unsigned int sizeControlFrame; stateBlock present; AX25BufferItem input; protoReturn result; char actual [300]; unsigned int actual_size = 300; memset (actual, 0, 300); memcpy (input.array,"a\r",2); input.arraylength = 2; present.src = input.array; present.srcSize = 2; memcpy (present.route.dest.callSign,"BLUEGS",CALLSIGN_SIZE); memcpy (present.route.src.callSign, "BLUEGS",CALLSIGN_SIZE); vDebugPrint(COMMS_DEMO_TaskToken, "BLOCK TEXT \n\r", NO_INSERT, NO_INSERT, NO_INSERT); present.route.dest.callSignSize = 6; present.route.src.callSignSize = 6; present.route.dest.ssid = BLUESAT_GS_SSID; present.route.src.ssid = BLUESAT_SAT_SSID; present.route.repeats = NULL; present.route.totalRepeats = 0; present.route.type = Response; present.presState = stateless; present.pid = AX25_PID_NO_LAYER3_PROTOCOL_UI_MODE; present.packetCnt = 0; present.nxtIndex = 0; present.mode = unconnected; present.completed = false; vSetToken( COMMS_DEMO_TaskToken); result = ax25Entry (&present, actual, &actual_size ); actual[14] = 0x61; vDebugPrint(COMMS_DEMO_TaskToken, "%d, %22x\n\r",actual_size ,actual, NO_INSERT); setModemTransmit(1); switching_TX(0); switching_TX_Device(1); while(1){ vDebugPrint(COMMS_DEMO_TaskToken, "Sending Message %d \n\r", counter++, NO_INSERT, NO_INSERT); Comms_Modem_Write_Str(actual,actual_size, 1); vSleep(2000); } }
PRSEV_HANDLER_DEF(E_STATE_APP_SLEEP, tsEvent *pEv, teEvent eEvent, uint32 u32evarg) { if (eEvent == E_EVENT_NEW_STATE) { // Sleep は必ず E_EVENT_NEW_STATE 内など1回のみ呼び出される場所で呼び出す。 V_PRINTF(LB"! Sleeping..."); V_FLUSH(); pEv->bKeepStateOnSetAll = FALSE; // スリープ復帰の状態を維持 // Mininode の場合、特別な処理は無いのだが、ポーズ処理を行う ToCoNet_Nwk_bPause(sAppData.pContextNwk); // センサー用の電源制御回路を Hi に戻す vPortSetSns(FALSE); // 周期スリープに入る // - 初回は5秒あけて、次回以降はスリープ復帰を基点に5秒 vSleep(sAppData.sFlash.sData.u32Slp, sAppData.u16frame_count == 1 ? FALSE : TRUE, FALSE); } }
/** * スリープへの遷移 * * @param E_STATE_APP_SLEEP * @param pEv * @param eEvent * @param u32evarg */ PRSEV_HANDLER_DEF(E_STATE_APP_SLEEP, tsEvent *pEv, teEvent eEvent, uint32 u32evarg) { if (eEvent == E_EVENT_NEW_STATE) { pEv->bKeepStateOnSetAll = FALSE; u8RetryCount = 0xff; // センサー用の電源制御回路を Hi に戻す vPortSetSns(FALSE); // RTS0 を通信禁止にする vPortSetHi(PORT_RTS0); // Sleep は必ず E_EVENT_NEW_STATE 内など1回のみ呼び出される場所で呼び出す。 V_PRINTF(LB"Sleeping..."); V_FLUSH(); // Mininode の場合、特別な処理は無いのだが、ポーズ処理を行う ToCoNet_Nwk_bPause(sAppData.pContextNwk); // スリープ状態に遷移 vSleep(0, FALSE, FALSE); } }
static void vProcessEvCore(tsEvent *pEv, teEvent eEvent, uint32 u32evarg) { switch (pEv->eState) { /* * 起動時の状態 * ToCoNetの接続を行う。 * - スリープ復帰時は直前のアドレスに対して復帰をかける。失敗した場合は再探索を行う。 */ case E_STATE_IDLE: // start up message V_PRINTF(LB "*** ToCoSamp IO Monitor %d.%02d-%d %s ***", VERSION_MAIN, VERSION_SUB, VERSION_VAR, sAppData.bWakeupByButton ? "BTN" : "OTR"); V_PRINTF(LB "* App ID:%08x Long Addr:%08x Short Addr %04x", sToCoNet_AppContext.u32AppId, ToCoNet_u32GetSerial(), sToCoNet_AppContext.u16ShortAddress); SERIAL_vFlush(UART_PORT); if (eEvent == E_EVENT_START_UP) { if (IS_APPCONF_OPT_SECURE()) { bool_t bRes = bRegAesKey(sAppData.sFlash.sData.u32EncKey); V_PRINTF(LB "*** Register AES key (%d) ***", bRes); } #ifdef USE_LCD vLcdInit(); // register sLcd // 最下行を表示する V_PRINTF_LCD_BTM("*** ToCoSamp IO Monitor %d.%02d-%d ***", VERSION_MAIN, VERSION_SUB, VERSION_VAR); vLcdRefresh(); #endif } if (eEvent == E_EVENT_START_UP && (u32evarg & EVARG_START_UP_WAKEUP_RAMHOLD_MASK)) { V_PRINTF(LB "* Warm starting woke by %s.", sAppData.bWakeupByButton ? "DIO" : "WakeTimer"); /* * 接続復帰(スリープ後) */ sAppData.eLedState = E_LED_WAIT; ToCoNet_Nwk_bResume(sAppData.pContextNwk); // ネットワークの復元 ToCoNet_Event_SetState(pEv, E_STATE_APP_WAIT_NW_START); } else if (eEvent == E_EVENT_START_UP) { V_PRINTF(LB "* start end device[%d]", u32TickCount_ms & 0xFFFF); /* * ネットワークの接続 */ sAppData.sNwkLayerTreeConfig.u8Role = TOCONET_NWK_ROLE_ENDDEVICE; // EndDevice として構成する sAppData.sNwkLayerTreeConfig.u8ScanDur_10ms = 4; // 探索時間(中継機の数が数個程度なら 40ms 程度で十分) sAppData.pContextNwk = ToCoNet_NwkLyTr_psConfig(&sAppData.sNwkLayerTreeConfig); // 設定 if (sAppData.pContextNwk) { ToCoNet_Nwk_bInit(sAppData.pContextNwk); // ネットワーク初期化 ToCoNet_Nwk_bStart(sAppData.pContextNwk); // ネットワーク開始 } sAppData.eLedState = E_LED_WAIT; ToCoNet_Event_SetState(pEv, E_STATE_APP_WAIT_NW_START); break; } break; /* * ネットワークの開始待ち */ case E_STATE_APP_WAIT_NW_START: if (eEvent == E_EVENT_TOCONET_NWK_START) { ToCoNet_Event_SetState(pEv, E_STATE_RUNNING); } if (ToCoNet_Event_u32TickFrNewState(pEv) > 500) { ToCoNet_Event_SetState(pEv, E_STATE_APP_SLEEP); } break; /* * 実行時の状態 * - ネットワーク開始後、メッセージプール要求を行う * - ネットワークがエラーになったり、タイムアウトが発生した場合はエラー状態とし、 * 再びスリープする */ case E_STATE_RUNNING: if (eEvent == E_EVENT_NEW_STATE) { // ネットワーク開始 V_PRINTF(LB"[NWK STARTED and REQUEST IO STATE:%d]", u32TickCount_ms & 0xFFFF); static uint8 u8Ct; #ifdef MSGPL_SLOT_TEST // メッセージプールの複数スロットのテストを行う // 起動ごとにスロット番号を変更して取得する u8Ct++; #else u8Ct = 0; #endif // メッセージプールの要求 if (ToCoNet_MsgPl_bRequest(u8Ct % TOCONET_MOD_MESSAGE_POOL_MAX_ENTITY)) { ToCoNet_Event_SetState(pEv, E_STATE_APP_IO_WAIT_RX); } else { ToCoNet_Event_SetState(pEv, E_STATE_APP_IO_RECV_ERROR); } } else if (eEvent == E_EVENT_TOCONET_NWK_DISCONNECT) { ToCoNet_Event_SetState(pEv, E_STATE_APP_IO_RECV_ERROR); } else { if (ToCoNet_Event_u32TickFrNewState(pEv) > ENDD_TIMEOUT_CONNECT_ms) { ToCoNet_Event_SetState(pEv, E_STATE_APP_IO_RECV_ERROR); } } break; /* * メッセージプールからの伝達待ち。 * - メッセージプールは cbToCoNet_vNwkEvent() に通知され、 * その関数中でE_EVENT_APP_GET_IC_INFOイベントを発行する。 */ case E_STATE_APP_IO_WAIT_RX: if (eEvent == E_EVENT_NEW_STATE) { V_PRINTF(LB"[E_STATE_APP_IO_WAIT_RX:%d]", u32TickCount_ms & 0xFFFF); } if (eEvent == E_EVENT_APP_GET_IC_INFO) { // メッセージが届いた if (u32evarg) { V_PRINTF(LB"[E_STATE_APP_IO_WAIT_RX:GOTDATA:%d]", u32TickCount_ms & 0xFFFF); ToCoNet_Event_SetState(pEv, E_STATE_APP_SLEEP); } else { ToCoNet_Event_SetState(pEv, E_STATE_APP_IO_RECV_ERROR); } } else { // タイムアウト if (ToCoNet_Event_u32TickFrNewState(pEv) > ENDD_TIMEOUT_WAIT_MSG_ms) { V_PRINTF(LB"[E_STATE_APP_IO_WAIT_RX:TIMEOUT:%d]", u32TickCount_ms & 0xFFFF); ToCoNet_Event_SetState(pEv, E_STATE_APP_IO_RECV_ERROR); } } break; /* * 送信完了の処理 * - スリープ実行 */ case E_STATE_APP_IO_RECV_ERROR: case E_STATE_APP_SLEEP: if (eEvent == E_EVENT_NEW_STATE) { if (pEv->eState == E_STATE_APP_SLEEP) { V_PRINTF(LB"[E_STATE_APP_SLEEP_LED:%d]", u32TickCount_ms & 0xFFFF); sAppData.eLedState = E_LED_RESULT; } else { V_PRINTF(LB"[E_STATE_APP_IO_RECV_ERROR:%d]", u32TickCount_ms & 0xFFFF); sAppData.eLedState = E_LED_ERROR; } vPortSetHi(PORT_KIT_LED1); vPortSetHi(PORT_KIT_LED2); #ifdef NO_SLEEP ToCoNet_Event_SetState(pEv, E_STATE_APP_PREUDO_SLEEP); #else ToCoNet_Nwk_bPause(sAppData.pContextNwk); SERIAL_vFlush(UART_PORT); vSleep(0, FALSE, FALSE); #endif } break; case E_STATE_APP_PREUDO_SLEEP: // 指定時間スリープ相当の時間待ちを行う if (ToCoNet_Event_u32TickFrNewState(pEv) > ENDD_SLEEP_PERIOD_s * 1000UL) { ToCoNet_Event_SetState(pEv, E_STATE_RUNNING); } break; default: break; } }
FONTENUMPROC FontFunc( LOGFONT *plf, TEXTMETRIC *ptm, int iType, FTPARAM *pftp ) { HFONT hf, hfOld; int cPair, // number of kerning pairs cPairCopied, // number of pairs coppied to buffer iSpace, // space between successive lines y; // current y-coordinate char ach[100]; // scratch space HBRUSH hbOld; TEXTMETRIC tm; y = 20; iSpace = (int) (ptm->tmHeight + ptm->tmExternalLeading); hf = CreateFontIndirect(plf); if (hf == 0) { DbgPrint("FontFunc -- CreateFontIndirect failed\n"); } hfOld = SelectObject(pftp->hdc,hf); if (hfOld == 0) { DbgPrint("FontFunc -- Select Object failed\n"); } cPair = GetKerningPairs(pftp->hdc, 0, (KERNINGPAIR*) NULL); if (cPair != 0) { HANDLE hMem; PVOID pvMem; hMem = LocalAlloc(LMEM_FIXED,cPair * sizeof(KERNINGPAIR)); if (hMem == 0) { DbgPrint("FontFunc -- LocalAlloc failed\n"); return(0); } if (hMem) { pvMem = LocalLock(hMem); if (pvMem == NULL) { DbgPrint("FontFunc -- LocalLock failed\n"); return(0); } if (pvMem != NULL) { KERNINGPAIR *pkpTooBig; KERNINGPAIR *pkp = (KERNINGPAIR*) pvMem; cPairCopied = GetKerningPairs(pftp->hdc, cPair, pkp); pkpTooBig = pkp + cPairCopied; hbOld = SelectObject(pftp->hdc,GetStockObject(WHITE_BRUSH)); PatBlt( pftp->hdc, pftp->prect->left, pftp->prect->top + y, pftp->prect->right - pftp->prect->left, pftp->prect->bottom - pftp->prect->top, PATCOPY ); SelectObject(pftp->hdc,hbOld); wsprintf(ach,"%s has %d kerning pairs",plf->lfFaceName,cPair); TextOut(pftp->hdc,0,y,ach,strlen(ach)); y += iSpace; wsprintf(ach," wFirst wSecond iKernAmount"); TextOut(pftp->hdc,0,y,ach,strlen(ach)); y += iSpace; while (pkp < pkpTooBig && (y + ptm->tmHeight < (int) pftp->prect->bottom)) { wsprintf( ach, " %-#6lx %-#6lx %d", pkp->wFirst, pkp->wSecond, pkp->iKernAmount ); TextOut(pftp->hdc,0,y,ach,strlen(ach)); y += iSpace; pkp += 1; } vSleep(1); } LocalUnlock(hMem); } } SelectObject(pftp->hdc,hfOld); DeleteObject(hf); UNREFERENCED_PARAMETER(iType); return(1); }