void ProjectorWidget::paintEvent(QPaintEvent *) { QPainter painter(this); //if (_pixmap.isNull()) if (_current_pattern<0) { //stopped QRectF rect = QRectF(QPointF(0,0), QPointF(width(),height())); painter.drawText(rect, Qt::AlignCenter, "No image"); } else { bool updated = false; if (_pixmap.isNull()) { //update updated = true; make_pattern(); } //draw QRectF rect = QRectF(QPointF(0,0), QPointF(width(),height())); painter.drawPixmap(rect, _pixmap, rect); if (updated) { //notfy update _updated = true; emit new_image(_pixmap); } } }
/** * Serves meta information in JSON about a hash. */ void route_meta(evhtp_request_t *req, void *arg) { evhtp_uri_t *uri = req->uri; char *res = uri->path->full; char *hash = ""; res = strtok((char *) res, "/"); while (res != NULL) { if (strlen(res) == 32) { hash = res; break; } res = strtok(NULL, "/"); } char *color = malloc(sizeof (char)*7); make_color_hex(hash, color); int i[8][8]; make_pattern(hash, i); char *pattern = malloc(sizeof (char)*146); sprintf(pattern, "[[%d,%d,%d,%d,%d,%d,%d,%d]," "[%d,%d,%d,%d,%d,%d,%d,%d]," "[%d,%d,%d,%d,%d,%d,%d,%d]," "[%d,%d,%d,%d,%d,%d,%d,%d]," "[%d,%d,%d,%d,%d,%d,%d,%d]," "[%d,%d,%d,%d,%d,%d,%d,%d]," "[%d,%d,%d,%d,%d,%d,%d,%d]," "[%d,%d,%d,%d,%d,%d,%d,%d]]", i[0][0], i[0][1], i[0][2], i[0][3], i[0][4], i[0][5], i[0][6], i[0][7], i[1][0], i[1][1], i[1][2], i[1][3], i[1][4], i[1][5], i[1][6], i[1][7], i[2][0], i[2][1], i[2][2], i[2][3], i[2][4], i[2][5], i[2][6], i[2][7], i[3][0], i[3][1], i[3][2], i[3][3], i[3][4], i[3][5], i[3][6], i[3][7], i[4][0], i[4][1], i[4][2], i[4][3], i[4][4], i[4][5], i[4][6], i[4][7], i[5][0], i[5][1], i[5][2], i[5][3], i[5][4], i[5][5], i[5][6], i[5][7], i[6][0], i[6][1], i[6][2], i[6][3], i[6][4], i[6][5], i[6][6], i[6][7], i[7][0], i[7][1], i[7][2], i[7][3], i[7][4], i[7][5], i[7][6], i[7][7] ); pattern[145] = 0; evbuffer_add_printf(req->buffer_out, "{\"hash\":\"%s\",\"modified\":false,\"color\":\"%s\",\"pattern\":%s}", hash, color, pattern); free(color); free(pattern); evhtp_headers_add_header(req->headers_out, evhtp_header_new("Content-Type", "application/json", 0, 0)); evhtp_send_reply(req, 200); }
int main(void) { uint8_t buf[NRF24L01P_PAYLOAD_WIDTH]; uint32_t counter = 0; #if 0 uint8_t x; #endif /* setup spi first */ spi_setup_master(); spi_set_sck_freq(SPI_SCK_FREQ_FOSC2); uart_setup(); nrf24l01p_setup(); /* sparkfun usb serial board configuration */ /* NOTE: nrf24l01p_enable_crc8(); for nrf24l01p board */ /* nrf24l01p_enable_crc16(); */ nrf24l01p_disable_crc(); /* auto ack disabled */ /* auto retransmit disabled */ /* 4 bytes payload */ /* 1mbps, 0dbm */ /* nrf24l01p_set_rate(NRF24L01P_RATE_1MBPS); */ nrf24l01p_set_rate(NRF24L01P_RATE_2MBPS); /* nrf24l01p_set_rate(NRF24L01P_RATE_250KBPS); */ /* channel 2 */ nrf24l01p_set_chan(2); /* 5 bytes addr width */ /* nrf24l01p_set_addr_width(NRF24L01P_ADDR_WIDTH_5); */ nrf24l01p_set_addr_width(NRF24L01P_ADDR_WIDTH_3); /* rx address */ nrf24l01p_cmd_buf[0] = 0xe7; nrf24l01p_cmd_buf[1] = 0xe7; nrf24l01p_cmd_buf[2] = 0xe7; nrf24l01p_cmd_buf[3] = 0xe7; nrf24l01p_cmd_buf[4] = 0xe7; nrf24l01p_write_reg40(NRF24L01P_REG_RX_ADDR_P0); /* tx address */ nrf24l01p_cmd_buf[0] = 0xe7; nrf24l01p_cmd_buf[1] = 0xe7; nrf24l01p_cmd_buf[2] = 0xe7; nrf24l01p_cmd_buf[3] = 0xe7; nrf24l01p_cmd_buf[4] = 0xe7; nrf24l01p_write_reg40(NRF24L01P_REG_TX_ADDR); /* enable tx no ack command */ nrf24l01p_enable_tx_noack(); nrf24l01p_powerdown_to_standby(); nrf24l01p_standby_to_tx(); if (nrf24l01p_is_tx_empty() == 0) nrf24l01p_flush_tx(); #if 0 uart_write((uint8_t*)"tx side\r\n", 9); uart_write((uint8_t*)"press space\r\n", 13); uart_read_uint8(&x); uart_write((uint8_t*)"starting\r\n", 10); #endif /* enable interrupts */ sei(); while (1) { if ((++counter) != (200000UL / 8UL)) continue ; counter = 0; make_pattern(buf); nrf24l01p_write_tx_noack_zero(buf); nrf24l01p_complete_tx_noack_zero(); while (nrf24l01p_is_tx_irq() == 0) ; } return 0; }
void ProjectorWidget::make_pattern(void) { int cols = width(); int rows = height(); /* if (_current_pattern<1) { //search bit number _vbits = 1; _hbits = 1; for (int i=(1<<_vbits); i<cols; i=(1<<_vbits)) { _vbits++; } for (int i=(1<<_hbits); i<rows; i=(1<<_hbits)) { _hbits++; } _pattern_count = std::min(std::min(_vbits, _hbits), _pattern_count); std::cerr << " vbits " << _vbits << " / cols="<<cols<<", mvalue="<< ((1<<_vbits)-1) << std::endl; std::cerr << " hbits " << _hbits << " / rows="<<rows<<", mvalue="<< ((1<<_hbits)-1) << std::endl; std::cerr << " pattern_count="<< _pattern_count << std::endl; } */ int vmask = 0, voffset = ((1<<_vbits)-cols)/2, hmask = 0, hoffset = ((1<<_hbits)-rows)/2, inverted = (_current_pattern%2)==0; // patterns // ----------- // 00 white // 01 black // ----------- // 02 vertical, bit N-0, normal // 03 vertical, bit N-0, inverted // 04 vertical, bit N-1, normal // 04 vertical, bit N-2, inverted // .. // XX = (2*_pattern_count + 2) - 2 vertical, bit N, normal // XX = (2*_pattern_count + 2) - 1 vertical, bit N, inverted // ----------- // 2+N+00 = 2*(_pattern_count + 2) horizontal, bit N-0, normal // 2+N+01 horizontal, bit N-0, inverted // .. // YY = (4*_pattern_count + 2) - 2 horizontal, bit N, normal // YY = (4*_pattern_count + 2) - 1 horizontal, bit N, inverted if (_current_pattern<2) { //white or black _pixmap = make_pattern(rows, cols, vmask, voffset, hmask, hoffset, inverted); } else if (_current_pattern<2*_pattern_count+2) { //vertical int bit = _vbits - _current_pattern/2; vmask = 1<<bit; //std::cerr << "v# cp: " << _current_pattern << " bit:" << bit << " mask:" << vmask << std::endl; _pixmap = make_pattern(rows, cols, vmask, voffset, hmask, hoffset, !inverted); } else if (_current_pattern<4*_pattern_count+2) { //horizontal int bit = _hbits + _pattern_count - _current_pattern/2; hmask = 1<<bit; //std::cerr << "h# cp: " << _current_pattern << " bit:" << bit << " mask:" << hmask << std::endl; _pixmap = make_pattern(rows, cols, vmask, voffset, hmask, hoffset, !inverted); } else { //error assert(false); stop(); return; } //_pixmap.save(QString("pat_%1.png").arg(_current_pattern, 2, 10, QLatin1Char('0'))); }
pattern<T> const make_simulated_pattern( std::string const& dir_path_, std::complex<T> const& thickness_, std::size_t column_index_ = 0 ) { auto pt = make_pattern( dir_path_, thickness_, column_index_ ); pt.simulate_intensity(); return pt; }