Update of /cvsroot/playerstage/code/stage/libstage
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12236
Modified Files:
Makefile Makefile.am Makefile.manual canvas.cc model.cc
model_load.cc stage.hh world.cc worldgui.cc
Added Files:
ctrl.cc main.cc
Log Message:
added loadable modules for robot control, and reintroduced the program Stage
Index: worldgui.cc
===================================================================
RCS file: /cvsroot/playerstage/code/stage/libstage/worldgui.cc,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** worldgui.cc 18 Feb 2008 03:52:30 -0000 1.5
--- worldgui.cc 20 Feb 2008 06:03:59 -0000 1.6
***************
*** 343,347 ****
--- 343,349 ----
void StgWorldGui::DrawFloor()
{
+ PushColor( 1,1,1,1 );
g_hash_table_foreach( superregions, (GHFunc)SuperRegion::Floor_cb, NULL );
+ PopColor();
}
Index: model.cc
===================================================================
RCS file: /cvsroot/playerstage/code/stage/libstage/model.cc,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** model.cc 18 Feb 2008 03:52:30 -0000 1.4
--- model.cc 20 Feb 2008 06:03:58 -0000 1.5
***************
*** 216,219 ****
--- 216,222 ----
this->interval = 1e4; // 10msec
+ this->initfunc = NULL;
+ this->updatefunc = NULL;
+
// now we can add the basic square shape
this->AddBlockRect( -0.5,-0.5,1,1 );
***************
*** 235,238 ****
--- 238,251 ----
}
+ // this should be called after all models have loaded from the
+ // worldfile - it's a chance to do any setup now that all models are
+ // in existence
+ void StgModel::Init()
+ {
+ if( initfunc && updatefunc )
+ Subscribe();
+
+ // anything else to do here?
+ }
void StgModel::AddBlock( stg_point_t* pts,
***************
*** 634,637 ****
--- 647,653 ----
{
//printf( "Startup model %s\n", this->token );
+
+ if( initfunc )
+ initfunc( this );
world->StartUpdatingModel( this );
***************
*** 656,664 ****
}
- // void StgModel::UpdateTree( void )
- // {
- // LISTMETHOD( this->children, StgModel*, UpdateTree );
- // }
-
void StgModel::Update( void )
{
--- 672,675 ----
***************
*** 666,669 ****
--- 677,684 ----
// this->world->sim_time_ms, this->token, this->subs );
+ //puts( "UPDATE" );
+ if( updatefunc )
+ updatefunc( this );
+
CallCallbacks( &update );
--- NEW FILE: ctrl.cc ---
#include "stage.hh"
using namespace Stg;
extern "C" void Init( StgModel* mod );
extern "C" void Update( StgModel* mod );
StgModelPosition* pos = NULL;
StgModelLaser* laser = NULL;
// Stage calls this once when the model starts up
void Init( StgModel* mod )
{
puts( "Init controller" );
pos = (StgModelPosition*)mod;
laser = (StgModelLaser*)mod->GetUnsubscribedModelOfType( "laser" );
assert( laser );
laser->Subscribe();
}
// Stage calls this once per simulation update
void Update( StgModel* mod )
{
pos->SetSpeed( 0.1, 0, 0.1 );
}
Index: Makefile
===================================================================
RCS file: /cvsroot/playerstage/code/stage/libstage/Makefile,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** Makefile 12 Feb 2008 02:53:53 -0000 1.5
--- Makefile 20 Feb 2008 06:03:58 -0000 1.6
***************
*** 42,49 ****
host_triplet = i386-apple-darwin9.2.0
target_triplet = i386-apple-darwin9.2.0
! bin_PROGRAMS = stest$(EXEEXT)
subdir = libstage
DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \
! $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
--- 42,49 ----
host_triplet = i386-apple-darwin9.2.0
target_triplet = i386-apple-darwin9.2.0
! bin_PROGRAMS = stage$(EXEEXT)
subdir = libstage
DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \
! $(srcdir)/Makefile.in TODO
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
***************
*** 64,69 ****
libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
libstage_la_DEPENDENCIES =
! am_libstage_la_OBJECTS = ancestor.lo block.lo canvas.lo \
glcolorstack.lo model.lo model_callbacks.lo model_fiducial.lo \
model_laser.lo model_load.lo model_position.lo model_ranger.lo \
--- 64,75 ----
libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
+ ctrl_la_LIBADD =
+ am_ctrl_la_OBJECTS = ctrl.lo
+ ctrl_la_OBJECTS = $(am_ctrl_la_OBJECTS)
+ ctrl_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
+ $(ctrl_la_LDFLAGS) $(LDFLAGS) -o $@
libstage_la_DEPENDENCIES =
! am_libstage_la_OBJECTS = ancestor.lo block.lo canvas.lo gl.lo \
glcolorstack.lo model.lo model_callbacks.lo model_fiducial.lo \
model_laser.lo model_load.lo model_position.lo model_ranger.lo \
***************
*** 76,81 ****
binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
PROGRAMS = $(bin_PROGRAMS)
! am_stest_OBJECTS = stest.$(OBJEXT)
! stest_OBJECTS = $(am_stest_OBJECTS)
DEFAULT_INCLUDES = -I. -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
--- 82,87 ----
binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
PROGRAMS = $(bin_PROGRAMS)
! am_stage_OBJECTS = main.$(OBJEXT)
! stage_OBJECTS = $(am_stage_OBJECTS)
DEFAULT_INCLUDES = -I. -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
***************
*** 99,104 ****
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
! SOURCES = $(libstage_la_SOURCES) $(stest_SOURCES)
! DIST_SOURCES = $(libstage_la_SOURCES) $(stest_SOURCES)
pkgdataDATA_INSTALL = $(INSTALL_DATA)
DATA = $(pkgdata_DATA)
--- 105,111 ----
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
! SOURCES = $(ctrl_la_SOURCES) $(libstage_la_SOURCES) $(stage_SOURCES)
! DIST_SOURCES = $(ctrl_la_SOURCES) $(libstage_la_SOURCES) \
! $(stage_SOURCES)
pkgdataDATA_INSTALL = $(INSTALL_DATA)
DATA = $(pkgdata_DATA)
***************
*** 241,245 ****
# build the stage library
! lib_LTLIBRARIES = libstage.la
# The stage library
--- 248,252 ----
# build the stage library
! lib_LTLIBRARIES = libstage.la ctrl.la
# The stage library
***************
*** 250,253 ****
--- 257,261 ----
canvas.cc \
colors.h \
+ gl.cc \
glcolorstack.cc \
model.cc \
***************
*** 272,279 ****
#logo.cc
libstage_la_LDFLAGS = -version-info 3:1:0 -rpath $(libdir)
! libstage_la_LIBADD = -L/opt/local/lib -lgdk_pixbuf-2.0 -lgobject-2.0
-lgmodule-2.0 -lglib-2.0 -lintl -liconv -L/opt/local/lib -lfltk_images
-lfltk_png -lz -lfltk_jpeg -lfltk_gl -framework AGL -framework OpenGL -lfltk
-framework Carbon -framework ApplicationServices
! stest_DEPENDENCIES = libstage.la
! stest_SOURCES = stest.cc
! stest_LDADD = libstage.la
all: all-am
--- 280,289 ----
#logo.cc
libstage_la_LDFLAGS = -version-info 3:1:0 -rpath $(libdir)
! libstage_la_LIBADD = -L/opt/local/lib -lgdk_pixbuf-2.0 -lgobject-2.0
-lgmodule-2.0 -lglib-2.0 -lintl -liconv -L/opt/local/lib -lfltk_images
-lfltk_png -lz -lfltk_jpeg -lfltk_gl -framework AGL -framework OpenGL -lfltk
-framework Carbon -framework ApplicationServices -lltdl
! stage_DEPENDENCIES = libstage.la
! stage_SOURCES = main.cc
! stage_LDADD = libstage.la
! ctrl_la_SOURCES = ctrl.cc stage.hh
! ctrl_la_LDFLAGS = -module
all: all-am
***************
*** 336,339 ****
--- 346,351 ----
rm -f "$${dir}/so_locations"; \
done
+ ctrl.la: $(ctrl_la_OBJECTS) $(ctrl_la_DEPENDENCIES)
+ $(ctrl_la_LINK) -rpath $(libdir) $(ctrl_la_OBJECTS) $(ctrl_la_LIBADD)
$(LIBS)
libstage.la: $(libstage_la_OBJECTS) $(libstage_la_DEPENDENCIES)
$(libstage_la_LINK) -rpath $(libdir) $(libstage_la_OBJECTS)
$(libstage_la_LIBADD) $(LIBS)
***************
*** 366,372 ****
rm -f $$p $$f ; \
done
! stest$(EXEEXT): $(stest_OBJECTS) $(stest_DEPENDENCIES)
! @rm -f stest$(EXEEXT)
! $(CXXLINK) $(stest_OBJECTS) $(stest_LDADD) $(LIBS)
mostlyclean-compile:
--- 378,384 ----
rm -f $$p $$f ; \
done
! stage$(EXEEXT): $(stage_OBJECTS) $(stage_DEPENDENCIES)
! @rm -f stage$(EXEEXT)
! $(CXXLINK) $(stage_OBJECTS) $(stage_LDADD) $(LIBS)
mostlyclean-compile:
***************
*** 379,383 ****
--- 391,398 ----
include ./$(DEPDIR)/block.Plo
include ./$(DEPDIR)/canvas.Plo
+ include ./$(DEPDIR)/ctrl.Plo
+ include ./$(DEPDIR)/gl.Plo
include ./$(DEPDIR)/glcolorstack.Plo
+ include ./$(DEPDIR)/main.Po
include ./$(DEPDIR)/model.Plo
include ./$(DEPDIR)/model_blobfinder.Plo
***************
*** 390,394 ****
include ./$(DEPDIR)/model_ranger.Plo
include ./$(DEPDIR)/stage.Plo
- include ./$(DEPDIR)/stest.Po
include ./$(DEPDIR)/typetable.Plo
include ./$(DEPDIR)/world.Plo
--- 405,408 ----
--- NEW FILE: main.cc ---
#include "config.h"
#include "stage_internal.hh"
int main( int argc, char* argv[] )
{
printf( %s %s\n", PACKAGE, VERSION );
if( argc < 2 )
{
printf( "Usage: %s <worldfile>", PACKAGE );
exit(0);
}
// initialize libstage
Stg::Init( &argc, &argv );
StgWorldGui world(800, 700, argv[0]);
world.Load( argv[1] );
while( ! world.TestQuit() )
world.RealTimeUpdate();
}
Index: world.cc
===================================================================
RCS file: /cvsroot/playerstage/code/stage/libstage/world.cc,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** world.cc 18 Feb 2008 03:52:30 -0000 1.7
--- world.cc 20 Feb 2008 06:03:59 -0000 1.8
***************
*** 217,220 ****
--- 217,226 ----
}
+ // wrapper to startup all models from the hash table
+ void init_models( gpointer dummy1, StgModel* mod, gpointer dummy2 )
+ {
+ mod->Init();
+ }
+
void StgWorld::Load( const char* worldfile_path )
{
***************
*** 295,299 ****
// warn about unused WF linesa
wf->WarnUnused();
!
stg_usec_t load_end_time = RealTimeNow();
--- 301,308 ----
// warn about unused WF linesa
wf->WarnUnused();
!
! // run through the loaded models and initialise them
! g_hash_table_foreach( models_by_id, (GHFunc)init_models, NULL );
!
stg_usec_t load_end_time = RealTimeNow();
Index: model_load.cc
===================================================================
RCS file: /cvsroot/playerstage/code/stage/libstage/model_load.cc,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** model_load.cc 18 Feb 2008 03:52:30 -0000 1.3
--- model_load.cc 20 Feb 2008 06:03:58 -0000 1.4
***************
*** 7,10 ****
--- 7,16 ----
//#define DEBUG 1
+ #include <ltdl.h>
+
+ void FooInit( StgModel* );
+ void FooUpdate( StgModel* );
+
+
void StgModel::Load( void )
{
***************
*** 315,326 ****
this->SetMapResolution( wf->ReadFloat(this->id, "map_resolution",
this->map_resolution ));
! // call any type-specific load callbacks
! this->CallCallbacks( &this->load );
!
!
! if( this->debug )
! printf( "Model \"%s\" is in debug mode\n", token );
!
! PRINT_DEBUG1( "Model \"%s\" loading complete", token );
}
--- 321,343 ----
this->SetMapResolution( wf->ReadFloat(this->id, "map_resolution",
this->map_resolution ));
!
! if( wf->PropertyExists( this->id, "ctrl" ))
! {
! char* lib = (char*)wf->ReadString(this->id, "ctrl", NULL );
!
! if( !lib )
! puts( "Error - NULL library name" );
! else
! LoadControllerModule( lib );
! }
!
! // call any type-specific load callbacks
! this->CallCallbacks( &this->load );
!
!
! if( this->debug )
! printf( "Model \"%s\" is in debug mode\n", token );
!
! PRINT_DEBUG1( "Model \"%s\" loading complete", token );
}
***************
*** 353,354 ****
--- 370,408 ----
PRINT_DEBUG1( "Model \"%s\" saving complete.", token );
}
+
+
+ void StgModel::LoadControllerModule( char* lib )
+ {
+ printf( "Loading controller \"%s\" ...", lib );
+
+ /* Initialise libltdl. */
+ int errors = lt_dlinit();
+ assert(errors==0);
+
+ // TODO - do this properly!
+ lt_dlsetsearchpath( ".:.libs:/usr/lib/" );
+
+ lt_dlhandle handle = NULL;
+
+ if(( handle = lt_dlopenext( lib ) ))
+ puts( "success." );
+ else
+ puts( "fail." );
+
+ this->initfunc = (ctrlinit_t*)lt_dlsym( handle, "Init" );
+ if( this->initfunc == NULL )
+ {
+ puts( lt_dlerror() );
+ }
+ assert( this->initfunc );
+
+ this->updatefunc = (ctrlupdate_t*)lt_dlsym( handle, "Update" );
+ if( this->updatefunc == NULL )
+ {
+ puts( lt_dlerror() );
+ }
+ assert( this->updatefunc );
+
+ //this->Subscribe(); // causes the model to startup and update
+ }
+
Index: Makefile.am
===================================================================
RCS file: /cvsroot/playerstage/code/stage/libstage/Makefile.am,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** Makefile.am 12 Feb 2008 02:53:53 -0000 1.3
--- Makefile.am 20 Feb 2008 06:03:58 -0000 1.4
***************
*** 17,21 ****
# build the stage library
! lib_LTLIBRARIES = libstage.la
# The stage library
--- 17,21 ----
# build the stage library
! lib_LTLIBRARIES = libstage.la ctrl.la
# The stage library
***************
*** 26,29 ****
--- 26,30 ----
canvas.cc \
colors.h \
+ gl.cc \
glcolorstack.cc \
model.cc \
***************
*** 47,56 ****
#logo.cc
libstage_la_LDFLAGS = -version-info 3:1:0 -rpath $(libdir)
! libstage_la_LIBADD = @PIXBUF_LIBS@ @FLTK_LIBS@
# build stest, a stand-alone test binary using the stage library,
! bin_PROGRAMS = stest
! stest_DEPENDENCIES = libstage.la
! stest_SOURCES = stest.cc
! stest_LDADD = libstage.la
--- 48,66 ----
#logo.cc
libstage_la_LDFLAGS = -version-info 3:1:0 -rpath $(libdir)
! libstage_la_LIBADD = @PIXBUF_LIBS@ @FLTK_LIBS@ -lltdl
# build stest, a stand-alone test binary using the stage library,
! #bin_PROGRAMS = stest stage
! #stest_DEPENDENCIES = libstage.la
! #stest_SOURCES = stest.cc
! #stest_LDADD = libstage.la
!
! bin_PROGRAMS = stage
!
! stage_DEPENDENCIES = libstage.la
! stage_SOURCES = main.cc
! stage_LDADD = libstage.la
!
! ctrl_la_SOURCES = ctrl.cc stage.hh
! ctrl_la_LDFLAGS = -module
Index: Makefile.manual
===================================================================
RCS file: /cvsroot/playerstage/code/stage/libstage/Makefile.manual,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** Makefile.manual 18 Feb 2008 03:52:30 -0000 1.5
--- Makefile.manual 20 Feb 2008 06:03:58 -0000 1.6
***************
*** 13,16 ****
--- 13,17 ----
gl.cc \
glcolorstack.cc \
+ main.cc \
model.cc \
model_callbacks.cc \
***************
*** 22,26 ****
model_position.cc \
model_props.cc \
- stest.cc \
stage.cc \
typetable.cc \
--- 23,26 ----
***************
*** 30,33 ****
--- 30,35 ----
# blockgrid.cc
+ # stest.cc
+
***************
*** 42,45 ****
--- 44,48 ----
g++ $(CXXFLAGS) -c $<
+
stage: $(OBJ)
g++ $(OBJ) -o $@ $(LIBS)
***************
*** 49,51 ****
demo: gldemo.cc
! g++ gldemo.cc -o $@ $(LIBS)
\ No newline at end of file
--- 52,59 ----
demo: gldemo.cc
! g++ gldemo.cc -o $@ $(LIBS)
!
! ctrl: ctrl.cc
! g++ $(CXXFLAGS) -fPIC -c ctrl.cc
! g++ -shared -o libctrl.so -fPIC ctrl.o
!
Index: stage.hh
===================================================================
RCS file: /cvsroot/playerstage/code/stage/libstage/stage.hh,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** stage.hh 18 Feb 2008 03:52:30 -0000 1.6
--- stage.hh 20 Feb 2008 06:03:58 -0000 1.7
***************
*** 934,938 ****
stg_id_t id;
- //stg_meters_t width, height;
GHashTable* models_by_id; ///< the models that make up the world, indexed
by id
--- 934,937 ----
***************
*** 1009,1014 ****
stg_msec_t interval_real,
double ppm );
- //double width,
- //double height );
virtual ~StgWorld();
--- 1008,1011 ----
***************
*** 1069,1072 ****
--- 1066,1072 ----
stg_usec_t time;
} stg_trail_item_t;
+
+ typedef void ctrlinit_t( StgModel* mod );
+ typedef void ctrlupdate_t( StgModel* mod );
// MODEL CLASS
***************
*** 1155,1158 ****
--- 1155,1159 ----
double* hitx, double* hity );
+
void Map();
void UnMap();
***************
*** 1221,1225 ****
variables) */
char startup, shutdown, load, save, update;
!
public:
--- 1222,1229 ----
variables) */
char startup, shutdown, load, save, update;
!
! ctrlinit_t* initfunc;
! ctrlupdate_t* updatefunc;
!
public:
***************
*** 1238,1241 ****
--- 1242,1248 ----
/** save the state of the model to the current world file */
virtual void Save();
+
+ /** Should be called after all models are loaded, to do any last-minute
setup */
+ void Init();
virtual void PushColor( stg_color_t col )
***************
*** 1249,1253 ****
void Enable(){ disabled = false; };
void Disable(){ disabled = true; };
!
// call this to ensure the GUI window is redrawn
void NeedRedraw();
--- 1256,1263 ----
void Enable(){ disabled = false; };
void Disable(){ disabled = true; };
!
! // Load a control program for this model from an external library
! void LoadControllerModule( char* lib );
!
// call this to ensure the GUI window is redrawn
void NeedRedraw();
Index: canvas.cc
===================================================================
RCS file: /cvsroot/playerstage/code/stage/libstage/canvas.cc,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** canvas.cc 18 Feb 2008 03:52:30 -0000 1.7
--- canvas.cc 20 Feb 2008 06:03:58 -0000 1.8
***************
*** 97,102 ****
glEnable(GL_DITHER);
! //glClearColor ( 0.7, 0.7, 0.8, 1.0);
! glClearColor ( 1,1,1,1 );
if( mod ) // we clicked on a root model
--- 97,102 ----
glEnable(GL_DITHER);
! glClearColor ( 0.7, 0.7, 0.8, 1.0);
! //glClearColor ( 1,1,1,1 );
if( mod ) // we clicked on a root model
***************
*** 340,345 ****
// set gl state that won't change every redraw
! //glClearColor ( 0.7, 0.7, 0.8, 1.0);
! glClearColor ( 1,1,1,1 );
glDisable(GL_LIGHTING);
glEnable (GL_DEPTH_TEST);
--- 340,345 ----
// set gl state that won't change every redraw
! glClearColor ( 0.7, 0.7, 0.8, 1.0);
! //glClearColor ( 1,1,1,1 );
glDisable(GL_LIGHTING);
glEnable (GL_DEPTH_TEST);
***************
*** 423,440 ****
}
// draw the world size rectangle in white, using the polygon offset
// so it doesn't z-fight with the models
! //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
! //glEnable(GL_POLYGON_OFFSET_FILL);
! //glPolygonOffset(1.0, 1.0);
! //glColor3f( 1,1,1 );
! //colorstack.Push(1,1,1);
- glPushMatrix();
-
glScalef( 1.0/world->Resolution(), 1.0/world->Resolution(), 0 );
! //((StgWorldGui*)world)->DrawFloor();
! //glDisable(GL_POLYGON_OFFSET_FILL);
if( (showflags & STG_SHOW_QUADTREE) || (showflags & STG_SHOW_OCCUPANCY) )
--- 423,438 ----
}
+ glPushMatrix();
+
// draw the world size rectangle in white, using the polygon offset
// so it doesn't z-fight with the models
! glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
! glEnable(GL_POLYGON_OFFSET_FILL);
! glPolygonOffset(1.0, 1.0);
glScalef( 1.0/world->Resolution(), 1.0/world->Resolution(), 0 );
! ((StgWorldGui*)world)->DrawFloor();
! glDisable(GL_POLYGON_OFFSET_FILL);
if( (showflags & STG_SHOW_QUADTREE) || (showflags & STG_SHOW_OCCUPANCY) )
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit