wangzhengquan
2020-06-17 c2aa474e128b4c133786759819463e30d93359a6
time
4个文件已修改
49 ■■■■■ 已修改文件
algorithm/IndirectAlg.c 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test/test_right_walk 补丁 | 查看 | 原始文档 | blame | 历史
test/test_right_walk3 补丁 | 查看 | 原始文档 | blame | 历史
test/test_right_walk3.c 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
algorithm/IndirectAlg.c
@@ -41,13 +41,16 @@
IndirectAlg::IndirectAlg(const initializer_list<Point> & points, const time_t & _keepTime, const Vector2 & _direction): 
    keepTime(_keepTime), direction(_direction), mterminate(false) {
    std::vector<Edge> edges;
    initializer_list<Point>::iterator iter;
    for(iter = points.begin(); iter < points.end(); iter++ ) {
        edges.push_back({*iter, *(iter +1)});
    if (points.size() > 0) {
        std::vector<Edge> edges;
        initializer_list<Point>::iterator iter;
        for(iter = points.begin(); iter < points.end(); iter++ ) {
            edges.push_back({*iter, *(iter +1)});
        }
        edges.push_back({*(points.end()), *(points.begin())});
        frame = Figure(edges);
    }
    edges.push_back({*(points.end()), *(points.begin())});
    frame = Figure(edges);
    mthread = std::thread(std::bind(&IndirectAlg::threadRoutine, this));
@@ -76,14 +79,16 @@
    map<string, Status *>::iterator iter; 
    Status *status = nullptr;
    while (!mterminate.load()) {
       // err_msg(0, "===========thread==========run" );
        std::this_thread::sleep_for(std::chrono::seconds(this->keepTime));
        std::this_thread::sleep_for(std::chrono::seconds(this->keepTime * 2));
        //sleep(this->keepTime);
        for(iter = statusMap.begin(); iter != statusMap.end(); iter++) {
            //cout<<iter->first<<' '<<iter->second<<endl;
            status = iter->second;
            if (status != nullptr) {
                if(time_t(0) - status->lastTime > this->keepTime) {
                // cout<< "iter " << iter->first <<' '<< iter->second <<  status->lastTime << endl;
               // printf("%ld, %ld, %ld\n", time(NULL), status->lastTime, (time(0) - status->lastTime));
                if((time(NULL) - status->lastTime) > this->keepTime) {
                    std::cout << status->id << "脱离监控区, remove from map\n";
                    delete status;
                    statusMap.erase(iter);
                }
@@ -136,16 +141,20 @@
        return false;
    }
    status->lastTime = record.timestamp;
    Vector2 currentDirection = getVecor2(status -> lastCoordinate, record.coordinate);
    if(difftime(record.timestamp, status->lastTime) >= this->keepTime) {
//printf("update lastCoordinate curtime=%ld, lastTime=%ld, diff=%f\n", record.timestamp, status->lastTime, difftime(record.timestamp, status->lastTime));
        status->lastTime = record.timestamp;
        status->lastCoordinate = record.coordinate;
    }
    if (currentDirection.x == 0 && currentDirection.y == 0) {
        //没动
        printRecord(3, record);
        return false;
    }
    status -> lastCoordinate = record.coordinate;
    //status -> lastCoordinate = record.coordinate;
    //逆行判断 cos小于0即两个向量的夹角大于90度,表示逆行了
    if(frame.contains(record.coordinate) && getVector2Angle(direction, currentDirection) <= 0) {
        if(status->firstInvalTime ==0) {
@@ -159,7 +168,7 @@
            status->lastInvalTime = record.timestamp;
//printf("%后续发生逆行的时间=%ld\n", status->lastInvalTime);
            //逆行时间超过keeptime
            if (status->lastInvalTime - status-> firstInvalTime >= keepTime) {
            if (difftime(status->lastInvalTime, status->firstInvalTime) >= keepTime) {
                status->firstValTime = status->lastValTime = 0;
                printRecord(5, record);
                return true;
@@ -170,12 +179,13 @@
    } else {
       
        if(status->firstValTime ==0) {
            //记录第一次正确行走时间
            status->firstValTime = status->lastValTime = record.timestamp;
            printRecord(7, record);
        } else {
            status->lastValTime = record.timestamp;
             //逆行时间超过keeptime
            if (status->lastValTime - status-> firstValTime >= keepTime) {
             //正确行走时间超过keeptime
            if (difftime(status->lastValTime, status->firstValTime) >= keepTime) {
                status->firstInvalTime = status->lastInvalTime = 0;
                printRecord(8, record);
            } 
test/test_right_walk
Binary files differ
test/test_right_walk3
Binary files differ
test/test_right_walk3.c
@@ -105,8 +105,9 @@
    char *targetPointXstr;
    char *targetPointYstr;
//{"x":148,"y":45},{"x":148,"y":539},{"x":769,"y":539},{"x":769,"y":45}
    //{148, 45}, {148, 539},  {769, 539}, {769, 45}
    Record record;
    IndirectAlg indirectAlg((std::initializer_list<Point>){{148, 45}, {148, 539},  {769, 539}, {769, 45} }, 2, {621, 0});
    IndirectAlg indirectAlg((std::initializer_list<Point>){}, 3, {621, 0});
    
    // const char *delim = " ";
    while(fin.getline(line, 1024)) {
@@ -151,10 +152,12 @@
        // printf("key = %s, value=%s\n", key, value);
    }
    fin.close();
    sleep(30);
}
int main() {
    test3();
}