int btn; int arrow_x,arrow_y; int abcd, abcd_t; int dot; float aa; float bb; float cc; float out; float pii; int action_t; //////////////////////////////////////////////////////////////////////////////////////////////////////// // // Void Reset // //////////////////////////////////////////////////////////////////////////////////////////////////////// void reset() { dot = 0; aa = 0.0; bb = 0.0; cc = 0.0; out = 0.0; abcd = 0; abcd_t = 0; } //////////////////////////////////////////////////////////////////////////////////////////////////////// // // Void Show // //////////////////////////////////////////////////////////////////////////////////////////////////////// void show() { switch(abcd_t) { case 0: out = aa; break; case 1: out = bb; break; case 2: out = cc; break; default: break; } nxtEraseRect(1,60,99,50); if(out < 10000000 && out >= (-10000000)) { nxtDisplayStringAt(5,58,"%6.2f",out); } else { nxtDisplayStringAt(5,58,"ERROR"); wait10Msec(120); reset(); } nxtDrawLine(0,46,0,62); nxtDrawLine(1,63,99,63); return; } void step2(int Actio) { dot = 0; abcd = 1; abcd_t = 1; action_t = Actio; show(); } //////////////////////////////////////////////////////////////////////////////////////////////////////// // // Void Calc // //////////////////////////////////////////////////////////////////////////////////////////////////////// void calc(int Act) { if(Act == 11) // = { if(aa == 0 || bb == 0) { if(action_t == 13 || action_t == 14) { if(action_t == 13) { bb = 0; cc = bb; } else { if(aa == 0) { bb = 0; cc = bb; } else { cc = 10000001; bb = 0; } } } else { if(action_t == 18) { if(aa == 0) { cc = aa - bb; // cc = cc * (-1); } else { cc = aa - bb; } } else { if(aa == 0) { cc = bb; } if(bb == 0) { cc = aa; } bb = 0; } } } else { switch(action_t) { case 13: // * cc = aa * bb; break; case 14: // :(/) cc = aa / bb; break; case 17: // + cc = aa + bb; break; case 18: // - cc = aa - bb; break; } } aa = cc; abcd = 0; abcd_t = 0; show(); } else { switch(Act) { case 10: // dot dot = 1; break; case 12: // +/- if(abcd == 1) { if(bb != 0) { bb = bb * (-1); } } if(abcd == 0) { if(aa != 0) { aa = aa * (-1); } } abcd_t = abcd; show(); break; case 13: // * step2(Act); break; case 14: // :(/) step2(Act); break; case 15: // sqrt if(abcd == 0) { if(aa > 0) { aa = sqrt(aa); } } if(abcd == 1) { if(bb > 0) { bb = sqrt(bb); } } abcd_t = abcd; show(); break; case 16: // x*x bb = aa * aa; aa = bb; bb = 0; cc = bb; abcd_t = 0; show(); break; case 17: // + step2(Act); break; case 18: // - step2(Act); break; case 19: // pi if(abcd == 0) { aa = pii; } if(abcd == 1) { bb = pii; } abcd_t = abcd; show(); break; case 20: // Clr reset(); show(); break; } } return; } //////////////////////////////////////////////////////////////////////////////////////////////////////// // // Void Num // //////////////////////////////////////////////////////////////////////////////////////////////////////// void num(float n) { if(dot > 0) { float u = n; for(int dot_t=1; dot_t<=dot; ++dot_t) { u = u * 0.1; } dot += 1; n = u; } else { if(abcd == 1) { bb = bb * 10; } if(abcd == 0) { aa = aa * 10; } } if(abcd == 1) { if(bb < 0) { n = n * (-1); } bb = bb + n; show(); } if(abcd == 0) { if(aa < 0) { n = n * (-1); } aa = aa + n; show(); } return; } //////////////////////////////////////////////////////////////////////////////////////////////////////// // // Void Draw Button // //////////////////////////////////////////////////////////////////////////////////////////////////////// void draw_btn(byte left, byte top, byte width, byte height, string text) { nxtDisplayStringAt((left+2),((top+height)-3),"%s", text); nxtDrawLine(left,(top+1),left,((top+height)-1)); nxtDrawLine((left+1),(top+height),((left+width)-1),(top+height)); return; } //////////////////////////////////////////////////////////////////////////////////////////////////////// // // Task Click // //////////////////////////////////////////////////////////////////////////////////////////////////////// task click() { PlaySound(soundBlip); return; } //////////////////////////////////////////////////////////////////////////////////////////////////////// // // Task Main // //////////////////////////////////////////////////////////////////////////////////////////////////////// task main() { dot = 0; pii = 3.141592654; byte w1=9; // Button.Width (Pixel) byte h=12; // Button.Height (Pixel) int x1[7]={0,12,24,36,48,60,72}; int x2[7]={9,21,33,45,57,85,97}; int y1[3]={0,15,30}; int y1c[3]={0,9,24}; int y2c[3]={6,21,36}; byte a_s=12; byte s = 3; int g = 45; int a_x1[5]={0,1,1,1,2}; int a_x2[5]={0,5,6,6,4}; int a_y1[5]={6,4,5,6,6}; int a_y2[5]={2,0,0,1,6}; int bl=0,br=93,bu=56,bd=0; int xVal,yVal,xU,xL,yU,yL; int yUpper,yLower; int zUpper,zLower; int move=0; byte x_t; byte y_t; typedef struct{ byte nMsgSize; byte nDeviceAddress; byte nLocationPtr; } TI2C_Output; SensorType(S4) = sensorTouch; SensorType[S1] = sensorI2CCustomFast; wait10Msec(5); nI2CBytesReady[S1]=0; while(nI2CStatus[S1]== STAT_COMM_PENDING) wait1Msec(2); byte replyMessage[6]; TI2C_Output sOutput; sOutput.nMsgSize = 2; sOutput.nDeviceAddress = 0x02; sOutput.nLocationPtr = 0x42; arrow_x = 54; arrow_y = 48; aa = 0.0; bb = 0.0; cc = 0.0; byte x_tmp = arrow_x+1; byte y_tmp = arrow_y+1; btn = 0; abcd = 0; abcd_t = 0; while(true) { nI2CBytesReady[S1] = 0; sendI2CMsg(S1, sOutput.nMsgSize, 6); xU = 0 + g; xL = 0 - g; yU = 0 + g; yL = 0 - g; while (nI2CStatus[S1] == STAT_COMM_PENDING) wait1Msec(2); replyMessage[0] = 0x80; replyMessage[1] = 0x80; replyMessage[2] = 0x80; replyMessage[3] = 0x80; replyMessage[4] = 0x80; replyMessage[5] = 0x80; if (nI2CStatus[S1] == NO_ERR) { readI2CReply(S1, replyMessage[0], 6); yUpper = replyMessage[1]; zUpper = replyMessage[2]; yLower = 0xFF & replyMessage[4]; zLower = 0xFF & replyMessage[5]; yVal = (yUpper << 2) + yLower; xVal = (zUpper << 2) + zLower; if(xVal > 511) xVal -= 1024; if(yVal > 511) yVal -= 1024; } else { eraseDisplay(); nxtDisplayTextLine(3, "i2c err %d", nI2CStatus[S1]); wait10Msec(100); } if(xVal < xU && xVal > xL && yVal < yU && yVal > yL){move = 0;} if(xVal < xU && xVal > xL && yVal > yU){move = 1;} if(xVal < xL && yVal > yU){move = 2;} if(xVal < xL && yVal < yU && yVal > yL){move = 3;} if(xVal < xL && yVal < yL){move = 4;} if(xVal < xU && xVal > xL && yVal < yL){move = 5;} if(xVal > xU && yVal < yL){move = 6;} if(xVal > xU && yVal < yU && yVal > yL){move = 7;} if(xVal > xU && yVal > yU){move = 8;} x_t = arrow_x; y_t = arrow_y; switch(move) { case 1: if(y_t < bu){y_t += s;} break; case 2: if(x_t < br) {x_t += s;} if(y_t < bu) {y_t += s;} break; case 3: if(x_t < br){x_t += s;} break; case 4: if(x_t < br) {x_t += s;} if(y_t > bd) {y_t -= s;} break; case 5: if(y_t > bd){y_t -= s;} break; case 6: if(x_t > bl) {x_t -= s;} if(y_t > bd) {y_t -= s;} break; case 7: if(x_t > bl){x_t -= s;} break; case 8: if(x_t > bl) {x_t -= s;} if(y_t < bu) {y_t += s;} break; } arrow_x=x_t; arrow_y=y_t; if(arrow_x == x_tmp && arrow_y == y_tmp){}else{ x_tmp = arrow_x; y_tmp = arrow_y; eraseDisplay(); show(); draw_btn(x1[0],y1[0],w1,h,"1"); draw_btn(x1[1],y1[0],w1,h,"2"); draw_btn(x1[2],y1[0],w1,h,"3"); draw_btn(x1[3],y1[0],w1,h,"0"); draw_btn(x1[4],y1[0],w1,h,","); draw_btn(x1[5],y1[0],w1,h,"="); draw_btn(x1[6],y1[0],21,h,"+/-"); draw_btn(x1[0],y1[1],w1,h,"4"); draw_btn(x1[1],y1[1],w1,h,"5"); draw_btn(x1[2],y1[1],w1,h,"6"); draw_btn(x1[3],y1[1],w1,h,"*"); draw_btn(x1[4],y1[1],w1,h,"/"); draw_btn(x1[5],y1[1],w1,h,""); nxtDrawLine(x1[5]+3,y1[1]+4,x1[5]+2,y1[1]+7); nxtDrawLine(x1[5]+3,y1[1]+3,x1[5]+5,y1[1]+9); nxtDrawLine(x1[5]+6,y1[1]+9,x1[5]+7,y1[1]+9); draw_btn(x1[6],y1[1],21,h,"x*x"); draw_btn(x1[0],y1[2],w1,h,"7"); draw_btn(x1[1],y1[2],w1,h,"8"); draw_btn(x1[2],y1[2],w1,h,"9"); draw_btn(x1[3],y1[2],w1,h,"+"); draw_btn(x1[4],y1[2],w1,h,"-"); draw_btn(x1[5],y1[2],w1,h,""); nxtDrawLine(x1[5]+2,y1[2]+9,x1[5]+8,y1[2]+9); nxtDrawLine(x1[5]+4,y1[2]+3,x1[5]+4,y1[2]+8); nxtDrawLine(x1[5]+6,y1[2]+3,x1[5]+6,y1[2]+8); nxtSetPixel(x1[5]+7,y1[2]+3); nxtSetPixel(x1[5]+2,y1[2]+8); draw_btn(x1[6],y1[2],21 ,h,"Clr"); for(int h=0; h<5; h++) // draw arrow { nxtDrawLine(a_x1[h]+arrow_x,a_y1[h]+arrow_y,a_x2[h]+arrow_x,a_y2[h]+arrow_y); } nxtDrawLine(96,1,96,41); nxtDrawLine(97,42,99,42); wait10Msec(a_s); } if(SensorValue(S4) == 1) { if(arrow_y >= y1c[0] && arrow_y <= y2c[0]) { wait1Msec(1); for(int k=0;k<7;k++) { if(arrow_x >= x1[k] && arrow_x <= x2[k]) { btn = k; } } } if(arrow_y >= y1c[1] && arrow_y <= y2c[1]) { wait1Msec(1); for(int l=0;l<7;l++) { wait1Msec(1); if(arrow_x >= x1[l] && arrow_x <= x2[l]) { btn = l+7; } } } if(arrow_y >= y1c[2] && arrow_y <= y2c[2]) { wait1Msec(1); for(int m=0;m<7;m++) { if(arrow_x >= x1[m] && arrow_x <= x2[m]) { btn = m+14; } } } switch(btn) { case 0: btn = 1; break; case 1: btn = 2; break; case 2: btn = 3; break; case 3: btn = 0; break; case 4: btn = 10; break; case 5: btn = 11; break; case 6: btn = 12; break; case 7: btn = 4; break; case 8: btn = 5; break; case 9: btn = 6; break; case 10: btn = 13; break; case 11: btn = 14; break; case 12: btn = 15; break; case 13: btn = 16; break; case 14: btn = 7; break; case 15: btn = 8; break; case 16: btn = 9; break; } if(btn > 9) { calc(btn); } else { num(btn); } StartTask(click); wait10Msec(40); } } return; }