Beispiel #1
0
/// 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;
}
Beispiel #2
0
/*
 * 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;
}
Beispiel #3
0
/*
 * 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;
}
Beispiel #4
0
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; 
}
Beispiel #5
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; 
}