__interrupt void Serial_receive(void){ // concatena char dado = UCA0RXBUF; String_cat(serialString, dado); if(dado == '\n'){ // qtde de ciclos a serem distribuídos ciclosPlayerA = (uint8_t) (((float) atoi(serialString) / 100.0) * TOTAL_CICLOS); ciclosPlayerB = TOTAL_CICLOS - ciclosPlayerA; // cte de Bresenham E_A = 2*ciclosPlayerA - TOTAL_CICLOS; E_B = 2*ciclosPlayerB - TOTAL_CICLOS; // força o reset contCiclos = TOTAL_CICLOS; // limpa a string serialString[0] = '\0'; } // limpa flag interrupt serial IFG2 &= ~UCA0RXIFG; }
static Value _evalMath (Procedure self, ExpType type, Exp a, Exp b) { Value va = NULL, vb = NULL; switch (type) { case AND_EXP:case OR_EXP: va = _EVAL(a); return (type == AND_EXP && va) || (type == OR_EXP && !va) ? _EVAL(b) : va; case EQ_EXP:case NE_EXP:case GT_EXP:case GE_EXP:case LT_EXP:case LE_EXP: va = _EVAL(a); if (type == NE_EXP) { vb = _EVAL(b); if (!va) return vb; if (!vb) return va; return va != vb ? vb : NULL; } else if (type == EQ_EXP) { vb = _EVAL(b); if (va == at_True) return vb; if (vb == at_True) return va; if (va == vb) return va ? vb : at_True; return NULL; } if (!va) return NULL; vb = _EVAL(b); if (!vb) return NULL; if (type == EQ_EXP) { return va == vb ? vb : NULL; } else if (Value_is(va, at_Number) && (Value_is(vb, at_Number) || Value_is(vb, at_String))) { vb = Value_toNumberValue(vb); return (type == GT_EXP && va->u.number > vb->u.number) || (type == GE_EXP && va->u.number >= vb->u.number) || (type == LT_EXP && va->u.number < vb->u.number) || (type == LE_EXP && va->u.number <- vb->u.number) ? vb : NULL; } else if (Value_is(va, at_String) && (Value_is(vb, at_Number) || Value_is(vb, at_String))) { vb = Value_toStringValue(vb); return (type == GT_EXP && strcmp(va->u.string, vb->u.string) > 0) || (type == GE_EXP && strcmp(va->u.string, vb->u.string) >= 0) || (type == LT_EXP && strcmp(va->u.string, vb->u.string) < 0) || (type == LE_EXP && strcmp(va->u.string, vb->u.string) <= 0) ? vb : NULL; } return NULL; case CAT_EXP: va = Value_toStringValue(_EVAL(a)); vb = Value_toStringValue(_EVAL(b)); if (!va) return vb; if (!vb) return va; return Value_string(String_cat(va->u.string, vb->u.string)); default: va = Value_toNumberValue(_EVAL(a)); vb = Value_toNumberValue(_EVAL(b)); if (!(va && vb)) return NULL; if (type == ADD_EXP) return Value_number(va->u.number + vb->u.number); if (type == SUB_EXP) return Value_number(va->u.number - vb->u.number); if (type == MUL_EXP) return Value_number(va->u.number * vb->u.number); if (type == DIV_EXP) return Value_number(va->u.number / vb->u.number); return NULL; } }