예제 #1
0
void handle_read(struct cloner *cloner)
{
	int ret;
#define OPS(x,y) ((x<<16)|(y&0xffff))
	switch(cloner->cmd->read.ops) {
#ifdef CONFIG_JZ_MMC
	case OPS(MMC,0):
	case OPS(MMC,1):
	case OPS(MMC,2):
		realloc_buf(cloner, ((cloner->cmd->read.length + 0x200) & (~(0x200 - 1))));
		ret = mmc_read_x((cloner->cmd->read.ops & 0xffff),
				cloner->read_req->buf,
				cloner->cmd->read.partation + cloner->cmd->read.offset,
				cloner->cmd->read.length);
		break;
#endif
	default:
		ret = clmg_read(cloner);
		break;
	}

	if (ret < 0)
		cloner->ack = ret;
	else
		cloner->ack = 0;
	if (cloner->args->transfer_data_chk)
		cloner->crc = local_crc32(0xffffffff, cloner->read_req->buf, cloner->cmd->read.length);
	//printf("handle read cloner->crc %x\n", cloner->crc);

	/*always transfer data*/
	cloner->read_req->length = cloner->cmd->read.length;
	//usb_ep_queue(cloner->ep_in, cloner->read_req, 0);
#undef OPS
}
예제 #2
0
int handle_check(struct cloner *cloner)
{
	unsigned int buf[128];
	int ret = 0, check_buf = 0;
#define OPS(x,y) ((x<<16)|(y&0xffff))
	switch(cloner->cmd->read.ops) {
#ifdef CONFIG_JZ_MMC
	case OPS(MMC,0):
	case OPS(MMC,1):
	case OPS(MMC,2):
		ret = mmc_read_x((cloner->cmd->check.ops & 0xffff), buf,
				cloner->cmd->check.partation + cloner->cmd->check.offset,
				512);
		check_buf = buf[0];
		break;
#endif
	default:
		ret = clmg_check(cloner);
		break;
	}

	if (!ret && check_buf == cloner->cmd->check.check)
		return 0;
	else
		return -EINVAL;
#undef OPS
}
예제 #3
0
//int http_post(char* url, char* data)
void http_callback(void *data)
{
    OPS("### @ API : Callback - Thread[%d]", pthread_self());
    // struct data
    apiclient* apis = (void**)data;
    char *post;
    NEW(post, HTTP_POST_SIZE);
    strcpy(post, apis->data);
    pthread_mutex_unlock(&apis->mxlock);
    // apply memory
	char *host_name, *uri, *header, *next;
	NEW(host_name, 32);
	NEW(uri, 101);
	//get host name
    next = mid_value( apis->APICallback, "//", "/", host_name, 31 );
	next = mid_value( next, "/", NULL, uri, 100 );
	DEL(next);
	//connect
	int http_sock = qqsocket_create( TCP, NULL, 0 );
	//printf(http_sock);
	if( http_sock <= 0 )
    {
        DEL(host_name);
        DEL(uri);
        OPS("### @ API : Callback Connect Server Error.");
        return;
    }
	NEW( header, KB(4) );
	qqsocket_connect( http_sock, host_name, 80 );
	sprintf( header,
        "POST /%s HTTP/1.1\r\n"
        "HOST: %s\r\n"
        "User-Agent: QQRobot.APIServer.Agent\r\n"
        "X-Powered-By: %s\r\n"
        "Content-Type: application/x-www-form-urlencoded\r\n"
        "Content-Length: %d\r\n\r\n"
        "%s"
        , uri, host_name, "*****@*****.**", strlen(post), post );
    DEL(post);
    DEL(host_name);
    DEL(uri);
    // Test
    DBG("\n###HTTP POST\n%s\n########\n", header);
	qqsocket_send( http_sock, (uchar*)header, strlen(header) );
	DEL(header);
	char *response;
	NEW(response, KB(4));
	qqsocket_recv( http_sock, (uchar*)response, KB(4) );
    char *result;
    NEW(result, 1024);
    mid_value(response, "<result>", "</result>", result, 1024);
    OPS("### @ API : Callback Result : %s", result);
    DEL(response);
    DEL(result);
    qqsocket_close( http_sock );
    //DEL(http_sock);
	pthread_detach(pthread_self());
}
예제 #4
0
static void _svoGNGInit(svo_gng_t *gng)
{
    const void *is;
    svo_gng_node_t *n1 = NULL, *n2 = NULL;
    size_t i;
    bor_real_t maxbeta;

    gng->cycle = 1L;

    // initialize error heap
    if (gng->err_heap)
        borPairHeapDel(gng->err_heap);
    gng->err_heap = borPairHeapNew(errHeapLT, (void *)gng);

    // precompute beta^n
    if (gng->beta_n)
        BOR_FREE(gng->beta_n);
    gng->beta_n = BOR_ALLOC_ARR(bor_real_t, gng->params.lambda);
    gng->beta_n[0] = gng->params.beta;
    for (i = 1; i < gng->params.lambda; i++){
        gng->beta_n[i] = gng->beta_n[i - 1] * gng->params.beta;
    }

    // precompute beta^(n * lambda)
    if (gng->beta_lambda_n)
        BOR_FREE(gng->beta_lambda_n);

    maxbeta = gng->beta_n[gng->params.lambda - 1];

    gng->beta_lambda_n_len = 1000;
    gng->beta_lambda_n = BOR_ALLOC_ARR(bor_real_t, gng->beta_lambda_n_len);
    gng->beta_lambda_n[0] = maxbeta;
    for (i = 1; i < gng->beta_lambda_n_len; i++){
        gng->beta_lambda_n[i] = gng->beta_lambda_n[i - 1] * maxbeta;
    }


    if (gng->ops.init){
        OPS(gng, init)(&n1, &n2, OPS_DATA(gng, init));
    }else{
        is = OPS(gng, input_signal)(OPS_DATA(gng, input_signal));
        n1 = OPS(gng, new_node)(is, OPS_DATA(gng, new_node));

        is = OPS(gng, input_signal)(OPS_DATA(gng, input_signal));
        n2 = OPS(gng, new_node)(is, OPS_DATA(gng, new_node));
    }

    nodeAdd(gng, n1);
    nodeAdd(gng, n2);
    edgeNew(gng, n1, n2);
}
예제 #5
0
void http_send_file(int sock, char *file)
{
    FILE *fp;
    fp = fopen(file, "rb");
    if( fp != NULL )
    {
        OPS("### @ HTTP : Send File : %s", file);
        // header
        char *http;
        NEW(http, 256);
        //memset(http, 0, 128);
        strcat(http, "HTTP/1.1 200 OK\r\n");
        strcat(http, "Content-Type: image/png\r\n");
        strcat(http, "\r\n");
        // send
        send(sock, http, strlen(http), 0);
        // body
        char *buffer;
        NEW(buffer, 512);
        while( !feof(fp) )
        {
            fread(buffer, 512, 1, fp);
            send(sock, buffer, 512, 0);
        }
        fclose(fp);
        // Close
        shutdown(sock, SD_BOTH);
        closesocket(sock);
        // Clear
        DEL(http);
        DEL(buffer);
        //DEL(sock);
        //DEL(fp);
     }
     else
     {
         OPS("### @ HTTP : File Not Found : %s", file);
         //DEL(sock);
         DEL(fp);
         http_send(sock, "FILE NOT FOUND");
     }
}
예제 #6
0
void http_send(int sock, char *message)
{
    OPS("### @ HTTP : Send Message: %s", message);
    // build
    char *http;
    NEW(http, 1024);
    //memset(http, 0, 1024);
    strcat(http, "HTTP/1.1 200 OK\r\n");
    strcat(http, "Content-Type: text/html\r\n");
    strcat(http, "\r\n");
    strcat(http, message);
    // Send
    send(sock, http, strlen(http), 0);
    // Close
    shutdown(sock, SD_BOTH);
    closesocket(sock);
    // Clear
    DEL(http);
    //DEL(sock);
}
예제 #7
0
void handle_write(struct usb_ep *ep,struct usb_request *req)
{
	struct cloner *cloner = req->context;

	if(req->status == -ECONNRESET) {
		cloner->ack = -ECONNRESET;
		return;
	}

	if (req->actual != req->length) {
		printf("write transfer length is err,actual=%08x,length=%08x\n",req->actual,req->length);
		cloner->ack = -EIO;
		return;
	}

	if(cloner->cmd_type == VR_UPDATE_CFG) {
		cloner->ack = 0;
		return;
	}

	if (cloner->args->transfer_data_chk) {
		uint32_t tmp_crc = local_crc32(0xffffffff,req->buf,req->actual);
		if (cloner->cmd->write.crc != tmp_crc) {
			printf("crc is errr! src crc=%08x crc=%08x\n",cloner->cmd->write.crc,tmp_crc);
			cloner->ack = -EINVAL;
			return;
		}
	}
#define OPS(x,y) ((x<<16)|(y&0xffff))
	switch(cloner->cmd->write.ops) {
		case OPS(I2C,RAW):
			cloner->ack = i2c_program(cloner);
			break;
#ifdef CONFIG_JZ_NAND_MGR
		case OPS(NAND,IMAGE):
			cloner->ack = nand_program(cloner);
			break;
#endif
#ifdef CONFIG_MTD_NAND_JZ
		case OPS(NAND, MTD_RAW):
			cloner->ack = nand_mtd_raw_program(cloner);
			break;
		case OPS(NAND, MTD_UBI):
			cloner->ack = nand_mtd_ubi_program(cloner);
			break;
#endif
#ifdef CONFIG_JZ_MMC
		case OPS(MMC,0):
		case OPS(MMC,1):
		case OPS(MMC,2):
			cloner->ack = mmc_program(cloner,cloner->cmd->write.ops & 0xffff);
			break;
#endif
#ifdef CONFIG_CMD_EFUSE
		case OPS(EFUSE,RAW):
			cloner->ack = efuse_program(cloner);
			break;
#endif
		case OPS(SPI_NOR,RAW):
			cloner->ack = spi_program(cloner);
			break;
#ifdef CONFIG_MTD_SPINAND
		case OPS(SPI_NAND,RAW):
			cloner->ack = spinand_program(cloner);
			break;
#endif
#ifdef CONFIG_JZ_SFC
		case OPS(SFC_NOR,RAW):
			cloner->ack = sfc_program(cloner);
			break;
#endif
#ifdef CONFIG_MTD_SFCNAND
		case OPS(SFC_NAND,RAW):
			cloner->ack = spinand_program(cloner);
			break;
#endif
		case OPS(MEMORY,RAW):
			cloner->ack = 0;
			break;
		case OPS(REGISTER,RAW):
			{
				volatile unsigned int *tmp = (void *)cloner->cmd->write.partation;
				if((unsigned)tmp > 0xb0000000 && (unsigned)tmp < 0xb8000000) {
					*tmp = *((int*)cloner->write_req->buf);
					cloner->ack = 0;
				} else {
					printf("OPS(REGISTER,RAW): not supported address.");
					cloner->ack = -ENODEV;
				}
			}
			break;
		default:
			cloner->ack = clmg_write(cloner);
	}
#undef OPS
}
예제 #8
0
void APISelect(void *data)
{
    OPS("### @ API : Accept Success - Thread[%d]", pthread_self());
    // struct data
    qqclient* qq = ((void**)data)[0];
    qq->api_select_count ++ ;
    apiclient* apis = ((void**)data)[1];
    int client = apis->sock;
    pthread_mutex_unlock(&apis->mxsock);
    // Request
    char *buffer;
    NEW(buffer, REQUEST_BUFFER);
    // Select 模型读取请求
    fd_set fdRead;
    struct timeval fdRTV = {1, 0};

    FD_ZERO(&fdRead);
    FD_SET(client, &fdRead);
    switch ( select(client, &fdRead, NULL, NULL, &fdRTV) )
    {
        default:
        if ( FD_ISSET(client, &fdRead) )
        {
            recv(client, buffer, REQUEST_BUFFER, 0);
        }
    }

    if ( strlen(buffer) < 9 )
    {
        OPS("### @ API : Request Unavailable.");
        DEL(buffer);
        return;
    }

    // Request Test
    DBG("##### Request Begin #####\n%s\n##### Request End #####\n", buffer);

    char *http;
    NEW(http, 16);
    mid_value(buffer, "GET ", " HTTP/1.1", http, 16);
    if ( strstr(http, "/v?") >0 )
    {
        // 验证码读取
        char *uid, *file;
        NEW(uid, 18);
        NEW(file, 32);
        if ( strstr(http, "&") > 0 )
        {
            mid_value(http, "/v?", "&", uid, 18);
        }
        else
        {
            mid_value(http, "/v?", NULL, uid, 18);
        }
        sprintf(file, "./verify/%s.png", uid);
        http_send_file(client, file);
        DEL(uid);
        DEL(file);
        DEL(http);
        DEL(buffer);
        return;
    }
    else if ( strstr(http, "/send?") > 0 )
    {
        // 发送自定义信息
        char *msg;
        NEW(msg, REQUEST_BUFFER);
        mid_value(buffer, "GET /send?", " HTTP/1.1", msg, REQUEST_BUFFER);
        api_callback_build("http.send", msg);
        DEL(msg);
        http_send(client, "Message Sends OK.");
        DEL(http);
        DEL(buffer);
        return;
    }
    else if ( strlen(http) > 0 )
    {
        http_send(client, "QQRobot API Server.");
        DEL(http);
        DEL(buffer);
        return;
    }
    DEL(http);

    char *api;
    NEW(api, API_BUFFER);
    mid_value(buffer, "API ", " MOYO/1.1", api, API_BUFFER);
    if (strlen(api) == 0)
    {
        http_send(client, "API IS EMPTY");
        DEL(api);
        DEL(buffer);
        return;
    }

    // API Commands
    char *response;
    NEW(response, RESPONSE_BUFFER);
    // Check SecKey
    char *seckey;
    NEW(seckey, 255);
    mid_value(buffer, "<seckey>", "</seckey>", seckey, 255);
    if ( strcmp(apis->APISeckey, seckey)!=0 )
    {
        strcat(response, "ACCESS DENIED");
        OPS("### @ API : Denied of : %s", api);
        DEL(seckey);
        goto API_RESPONSE;
    }
    DEL(seckey);
    // API Runs
    OPS("### @ API : Command of : %s ...Runs ...", api);
    // ##### API of login #####
    if ( stricmp(api, "login.create")==0 )
    {
        char *uid, *password;
        NEW(uid, 10);
        NEW(password, 32);
        mid_value(buffer, "<uid>", "</uid>", uid, 10);
        mid_value(buffer, "<password>", "</password>", password, 32);
        strcat(response, myqq_login(atoi(uid), password));
        //printf("Done of %s.\n", api);
        DEL(uid);
        DEL(password);
    }
    else if ( stricmp(api, "login.destroy")==0 )
    {
        strcat(response, myqq_logout());
        //printf("Done of %s.\n", api);
    }
    else if ( stricmp(api, "login.verify")==0 )
    {
        char *vcode;
        NEW(vcode, 4);
        mid_value(buffer, "<verify>", "</verify>", vcode, 4);
        if ( qq->process == P_VERIFYING )
        {
            qqclient_verify(qq, vcode);
            OPS("### @ API : [Input] Verify Code : %s", vcode);
            strcat(response, myqq_resume_login());
        }
        else
        {
            strcat(response, "DONT NEED");
        }
        //printf("Done of %s.\n", api);
        DEL(vcode);
    }
    else if ( stricmp(api, "login.check")==0 )
    {
        strcat(response, myqq_check_login(qq));
        //printf("Done of %s.\n", api);
    }
    // ##### API of buddy #####
    else if ( stricmp(api, "buddy.name")==0 )
    {
        char *uid;
        NEW(uid, 10);
        mid_value(buffer, "<uid>", "</uid>", uid, 10);
        strcat(response, myqq_get_buddy_name(qq, atoi(uid)));
        //printf("Done of %s.\n", api);
        DEL(uid);
    }
    else if ( stricmp(api, "buddy.send")==0 )
    {
        char *uid, *message;
        NEW(uid, 10);
        NEW(message, SEND_MESSAGE_SIZE);
        mid_value(buffer, "<uid>", "</uid>", uid, 10);
        mid_value(buffer, "<message>", "</message>", message, SEND_MESSAGE_SIZE);
        if ( myqq_send_im_to_buddy(qq, atoi(uid), message, 0) )
        {
            strcat(response, "SEND FAILED");
        }
        else
        {
            strcat(response, "SEND SUCCESS");
        }
        //printf("Done of %s.\n", api);
        DEL(uid);
        DEL(message);
    }
    else if ( stricmp(api, "buddy.info")==0 )
    {
        char *uid;
        NEW(uid, 10);
        mid_value(buffer, "<uid>", "</uid>", uid, 10);
        char *info;
        NEW(info, KB(4));
        myqq_get_buddy_info(qq, atoi(uid), info, KB(4));
        strcat(response, info);
        //printf("Done of %s.\n", api);
        DEL(uid);
        DEL(info);
    }
    else if ( stricmp(api, "buddy.list")==0 )
    {
        char *online;
        NEW(online, 3);
        mid_value(buffer, "<online>", "</online>", online, 3);
        char *info;
        NEW(info, BUDDY_BUF_SIZE);
        if ( stricmp(online, "yes")==0 )
        {
            myqq_get_buddy_list(qq, info, BUDDY_BUF_SIZE, 1);
        }
        else
        {
            myqq_get_buddy_list(qq, info, BUDDY_BUF_SIZE, 0);
        }
        strcat(response, info);
        //printf("Done of %s.\n", api);
        DEL(online);
        DEL(info);
    }
    // ##### API of qun #####
    else if ( stricmp(api, "qun.name")==0 )
    {
        char *gid;
        NEW(gid, 10);
        mid_value(buffer, "<gid>", "</gid>", gid, 10);
        strcat(response, myqq_get_qun_name(qq, atoi(gid)));
        //printf("Done of %s.\n", api);
        DEL(gid);
    }
    else if ( stricmp(api, "qun.send")==0 )
    {
        char *gid, *message;
        NEW(gid, 10);
        NEW(message, SEND_MESSAGE_SIZE);
        mid_value(buffer, "<gid>", "</gid>", gid, 10);
        mid_value(buffer, "<message>", "</message>", message, SEND_MESSAGE_SIZE);
        if ( myqq_send_im_to_qun(qq, atoi(gid), message, 0) )
        {
            strcat(response, "SEND FAILED");
        }
        else
        {
            strcat(response, "SEND SUCCESS");
        }
        //printf("Done of %s.\n", api);
        DEL(gid);
        DEL(message);
    }
    else if ( stricmp(api, "qun.buddy.name")==0 )
    {
        char *gid, *uid;
        NEW(gid, 10);
        NEW(uid, 10);
        mid_value(buffer, "<gid>", "</gid>", gid, 10);
        mid_value(buffer, "<uid>", "</uid>", uid, 10);
        strcat(response, myqq_get_qun_member_name(qq, atoi(gid), atoi(uid)));
        //printf("Done of %s.\n", api);
        DEL(gid);
        DEL(uid);
    }
    else if ( stricmp(api, "qun.info")==0 )
    {
        char *gid;
        NEW(gid, 10);
        mid_value(buffer, "<gid>", "</gid>", gid, 10);
        char *info;
        NEW(info, KB(4));
        myqq_get_qun_info(qq, atoi(gid), info, KB(4));
        strcat(response, info);
        //printf("Done of %s.\n", api);
        DEL(gid);
        DEL(info);
    }
    else if ( stricmp(api, "qun.list")==0 )
    {
        char *info;
        NEW(info, QUN_BUF_SIZE);
        myqq_get_qun_list(qq, info, QUN_BUF_SIZE);
        strcat(response, info);
        //printf("Done of %s.\n", api);
        DEL(info);
    }
    else if ( stricmp(api, "qun.buddy.list")==0 )
    {
        char *gid, *online;
        NEW(gid, 10);
        NEW(online, 3);
        mid_value(buffer, "<gid>", "</gid>", gid, 10);
        mid_value(buffer, "<online>", "</online>", online, 3);
        char *info;
        NEW(info, BUDDY_BUF_SIZE);
        if ( stricmp(online, "yes")==0 )
        {
            myqq_get_qun_member_list(qq, atoi(gid), info, BUDDY_BUF_SIZE, 1);
        }
        else
        {
            myqq_get_qun_member_list(qq, atoi(gid), info, BUDDY_BUF_SIZE, 0);
        }
        strcat(response, info);
        //printf("Done of %s.\n", api);
        DEL(gid);
        DEL(online);
        DEL(info);
    }
    // ##### API of me #####
    else if ( stricmp(api, "me.sleep")==0 )
    {
        char *power;
        NEW(power, 3);
        mid_value(buffer, "<power>", "</power>", power, 3);
        if ( strcmp(power, "on")==0 )
        {
            apis->APISleep = 1;
        }
        else
        {
            apis->APISleep = 0;
        }
        strcat(response, "SWITCH SUCCESS");
        //printf("Done of %s.\n", api);
        DEL(power);
    }
    else if ( stricmp(api, "me.list.update")==0 )
    {
        qun_update_all(qq);
        buddy_update_list(qq);
        group_update_list(qq);
        if ( qqclient_wait(qq, 10)<0 )
        {
            strcat(response, "UPDATE FAILED");
        }
        else
        {
            strcat(response, "UPDATE SUCCESS");
        }
        //printf("Done of %s.\n", api);
    }
    else if ( stricmp(api, "me.autoreply")==0 )
    {
        char *power;
        NEW(power, 3);
        mid_value(buffer, "<power>", "</power>", power, 3);
        if ( strcmp(power, "on")==0 )
        {
            myqq_auto_reply(1);
        }
        else
        {
            myqq_auto_reply(0);
        }
        strcat(response, "SWITCH SUCCESS");
        //printf("Done of %s.\n", api);
        DEL(power);
    }
    else if ( stricmp(api, "me.status.update")==0 )
    {
        char *status;
        NEW(status, 6);
        mid_value(buffer, "<status>", "</status>", status, 6);
        if( strcmp( status, "away") == 0 )
            qqclient_change_status( qq, QQ_AWAY );
        else if( strcmp( status, "online") == 0 )
            qqclient_change_status( qq, QQ_ONLINE );
        else if( strcmp( status, "hidden") == 0 )
            qqclient_change_status( qq, QQ_HIDDEN );
        else if( strcmp( status, "killme") == 0 )
            qqclient_change_status( qq, QQ_KILLME );
        else if( strcmp( status, "busy") == 0 )
            qqclient_change_status( qq, QQ_BUSY );
        strcat(response, "UPDATE SUCCESS");
        //printf("Done of %s.\n", api);
        DEL(status);
    }
    else if ( stricmp(api, "me.buddy.add")==0 )
    {
        char *uid, *message;
        NEW(uid, 10);
        NEW(message, 50);
        mid_value(buffer, "<uid>", "</uid>", uid, 10);
        mid_value(buffer, "<message>", "</message>", message, 50);
        qqclient_add(qq, atoi(uid), message);
        strcat(response, "ADD SUCCESS");
        //printf("Done of %s.\n", api);
        DEL(uid);
        DEL(message);
    }
    else if ( stricmp(api, "me.buddy.del")==0 )
    {
        char *uid;
        NEW(uid, 10);
        mid_value(buffer, "<uid>", "</uid>", uid, 10);
        qqclient_del(qq, atoi(uid));
        strcat(response, "DELETE SUCCESS");
        //printf("Done of %s.\n", api);
        DEL(uid);
    }
    else
    {
        strcat(response, "UNKNOWN API COMMAND");
        OPS("### @ API : Command Unknown : %s", api);
    }
API_RESPONSE:
    // Send
    send(client, response, strlen(response), 0);

    // print
    OPS("### @ API : Command of : %s ...Done.", api);

    // Response Test
    DBG("##### Response Begin #####\n%s\n##### Response End #####\n", response);
    // Close
    shutdown(client, SD_BOTH);
    closesocket(client);
    // Clear
    DEL(response);
    //DEL(client);
    pthread_detach(pthread_self());
}
예제 #9
0
static void _svoGNGLearn(svo_gng_t *gng, size_t step)
{
    const void *input_signal;
    bor_net_node_t *nn;
    svo_gng_node_t *n1, *n2, *n;
    bor_net_edge_t *nedge;
    svo_gng_edge_t *edge;
    bor_real_t dist2;
    bor_list_t *list, *item, *item_tmp;

    // 1. Get input signal
    input_signal = OPS(gng, input_signal)(OPS_DATA(gng, input_signal));

    // 2. Find two nearest nodes to input signal
    OPS(gng, nearest)(input_signal, &n1, &n2, OPS_DATA(gng, nearest));

    // 3. Create connection between n1 and n2 if doesn't exist and set age
    //    to zero
    nedge = borNetNodeCommonEdge(&n1->node, &n2->node);
    if (!nedge){
        edge = edgeNew(gng, n1, n2);
    }else{
        edge = bor_container_of(nedge, svo_gng_edge_t, edge);
    }
    edge->age = 0;

    // 4. Increase error counter of winner node
    dist2 = OPS(gng, dist2)(input_signal, n1, OPS_DATA(gng, dist2));
    nodeIncError(gng, n1, dist2 * gng->beta_n[gng->params.lambda - step]);

    // 5. Adapt nodes to input signal using fractions eb and en
    // + 6. Increment age of all edges by one
    // + 7. Remove edges with age higher than age_max
    OPS(gng, move_towards)(n1, input_signal, gng->params.eb,
                           OPS_DATA(gng, move_towards));
    // adapt also direct topological neighbors of winner node
    list = borNetNodeEdges(&n1->node);
    BOR_LIST_FOR_EACH_SAFE(list, item, item_tmp){
        nedge = borNetEdgeFromNodeList(item);
        edge  = bor_container_of(nedge, svo_gng_edge_t, edge);
        nn   = borNetEdgeOtherNode(&edge->edge, &n1->node);
        n    = bor_container_of(nn, svo_gng_node_t, node);

        // increase age (6.)
        edge->age += 1;

        // remove edge if it has age higher than age_max (7.)
        if (edge->age > gng->params.age_max){
            edgeDel(gng, edge);

            if (borNetNodeEdgesLen(nn) == 0){
                // remove node if not connected into net anymore
                nodeRemove(gng, n);
                n = NULL;
            }
        }

        // move node (5.)
        if (n){
            OPS(gng, move_towards)(n, input_signal, gng->params.en,
                OPS_DATA(gng, move_towards));
        }
    }