void EditorTools::onMathEdit(){ bool ok; QString text = QInputDialog::getText(this, tr("Apply expression to image"), tr("\"A\" represents the current image. Examples:\n" "A + 3 -> adds 3 to every pixel\n" "fft(A) -> takes the fourier transform of the image\n" "\n" "Expression:"), QLineEdit::Normal, "A + 0", &ok); if (ok && !text.isEmpty()){ const Image * image_list[2] = {0,0}; if(editor->editorView()->selectedImage() && editor->editorView()->selectedImage()->getImage()){ image_list[0] = editor->editorView()->selectedImage()->getImage(); } qDebug("Got formula %s\n",text.toAscii().data()); Math_Output * out = evaluate_math_expression(text.toAscii().data(),image_list); if(out->type == MathOutputImage){ /* We got a new image */ ImageItem * item = new ImageItem(out->image,QString(),editor->editorView()); editor->editorView()->setImage(item); }else if(out->type == MathOutputScalar){ /* We got a scalar. Show it to the user */ QString out_text; out_text = QString("Expression evaluated to %0 + %1 i").arg(sp_real(out->scalar)).arg(sp_imag(out->scalar)); QMessageBox::information ( 0,tr("Apply expression to image"),out_text); }else if(out->type == MathOutputError){ QString out_text(out->error_msg); QMessageBox::warning( 0,tr("Apply expression to image"),out_text); } } }
static void dispatch_out(void) { // update latest serial received if (out_packet_ptr) { in_packet[0] = out_packet[0]; if (in_packet_ptr == 0) { in_packet_ptr = 1; } } unsigned char ptr = 1; while (ptr < out_packet_ptr) { unsigned char code = out_packet[ptr]; ++ptr; unsigned char sz = code & 0xf; if (sz == 15) { if (ptr == out_packet_ptr) { goto too_big; } sz = out_packet[ptr]; ++ptr; } if (ptr + sz > out_packet_ptr || ptr + sz < ptr) { too_big: MY_Failure("Too big recv", ptr + sz, out_packet_ptr); } unsigned char code_ix = (code & 0xf0) >> 4; if (code_ix >= sizeof(min_size)) { unknown_op: MY_Failure("Unknown op", code & 0xf0, sz); } unsigned char msz = 0; memcpy_P(&msz, &min_size[code_ix], 1); if (sz < msz) { MY_Failure("Too small data", sz, code); } unsigned char *base = &out_packet[ptr]; switch (code & 0xf0) { case OpSetStatus: set_status(base[0], sz-1, base+1); break; case OpGetStatus: get_status(base[0]); break; case OpWriteServo: write_servo(base[0], base[1], sz-2, base+2); break; case OpReadServo: read_servo(base[0], base[1], base[2]); break; case OpOutText: out_text(sz, base); break; case OpRawWrite: raw_write(sz, base); break; case OpRawRead: raw_read(base[0]); break; default: goto unknown_op; } ptr += sz; } }