Visual Servoing Platform  version 3.0.1
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
vpRfstack.cpp
1 /****************************************************************************
2  *
3  * This file is part of the ViSP software.
4  * Copyright (C) 2005 - 2017 by Inria. All rights reserved.
5  *
6  * This software is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * ("GPL") version 2 as published by the Free Software Foundation.
9  * See the file LICENSE.txt at the root directory of this source
10  * distribution for additional information about the GNU GPL.
11  *
12  * For using ViSP with software that can not be combined with the GNU
13  * GPL, please contact Inria about acquiring a ViSP Professional
14  * Edition License.
15  *
16  * See http://visp.inria.fr for more information.
17  *
18  * This software was developed at:
19  * Inria Rennes - Bretagne Atlantique
20  * Campus Universitaire de Beaulieu
21  * 35042 Rennes Cedex
22  * France
23  *
24  * If you have questions regarding the use of this file, please contact
25  * Inria at visp@inria.fr
26  *
27  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29  *
30  * Description:
31  * Le module "rfstack.c" contient les procedures de gestion
32  * de la pile d'elimination de faces (Remove Faces STACK).
33  *
34  * Authors:
35  * Jean-Luc CORRE
36  *
37  *****************************************************************************/
38 
39 
40 
41 
42 
43 
44 #include <visp3/core/vpConfig.h>
45 
46 #ifndef DOXYGEN_SHOULD_SKIP_THIS
47 #include "vpMy.h"
48 #include "vpArit.h"
49 #include "vpView.h"
50 #include "vpRfstack.h"
51 #include <stdio.h>
52 #include <string.h>
53 #define STACKSIZE 32
54 
55 static int stack[STACKSIZE] = {vpDEFAULT_REMOVE}; /* pile */
56 static int *sp = stack; /* sommet */
57 
58 
59 /*
60  * La procedure "fprintf_rfstack" affiche le sommet
61  * de la pile des drapeaux d'elimination de faces.
62  * Entree :
63  * fp Fichier en sortie.
64  */
65 void
66 fprintf_rfstack (FILE *fp)
67 {
68  int flg;
69  flg = 0; /* nul si element unique */
70 
71  if (*sp == IS_INSIDE) {
72  fprintf (fp, "(null)\n");
73  return;
74  }
75  fprintf (fp, "(");
76  if (*sp & IS_ABOVE) {
77  //if (flg) fprintf (fp, " "); Removed since if (flg) cannot be true
78  flg ++;
79  fprintf (fp, "above");
80  }
81  if (*sp & IS_BELOW) {
82  if (flg) fprintf (fp, " ");
83  flg ++;
84  fprintf (fp, "below");
85  }
86  if (*sp & IS_RIGHT) {
87  if (flg) fprintf (fp, " ");
88  flg ++;
89  fprintf (fp, "right");
90  }
91  if (*sp & IS_LEFT) {
92  if (flg) fprintf (fp, " ");
93  flg ++;
94  fprintf (fp, "left");
95  }
96  if (*sp & IS_BACK) {
97  if (flg) fprintf (fp, " ");
98  flg ++;
99  fprintf (fp, "back");
100  }
101  if (*sp & IS_FRONT) {
102  /*if (flg)*/ fprintf (fp, " ");
103  flg ++;
104  fprintf (fp, "front");
105  }
106  fprintf (fp, ")\n");
107 }
108 
109 /*
110  * La procedure "get_rfstack" retourne les drapeaux au sommet
111  * de la pile des drapeaux d'elimination de faces.
112  * Sortie :
113  * Pointeur sur les drapeaux d'elimination du sommet de la pile.
114  */
115 int *
116 get_rfstack (void)
117 {
118  return (sp);
119 }
120 
121 /*
122  * La procedure "load_rfstack" charge des drapeaux au sommet
123  * de la pile des drapeaux d'elimination de faces.
124  * Entree :
125  * i Niveau a charger.
126  */
127 void
128 load_rfstack (int i)
129 {
130  *sp = i;
131 }
132 
133 /*
134  * La procedure "pop_rfstack" depile les drapeaux au sommet
135  * de la pile des drapeaux d'elimination de faces.
136  */
137 void
138 pop_rfstack (void)
139 {
140  if (sp == stack) {
141  static char proc_name[] = "pop_rfstack";
142  fprintf (stderr, "%s: stack underflow\n", proc_name);
143  return;
144  }
145  else sp--;
146 }
147 
148 /*
149  * La procedure "push_rfstack" empile et duplique les drapeaux du sommet
150  * de la pile des drapeaux d'elimination de faces.
151  */
152 void
153 push_rfstack (void)
154 {
155  if (sp == stack + STACKSIZE - 1) {
156  static char proc_name[] = "push_rfstack";
157  fprintf (stderr, "%s: stack overflow\n", proc_name);
158  return;
159  }
160  sp++;
161  *sp = *(sp - 1);
162 }
163 
164 /*
165  * La procedure "swap_rfstack" echange les deux premiers elements
166  * de la pile des drapeaux d'elimination de faces.
167  */
168 void
169 swap_rfstack (void)
170 {
171  int *ip;
172 
173  ip = (sp == stack) ? sp + 1 : sp - 1;
174  int tmp;
175  // SWAP(*sp, *ip, tmp); // produce a cppcheck warning
176  tmp = *sp; *sp = *ip; *ip = tmp;
177 }
178 
179 /*
180  * La procedure "add_rfstack" ajoute des drapeaux au sommet
181  * de la pile des drapeaux d'elimination de faces.
182  */
183 void
184 add_rfstack (int i)
185 {
186  *sp |= i;
187 }
188 
189 /*
190  * La procedure "sub_rfstack" soustrait des drapeaux au sommet
191  * de la pile des drapeaux d'elimination de faces.
192  */
193 void
194 sub_rfstack (int i)
195 {
196  *sp &= ~i;
197 }
198 
199 #endif
200