// // Member Function // int CWallPadKcm::Write(UCHAR *pData, int size) { CContextSetup* pContextSetup = NULL; int ret = ERROR; ULONG ulTick, delay; if(m_serial.IsOpen()) { DBGMSG(DBG_WALLPAD, "[WallPad:KCM] Try To Write\r\n"); DBGDMP(DBG_WALLPAD, pData, size, TRUE); //수신중일경우 대기 ulTick = get_mono_time(); while(m_isRecv) { usleep(1000); if(get_elapsed_time(ulTick) >= 300) { DBGMSG(DBG_WALLPAD, "[WallPad:KCM] Wait for read done: Timeout!!\r\n"); return -1; } } // 485 Enable g_gpio_mtm.SetGpioOutPin(GPIO_RS485_CTRL, LOW); // TX Enable후 최초 패킷을 전송하기까지 1.5[ms] 지연 usleep(10); ret = m_serial.Write(pData, size); if(ret == size) { memcpy((UCHAR *)&m_packet, pData, sizeof(KCM_PACKET)); } else { DBGMSG(DBG_WALLPAD, "[WallPad:KCM] Write Bytes Error, write=%d, expect=%d\e\n", ret, size); } //마지막 패킷 전송후 TX Disable 하기까지 지연 (패킷사이즈 전송시간 + 1.5[ms]) delay = (size * 1042) + 10; // 9600[bps]에서 1start+8bit+1stop 전송속도는 1.04167[ms] 이므로 21 byte는 21.875[ms] usleep(delay); // 485 Disable g_gpio_mtm.SetGpioOutPin(GPIO_RS485_CTRL, HIGH); #if 1 if(g_isContextSetupWallPad) { pContextSetup = (CContextSetup*)g_state.GetCurrContext(); if(pContextSetup) { pContextSetup->PrintPacket(pData, size, CYAN, FALSE); } } #endif }
//------------------------------------------------------------------------------ // Function Name : get_elapsed_time() // Description : //------------------------------------------------------------------------------ u32 get_elapsed_time(u32 _p_time) { u32 c_time, e_time; if (_p_time > MAX_TICK) return 0; //Error Case c_time = get_mono_time(); if (c_time >= _p_time) e_time = c_time - _p_time; else e_time = MAX_TICK - _p_time + c_time; return e_time; }
int main() { RPNElem elems[7]; elems[0].type = RPN_VALUE; elems[0].u.value = 3; elems[1].type = RPN_VALUE; elems[1].u.value = 2.5; elems[2].type = RPN_VARIABLE; elems[2].u.index = 0; elems[3].type = RPN_BINARY_OP; elems[3].u.op = BINARY_OP_TIMES; elems[4].type = RPN_VARIABLE; elems[4].u.index = 1; elems[5].type = RPN_BINARY_OP; elems[5].u.op = BINARY_OP_MINUS; elems[6].type = RPN_BINARY_OP; elems[6].u.op = BINARY_OP_PLUS; std::vector<RPNElem> elem_list; for (int i = 0; i < 7; i++) { elem_list.push_back(elems[i]); } long start; float val; float a = 2; float b = 4; val = 0; start = get_mono_time(); for (int i = 0; i < 1000000; i++) { val += 3 + (a * 2.5 - b); } printf("c %f %ld\n", val, get_mono_time() - start); val = 0; start = get_mono_time(); for (int i = 0; i < 1000000; i++) { val += CalcRPN2RAW(elems, 7, 2, 4); } printf("raw %f %ld\n", val, get_mono_time() - start); val = 0; start = get_mono_time(); for (int i = 0; i < 1000000; i++) { val += CalcRPN2(&elem_list, 2, 4); } printf("vector %f %ld\n", val, get_mono_time() - start); val = 0; start = get_mono_time(); for (int i = 0; i < 1000000; i++) { val += CalcRPN2STACK(&elem_list, 2, 4); } printf("stack %f %ld\n", val, get_mono_time() - start); val = 0; std::vector<RPNElem> elem_list_attr; RPNElem elem_attr; elem_list_attr.clear(); elem_attr.type = 1; elem_attr.u.value = 2.0; elem_list_attr.push_back(elem_attr); elem_attr.type = 5; elem_attr.u.index = 1; elem_list_attr.push_back(elem_attr); elem_attr.type = 4; elem_attr.u.op = 2; elem_list_attr.push_back(elem_attr); elem_attr.type = 2; elem_attr.u.index = 0; elem_list_attr.push_back(elem_attr); elem_attr.type = 5; elem_attr.u.index = 2; elem_list_attr.push_back(elem_attr); elem_attr.type = 1; elem_attr.u.value = 4.0; elem_list_attr.push_back(elem_attr); elem_attr.type = 4; elem_attr.u.op = 4; elem_list_attr.push_back(elem_attr); elem_attr.type = 4; elem_attr.u.op = 3; elem_list_attr.push_back(elem_attr); elem_attr.type = 4; elem_attr.u.op = 1; elem_list_attr.push_back(elem_attr); // 2.0-p.level+a*(p.attack/4) Player player; player.level = 10; player.attack = 9; player.defence = 4; start = get_mono_time(); for (int i = 0; i < 1000000; i++) { val += CalcRPN2Player(&elem_list_attr, &player, 2, 4); } printf("player %f %ld\n", val, get_mono_time() - start); // ------------------------------------------------------ val = 0; elem_list_attr.clear(); elem_attr.type = 1; elem_attr.u.value = 2.0; elem_list_attr.push_back(elem_attr); elem_attr.type = 5; elem_attr.u.index = 1; elem_list_attr.push_back(elem_attr); elem_attr.type = 4; elem_attr.u.op = 2; elem_list_attr.push_back(elem_attr); elem_attr.type = 2; elem_attr.u.index = 0; elem_list_attr.push_back(elem_attr); elem_attr.type = 5; elem_attr.u.index = 2; elem_list_attr.push_back(elem_attr); elem_attr.type = 1; elem_attr.u.value = 4.0; elem_list_attr.push_back(elem_attr); elem_attr.type = 4; elem_attr.u.op = 4; elem_list_attr.push_back(elem_attr); elem_attr.type = 4; elem_attr.u.op = 3; elem_list_attr.push_back(elem_attr); elem_attr.type = 4; elem_attr.u.op = 1; elem_list_attr.push_back(elem_attr); elem_attr.type = 1; elem_attr.u.value = 0.1; elem_list_attr.push_back(elem_attr); elem_attr.type = 4; elem_attr.u.op = 6; elem_list_attr.push_back(elem_attr); // max(2.0-p.level+a*(p.attack/4), 0.1) player.level = 10; player.attack = 9; player.defence = 4; printf("ans %f\n", CalcRPN2Player(&elem_list_attr, &player, 2, 4)); return 0; }