chenluhua1980
2026-01-08 d7fbb147a1582e93c3028d8328b2e7eb3736d6e9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#pragma once
#include "SampleBuffer.h"
#include <unordered_map>
#include <memory>
#include <shared_mutex>
#include <string>
#include <atomic>
#include <vector>
 
class BufferManager {
public:
    struct ChannelStat {
        uint32_t id;
        size_t   size;
        int64_t  earliestTs;
        int64_t  latestTs;
    };
 
public:
    BufferManager(uint32_t id, std::string name, RetentionPolicy defaultPolicy = {});
 
    // ±êʶ
    uint32_t id() const { return id_; }
    std::string name() const;
    void rename(const std::string& newName);
 
    // ²É¼¯¿ØÖÆ
    void start();
    void stop();
    bool isRunning() const { return running_.load(); }
    void clearAll();
 
    // Êý¾Ýд¶Á
    void push(uint32_t channelId, int64_t ts_ms, double v);
    std::vector<Sample> getSince(uint32_t channelId, int64_t tsExclusive, size_t maxCount = 4096) const;
    std::vector<Sample> getRange(uint32_t channelId, int64_t from_ts, int64_t to_ts, size_t maxCount = 4096) const;
 
    // ²ßÂÔ
    void setDefaultPolicy(const RetentionPolicy& p, bool applyToExisting = false);
    void setPolicy(uint32_t channelId, const RetentionPolicy& p);
    RetentionPolicy getPolicy(uint32_t channelId) const;
 
    // Í¨µÀ¹ÜÀí
    std::vector<uint32_t> listChannels() const;
 
    // ===== ÐÂÔö£ºÍ¨µÀ£¨ÇúÏߣ©Ãû³Æ =====
    void setChannelName(uint32_t channelId, const std::string& name); // ÉèÖÃ/¸üÐÂ
    std::string getChannelName(uint32_t channelId) const;             // ÈôδÉèÖ㬷µ»Ø "Ch-<id>"
    struct ChannelInfo { uint32_t id; std::string name; };
    std::vector<ChannelInfo> listChannelInfos() const;                // ·½±ã UI Áбí
 
    std::vector<ChannelStat> listChannelStats() const;
    // µ¥¸öͨµÀ
    ChannelStat getChannelStat(uint32_t channelId) const;
private:
    SampleBuffer& getOrCreate(uint32_t channelId);
 
    mutable std::shared_mutex mtx_;
    std::unordered_map<uint32_t, std::unique_ptr<SampleBuffer>> map_;
 
    // ===== ÐÂÔö£ºÍ¨µÀÃû³Æ±í =====
    std::unordered_map<uint32_t, std::string> channelNames_;
 
    uint32_t id_;
    std::string name_;
    RetentionPolicy defPolicy_;
    std::atomic<bool> running_{ false };
 
 
 
 
};