/// Gets the output data int oterm_out(process *o, onion_request *req, onion_response *res){ pthread_mutex_lock(&o->mutex); if (onion_request_get_query(req, "initial")){ if (o->buffer[BUFFER_SIZE-1]!=0){ // If 0 then never wrote on it. So if not, write from pos to end too, first. onion_response_write(res, &o->buffer[o->buffer_pos], BUFFER_SIZE-o->buffer_pos); } onion_response_write(res, o->buffer, o->buffer_pos); onion_response_printf(res, "\033]oterm;%d;", o->buffer_pos); onion_response_printf(res, "\033]url;https://localhost:8080/uuid/%s/;", o->uuid); pthread_mutex_unlock(&o->mutex); return OCS_PROCESSED; } int16_t p=atoi(onion_request_get_queryd(req, "pos", "0")); //o->buffer_pos; ONION_DEBUG("Wait for data at %d", p); while(p==o->buffer_pos) // We need it to be diferent, if not does not make sense to wake up pthread_cond_wait(&o->dataReady, &o->mutex); ONION_DEBUG("Data ready at %d (waiting from %d)", o->buffer_pos, p); if (o->buffer_pos<p){ onion_response_write(res, &o->buffer[p], BUFFER_SIZE-p); p=0; } onion_response_write(res, &o->buffer[p], o->buffer_pos-p); onion_response_printf(res, "\033]oterm;%d;", o->buffer_pos); pthread_mutex_unlock(&o->mutex); return OCS_PROCESSED; }
/* * Parse data from client. Use actionid-arg to distinct different * cases. */ onion_connection_status OnionServer::updateData( Onion::Request &req, Onion::Response &res) { /* Default reply is 'reload' which force reload * of complete website. In mosty cases this string will replaced * by one of the signal handlers. */ int actionid = atoi( onion_request_get_queryd(req.c_handler(), "actionid","0") ); if( ! updateSignal( &req, actionid, &res) ){ // Signal returns true if at least one handler writes into res. // Write default reply, if nothing was written. std::string reply("reload"); res.write(reply.c_str(), reply.size() ); } return OCS_PROCESSED; }
/* * Parse data from client. Use actionid-arg to distinct different * cases. */ onion_connection_status OnionServer::updateData( Onion::Request &req, Onion::Response &res) { /* Default reply is 'reload' which force reload * of complete website. In mosty cases this string will replaced * by one of the signal handlers. */ int actionid = atoi( onion_request_get_queryd(req.c_handler(), "actionid","0") ); const int updateResult = updateSignal( &req, actionid, &res); if( -3 == updateResult ){ // Nothing was written. Write default reply (empty string). res.write("", 0); } else if( -2 == updateResult ){ // Nothing was written and reload should be forced. std::string reply("reload"); res.write(reply.c_str(), reply.size() ); } return OCS_PROCESSED; }
int OnionServer::updateSetting(onion_request *req, onion_response *res){ int actionid = atoi( onion_request_get_queryd(req,"actionid","0") ); printf("Actionid: %i \n", actionid); switch(actionid){ case 8:{ //quit programm m_psettingKinectGrid->setMode(QUIT); } break; case 7:{ //load masks m_psettingKinectGrid->setMode(LOAD_MASKS); } break; case 6:{ //save masks m_psettingKinectGrid->setMode(SAVE_MASKS); } break; case 5:{ //select view //m_view = atoi( onion_request_get_queryd(req,"view","-1") ); m_view = atoi( onion_request_get_post(req,"view") ); printf("Set view to %i.\n",m_view); } break; case 4:{ //repoke printf("Repoke\n"); m_psettingKinectGrid->setMode(REPOKE_DETECTION); } break; case 3:{ // area detection int start = atoi( onion_request_get_queryd(req,"start","1") ); if( start == 1) m_psettingKinectGrid->setMode(AREA_DETECTION_START); else{ m_psettingKinectGrid->setMode(AREA_DETECTION_END); } } break; case 2:{ const char* filename = onion_request_get_post(req,"filename"); printf("Save new settingKinectGrid: %s\n",filename); if( check_filename(filename ) == 1){ m_psettingKinect->saveConfigFile(filename); m_psettingKinectGrid->setString("lastSetting",filename); m_psettingKinectGrid->saveConfigFile("settingKinectGrid.ini"); }else{ printf("Filename not allowed\n"); } /* force reload of website */ return 0; } break; case 1:{ const char* filename = onion_request_get_post(req,"filename"); printf("Load new settingKinectGrid: %s\n",filename); if( check_filename(filename ) == 1){ m_psettingKinect->loadConfigFile(filename); }else{ printf("Filename not allowed\n"); } return -1; } break; case 0: default:{ printf("update settingKinect values\n"); const char* json_str = onion_request_get_post(req,"settingKinect"); if( json_str != NULL){ //printf("Get new settingKinect: %s\n",json_str); m_psettingKinect->setConfig(json_str, NO); }else{ return -1; } } break; } return 0; }
bool ImageAnalysis::getDisplayedImage(Onion::Request *preq, int actionid, Onion::Response *pres){ switch(actionid){ case 10: { /* Generate image */ int scale = atoi( onion_request_get_queryd(preq->c_handler(),"scale","100") ); const char *force = onion_request_get_queryd(preq->c_handler(),"force","0"); //check if image generation is forced if( *force == '1' ) m_png_redraw = true; m_png_mutex.lock(); //here, m_png_redraw could be false (second image request at the same time). VPRINT("redraw: %i, scale: %i, newscale: %i", m_png_redraw?1:0, m_png_scale, scale); if( !m_png_redraw && scale==m_png_scale ){ //There was no change between the last sended image. //std::string reply = "noNewImage"; //onion_response_write(res, reply.c_str(), reply.size() ); unsigned char image[4]; image[0] = 0; image[1] = 0; image[2] = 0; image[3] = 0; #ifdef USE_JPEG onion_jpeg_response( image , 4, JCS_EXT_RGBX, 1, 1, JPEG_QUALITY, pres->c_handler() ); #else onion_png_response( image, 4, 1, 1, pres->c_handler() ); #endif m_png_mutex.unlock(); return true; } if( /*m_pSettingKinect->m_withKinect == false ||*/ m_pSettingKinect->m_displayMode != DISPLAY_MODE_WEB || m_pSettingKinect->m_view == VIEW_NONE){ //Display is not active //generate 1x1 pixel unsigned char image[4]; image[0] = 0; image[1] = 0; image[2] = 0; image[3] = 0; #ifdef USE_JPEG onion_jpeg_response( image , 4, JCS_EXT_RGBX, 1, 1, JPEG_QUALITY, pres->c_handler() ); #else onion_png_response( image, 4, 1, 1, pres->c_handler() ); #endif m_png_mutex.unlock(); m_png_redraw = false; return true; } VPRINT("(PNG) View: %i\n", m_pSettingKinect->m_view); int channels = 1;//4=RGBA, -4=ABRG Mat* png = NULL; switch (m_pSettingKinect->m_view){ case VIEW_RGB: channels=4; cv::swap( m_rgb, m_png_imgC3); png=&m_png_imgC3; case VIEW_AREAS: channels=4; getColoredAreas(); png=&m_rgb; break; case VIEW_MASK: png=&m_depthMask; break; case VIEW_FILTERED: cv::swap( m_filteredMat, m_png_imgC1); png=&m_png_imgC1; break; case VIEW_FRONTMASK: //png=&m_areaGrid; png=&getFrontMask(); break; case VIEW_DEPTH: default: cv::swap( m_depthf, m_png_imgC1); png=&m_png_imgC1; break; } Rect roi = m_pSettingKinect->m_kinectProp.roi; // Return empty file if selected image does not contain data. if( png == NULL || png->empty() /*|| png->size().width == 0 || png->size().height == 0*/ ){ //generate 1x1 pixel image unsigned char image[4]; image[0] = 0; image[1] = 0; image[2] = 0; image[3] = 0; #ifdef USE_JPEG onion_jpeg_response( image , 4, JCS_EXT_RGBX, 1, 1, JPEG_QUALITY, pres->c_handler() ); #else onion_png_response( image, 4, 1, 1, pres->c_handler() ); #endif m_png_mutex.unlock(); m_png_redraw = false; return true; } if( scale == 100 ){ /* copy pixels and generate file for this subimage */ unsigned char image[channels*roi.width*roi.height]; Mat pngRoi(*png,roi); if( channels == 4 ){ /* Four channel image */ unsigned char *dst_it = image; MatConstIterator_<VT> it = pngRoi.begin<VT>(), it_end = pngRoi.end<VT>(); for( ; it != it_end; ++it, ++dst_it ) { const VT pix = *it; //bgr => rgba *dst_it = pix[2]; ++dst_it; *dst_it = pix[1]; ++dst_it; *dst_it = pix[0]; ++dst_it; *dst_it = 255; } }else{ /* Grayscale image */ MatConstIterator_<uchar> it = pngRoi.begin<uchar>(); const MatConstIterator_<uchar> it_end = pngRoi.end<uchar>(); unsigned char *dst_it = image; for( ; it != it_end; ++it, ++dst_it ) { *dst_it = *it; } } #ifdef USE_JPEG onion_jpeg_response( (unsigned char*) image , channels, channels==1?JCS_GRAYSCALE:JCS_EXT_RGBX, roi.width, roi.height, JPEG_QUALITY, pres->c_handler() ); #else onion_png_response( (unsigned char*) image , channels, roi.width, roi.height, pres->c_handler() ); #endif VPRINT("image with dimensions %ix%i and %i channels sended.\n", roi.width, roi.height, channels); }else{ /* Same as above but copy subset of all pixel */ roi.width = (roi.width/4)*4; roi.height = (roi.height/4)*4; Mat pngRoi(*png,roi); //rescale to 50% or 25% int w2 = roi.width*scale/100; int h2 = roi.height*scale/100; uint8_t incW = roi.width/w2; uint8_t incH = incW;//roi.height/h2; unsigned char image[channels*w2*h2]; if( channels == 4 ){ MatConstIterator_<VT> it = pngRoi.begin<VT>(); uint8_t *pimage = (uint8_t*) image; uint8_t *nextRowImage = pimage + w2 * 4; for( int i=0 ; i<h2; ++i ){ for( ; pimage<nextRowImage; ++pimage, it+=incW ){ const VT pix = *it; *pimage = pix[2]; ++pimage; *pimage = pix[1]; ++pimage; *pimage = pix[0]; ++pimage; *pimage = 255; } nextRowImage += w2 * 4; it+=roi.width*(incH-1); } }else{ //uint32_t *pdata = (uint32_t*) data_ptr;//4*char, ARGB MatConstIterator_<uchar> it = pngRoi.begin<uchar>(); uint8_t *pimage = (uint8_t*) image; uint8_t *nextRowImage = pimage + w2; for( int i=0 ; i<h2; ++i ){ for( ; pimage<nextRowImage; ++pimage, it+=incW ){ *pimage = *it; } nextRowImage += w2; it+=roi.width*(incH-1); } } #ifdef USE_JPEG onion_jpeg_response( (unsigned char*) image , channels, channels==1?JCS_GRAYSCALE:JCS_EXT_RGBX, w2, h2, JPEG_QUALITY, pres->c_handler() ); #else onion_png_response( (unsigned char*) image , channels, w2, h2, pres->c_handler() ); #endif VPRINT("image with dimensions %ix%i sended.\n", w2, h2); } m_png_mutex.unlock(); m_png_redraw = false; m_png_scale = scale; return true; } break; default: break; } return false; }